169 похожих чатов

Ребята, а какой всё-таки идеологически верный вариант работы с очередями

у нас? если нужно, чтобы задания жили при перезапуске сервера?

13 ответов

17 просмотров

Мне недавно такая идея пришла в голову: хранить стейт в самом процессе (например, Agent), а при остановке процесса (при перезапуске) сериализировать и выгружать, например, в базу данных. При запуске инициализировать из базы данных. Есть в этом смысл, или я чего-то не учитываю?

Max Gorin
Мне недавно такая идея пришла в голову: хранить ст...

Потом придёт мысль сохранять только при изменении стейта. Потом ещё, ещё, и получится в итоге глючная самописная СУБД

V
Потом придёт мысль сохранять только при изменении ...

"Потом придёт мысль сохранять только при изменении стейта." -> тут же перескочу на что-нибудь внешнее, но пока исходное условие в том, что это не требуется

Max Gorin
Мне недавно такая идея пришла в голову: хранить ст...

Я так делал, работало сносно. Сейчас думаю, что все что касается консьюминга данных и того что нельзя терять - писать в персистентную очередь (eg rabbitmq). Получается проще, понятней и с масштабированием из коробки

Max Gorin
Мне недавно такая идея пришла в голову: хранить ст...

Не очень понятно какая проблема решается. Если остановка штатная то зачем что-то сохранять а не дать процессу доработать? Если нештатная то всё равно потеряются данные.

Aleksey @cheatex
Не очень понятно какая проблема решается. Если ост...

спасибо за вопросы, они мне прояснили, что действительно не понятно, какая проблема решается. Изначально я думал о задаче, чтобы пре деплойменте не терялся стейт игр, которые ведутся на сайте (и в этом случае дать процессам доработать - не вариант). Но с другой стороны, если я останавливаю игру до перезапуска процесса, то... это неправильно). Игра должна продолжать идти на дополнительном node, а значит, эти ноды должны все равно шарить стейт, и какой-нибудь редис (или что-то подобное) в этом случае, в который стейт обновляется незамедлительно - единственный способ не прерывать игру. Так что моя идея оказывается все же неработающей (или как-минимум с более ограниченным применением, чем я подумал изначально).

Max Gorin
спасибо за вопросы, они мне прояснили, что действи...

Вообще, я могу тебя поздравить и поприветствовать в увлекательном мире персистентных акторов. Дисклеймер - мы делаем процессинг платежей, поэтому я могу немного серьезнее воспринимать тему, чем это осмысленно для тебя. Вариантов в целом немного, коммит в хранилище на каждом шаге, может быть с какими-то оптимизациями - типа, коммит не на каждом шаге плюс шардинг, чтобы вообще иметь возможность держать стейты в памяти. К библиотечным решениям(gen-server, gen-statem, Agent) привязываться я не рекомендую, они работают только в самых простых случаях, по мере усложнения кода начинают ставить палки в колёса, и сверх этого делают твой сервис stateful, а это сразу превращает горизонтальное масштабирование в изысканное развлечение для тонких ценителей. Мой последний подход к снаряду выглядит как очень минималистичная версия gen_statem, где и за персистенс, и за таймеры, и за выставление меты логгера отвечает общий код, а бизнесовый просто отдаёт ему команды на каждом шаге. В такой реализации сильно проще тестить бизнес-логику, потому что можно подсунуть фейковый интерпретатор. Особенно это хорошо, когда в логике начинается работа с таймерами - в версии с таймерами gen_statem до сих пор иногда валятся тесты из-за race conditions. Когда дойдёт до масштабирования, шардинг лучше делать по внешнему идентификаторы актора(типа, id чата, в котором идёт игра) и неплохо бы реализовывать на уровне роутинга входящих сообщений и внешними средствами, когда есть такая возможность. Отдельная очередь событий на каждый шард, и внутренние события, типа таймеров, должны так же проходить через неё, иначе можно попасть в грустную ситуацию.

Alex Bubnov
Вообще, я могу тебя поздравить и поприветствовать ...

у нас кстати часто рождается дизайн вида: * один модуль умеет слать сообщения, ставить таймеры, принимать сообщения и делать что-то грязное, но он не имеет права принимать решения * второй модуль имеет такое апи: f(InputCommand, State) -> {OutputCommands, State1} и он полностью pure, причем State условно json-ифицируем (по возможности).

Maksim Lapshin
у нас кстати часто рождается дизайн вида: * один ...

да, на днях Sasa Juric в Thinking Elixir рассказывал про то, что он всегда делает похожее деление на interface и core. JSON, кстати, часто удобно заменить на :erlang.term_to_binary -- тогда, ценой читаемости, снимаются ограничения по структуре и добавляется скорость

Max Gorin
да, на днях Sasa Juric в Thinking Elixir рассказыв...

Json-ифицируемость - не выбор самого способа сериализации, а скорее сама сериализируемость. Те то, что можно распечатаь, скопировать из консоли и засунуть обратно. Понятно, что это не жесткое правило, но вот с приходом именованных мониторов все стало еще удобнее

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта