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

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

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

13 ответов

6 просмотров

Мне недавно такая идея пришла в голову: хранить стейт в самом процессе (например, 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-ифицируемость - не выбор самого способа сериализации, а скорее сама сериализируемость. Те то, что можно распечатаь, скопировать из консоли и засунуть обратно. Понятно, что это не жесткое правило, но вот с приходом именованных мониторов все стало еще удобнее

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
31
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
Где можно найти примеры эффективного "асинхронного" tcp сервера на C? Я видел select, kqueue, poll, epoll и т.д. Ввод-вывод неблокирующий, но обработка клиентов блокирующая
#
10
Всем доброго дня, ребят подскажите пожалуйста, если в курсе по ассемблеру используется MASM32, могу ли я использовать FASM? В чем явная разница и будет ли у меня все работать?
Botsman
17
Книга Юрова В.И пойдёт для обучения?
Botsman
24
Hi Everyone! To all Are you Looking for Interview Support at the Lowest Price? Look no further! Then contact us 👉We offer Interview Support :-for a low cost variety of tech...
Rambabu Nallamilli
3
Hello experts, Could someone kindly tell me how to run vacuum inside a plpgsql function? If you have any link please share. Thank you
Amol Palav
10
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
> Примечательно, что новый владелец удаляет из GitHub любые жалобы, указывающие на подозрительную активность или смену владельца, и, видимо, рассчитывает на то, что пользовате...
Alex Sherbakov
2
Карта сайта