
Vladimir
09.03.2018
08:06:09

Anatoly
09.03.2018
08:06:12
а тут чот странное, типа есть база какая-то, надо по ней гулять и отправлять сообщения
и может быть что-то еще

Vladimir
09.03.2018
08:07:26
Но в любом случае, я бы сделал канал из которого бы читал юзеров сразу и слал бы через что там хочется, а мапу бы не трогал

Google

Anatoly
09.03.2018
08:07:36
так это по другому делается. Если уж так тупо. То добавляешь в базу юзера и кладешь в _очередь_ задачу отправить сообщение, после чего вэйкапишь воркера
ну конечно иначе)
redis например )
подписываешь клиента на изменения и все, они автоматически получат инфу о новой записи
можно и самому реализовать

Vladimir
09.03.2018
08:08:42
И будет ок

Anatoly
09.03.2018
08:08:52
но ходить часами по структуре данных, это конеш не очень

Daniel
09.03.2018
08:08:53
redis - то еще дерьмо. эта фича у него, конечно, суперская, но недостатков полно.
так, на всякий случай

Anatoly
09.03.2018
08:09:09

m
09.03.2018
08:09:23
а почему в качестве решения выбрано посылать один месседж в секунду?
В секунду или в минуту, интервал потом подберу.
Мне важно на нодах держать более-менее последнее состояние с информацией о юзерах. Устаревшее состояние тоже ок, если это единичные случаи. И если вдруг какая-то нода упала и поднялась, залить в неё постепенно это состояние.

Никита
09.03.2018
08:09:25

Google

Anatoly
09.03.2018
08:09:36
реди может просто хранить, если надо пижже транспорт -> rabbitMQ

Ilnur
09.03.2018
08:09:45
а почему обходить надо в случайном порядке?

Anatoly
09.03.2018
08:10:00
потомучто мапа по другому не умеет

m
09.03.2018
08:10:10
ради одной этой проблемы городить редис, БД и прочее не вижу никакого смысла. Всё только на Go и в памяти.

Daniel
09.03.2018
08:10:37

Vladimir
09.03.2018
08:10:56
Очередь на каналах
Будет работать лучше чем обход мапы

m
09.03.2018
08:11:25
Вот я очень не хотел, чтобы обсуждение съехало в сторону от исходного вопроса. А оно таки съехало.

Anatoly
09.03.2018
08:11:32

Daniel
09.03.2018
08:11:36
я бы хотел заметить, что 1М секунд - это больше 10 дней

Anatoly
09.03.2018
08:11:54

m
09.03.2018
08:11:59
Ну значит пачками по 1000 юзеров.

Vladimir
09.03.2018
08:12:19

m
09.03.2018
08:12:50
никаких гарантий. отправилось - хорошо. не отправилось - не страшно, потом отправится.

Ilnur
09.03.2018
08:12:51

Vladimir
09.03.2018
08:13:12

Daniel
09.03.2018
08:13:46
Ну значит пачками по 1000 юзеров.
на самом деле, конечно, совсем не так.
1. есть способ пропихнуть в стартующий сервис все состояние. обычно это субд, но можно и от сервиса наладить отправку.
2. на каждое изменение отправляется пакет всем нодам.
обход мапы тут нужен только на этапе 1, и он должен быть максимально быстрый

m
09.03.2018
08:14:39

Daniel
09.03.2018
08:15:12
это ответ "не важно", как мы понимаем

Google

m
09.03.2018
08:15:25

xPushkin
09.03.2018
08:15:35
Что это за система такая..

Daniel
09.03.2018
08:16:11
недетерминированная!
это, видимо, игра типа "найди и воспроизведи баг"

m
09.03.2018
08:16:27
это ответ "не важно", как мы понимаем
не так. если не важно, то можно и одного юзера отправить и ок. А мне нужно именно так сделать, чтобы алгоритм старался по возможности всех отправить.

Vladimir
09.03.2018
08:16:40

m
09.03.2018
08:17:03

Vladimir
09.03.2018
08:17:05
И ты ещё получишь замечательную задачу - следить за тем кто отправился

