- 555 "чего-то" в бд
- N сервисов. Число может меняться, могут сдыхать и добавляться
- при запуске или при некоем процессе синхронизации каждый сервис должен взять себе энное число "чего-то" из базы и работать с этим чем-то
- кажда "штука" из базы должна быть забрана только одним инстансом, и каждая должна быть забрана (не должно остаться бесхозных)
- при сдыхании одного из инстансов сервиса остальные должны об этом узнать (например, как-то синхронизируясь друг с другом?) и подхватить штуки, которые до этого он "забрал"
Ума не приложу, как сделать это максимально малой кровью и не слишком костыльно :(
Вариант раз: мастрячить по какому-то протоколу полноценную синхронизацию между инстансами, с постоянными пингами друг друга и инфой об облуживаемых "штуках".
Геморройно, громоздко, багоопасно и, кмк, излишне
Вариант два: что-то вроде k/v store с записями, каким инстансом какая "штука" обслуживается. С ttl на случай выпадения инстанса и почтоянным апдейтом этого ttl, пока инстанс жив.
Гораздо менее больно в реализации, но тоже слегка костыльно. Плюс остается большая проблема, которую сходу хз как решить: как равномерно распределить "штуки из бд" при одновременном старте инстансов
Мб у кого есть какие мысли, или может есть какие-то либы для подобного? =)
Сервис выгружающий записи из бд в очередь сообщений и сервисы забирающие записи из очереди, мне кажется самый простой способ без геморроя
Pg с select for update хватит)
Подумай проще, задача элементарная и много раз решенная
Если я правильно понял задачу то consul + leader election лидер раздает другим то что есть в бд, если лидер упал то автоматом лидером становится другой, самому реализовывать не придётся
первая половина до "каждое должно быть взято" и "каждый должен знать, что-то сдохло" очень похоже на классическое описание MQ с ACK. И собсна очень легко реализуется, как очередь сообщений - пусть 1 сервис берёт и вытягивает всё, а остальные обрабатывают - когда обработка "всё" - помечай в базе что всё готово
ну я примерно это и описал тут ^ в "варианте два"
sharding! Есть N обработчиков. Номер каждого обработчика n. Есть хэш функция, которая сопоставляет каждой задаче некоторое число H. Если остаток от деления H на N не равен n, то обработчик не трогает это задание.
Обсуждают сегодня