Daniel
09.03.2018
08:17:34

m
09.03.2018
08:18:26
результат отличный, ибо выходит система не зависящая от падения любого числа нод.
одной ноды достаточно для работы.
и никаких Бд с их репликациями, бэкапами...

Daniel
09.03.2018
08:19:29
хорошо бы все же предусмотреть гарантии того, что система приходит в консистентное состояние за конечное время

Daniel
09.03.2018
08:19:55
именно эту задачу решают БД с их репликациями и бекапами

xPushkin
09.03.2018
08:20:11

Anatoly
09.03.2018
08:20:31
уже пришли к моему решению или еще подождать сотню коментов?)

Sergey
09.03.2018
08:20:42
"базы данных это сложно, поэтому я решил сделать свою базу данных без базы данных"

Anatoly
09.03.2018
08:20:49
лол)

Ilnur
09.03.2018
08:20:59

m
09.03.2018
08:21:02
Отчего же минутами. Упал канал у провайдера. Там и дни могут быть, как вот Битрикс страдал недавно...

Vladimir
09.03.2018
08:21:21

Google

Anatoly
09.03.2018
08:21:24

Vladimir
09.03.2018
08:21:40
Кроме того что никогда не гарантирует консистентность

Ilnur
09.03.2018
08:21:54
ну это по идее самое очевидное решение и логичное

Anatoly
09.03.2018
08:22:03
ну так о чем и речь

m
09.03.2018
08:22:12

Vladimir
09.03.2018
08:22:16

Anatoly
09.03.2018
08:22:28
обход ляма объектов это не правильно
и секунда пади еще задержка на отправку ?))
откуда эта секунда

xPushkin
09.03.2018
08:23:09

Admin
ERROR: S client not available

Anatoly
09.03.2018
08:23:16
секунда это бесконечность )

m
09.03.2018
08:23:31
Блохчейн - это свежая мысль. Ага.
Думал прикрутить ещё машин лёнинг.
и пусть он решает, как мэпу обойти.

Anatoly
09.03.2018
08:24:46
да на этом можно степень защитить
все так делают!

Vladimir
09.03.2018
08:25:08
@MichaelMonashev так чем плохо решение с очередью изменений отдельной от мапы?

m
09.03.2018
08:25:10
будь как все!

Anatoly
09.03.2018
08:25:29

Google

Anatoly
09.03.2018
08:25:42
и не очередь! прекрати ее так называть

m
09.03.2018
08:25:45

Anatoly
09.03.2018
08:26:56
сё, я пас

Ilnur
09.03.2018
08:26:57
так можно для этого научить ноду когда она поднимация запрашивать весь стейт

Vladimir
09.03.2018
08:27:04

m
09.03.2018
08:27:25
это вариант конечно.

Anatoly
09.03.2018
08:27:26
засранец!

xPushkin
09.03.2018
08:27:57

Sergey
09.03.2018
08:28:14

m
09.03.2018
08:33:14
я вот подумал, а можно ли for k,v:=range map{ обложить локом и анлоком?

Александр
09.03.2018
08:34:14
а нахрен?

Arch
09.03.2018
08:35:06

m
09.03.2018
08:35:12
т.е. что-то вроде
users.RLock()
for user, props:=range users.map {
users.RUnlock()
// тут что-то делаем
time.Sleep(time.Minute)
users.RLock()
}
users.RUnlock()

Arch
09.03.2018
08:35:57
юзай в юзере sync.RWmutex

xPushkin
09.03.2018
08:36:17

m
09.03.2018
08:37:11
это позволит итерироваться с паузами не по снэпшоту (как в sync.Map), а по текущему map-у

Arch
09.03.2018
08:38:19

m
09.03.2018
08:38:54
потому что в снэпшоте старые данные.

Vladimir
09.03.2018
08:39:58

m
09.03.2018
08:40:50
я не вижу смысла отправлять старые данные, если можно придумать, как отправлять свежие.

Sergey
09.03.2018
08:41:07
давайте прикрутим к map MVCC и транзакции
и всё ещё будем говорить, что базы данных сложные