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

Я еще раз со своим загоном, вы не против? =) Дано:


- 555 "чего-то" в бд
- N сервисов. Число может меняться, могут сдыхать и добавляться

- при запуске или при некоем процессе синхронизации каждый сервис должен взять себе энное число "чего-то" из базы и работать с этим чем-то

- кажда "штука" из базы должна быть забрана только одним инстансом, и каждая должна быть забрана (не должно остаться бесхозных)

- при сдыхании одного из инстансов сервиса остальные должны об этом узнать (например, как-то синхронизируясь друг с другом?) и подхватить штуки, которые до этого он "забрал"

Ума не приложу, как сделать это максимально малой кровью и не слишком костыльно :(

Вариант раз: мастрячить по какому-то протоколу полноценную синхронизацию между инстансами, с постоянными пингами друг друга и инфой об облуживаемых "штуках".
Геморройно, громоздко, багоопасно и, кмк, излишне

Вариант два: что-то вроде k/v store с записями, каким инстансом какая "штука" обслуживается. С ttl на случай выпадения инстанса и почтоянным апдейтом этого ttl, пока инстанс жив.

Гораздо менее больно в реализации, но тоже слегка костыльно. Плюс остается большая проблема, которую сходу хз как решить: как равномерно распределить "штуки из бд" при одновременном старте инстансов


Мб у кого есть какие мысли, или может есть какие-то либы для подобного? =)

7 ответов

11 просмотров

Сервис выгружающий записи из бд в очередь сообщений и сервисы забирающие записи из очереди, мне кажется самый простой способ без геморроя

Pg с select for update хватит)

Подумай проще, задача элементарная и много раз решенная

Если я правильно понял задачу то consul + leader election лидер раздает другим то что есть в бд, если лидер упал то автоматом лидером становится другой, самому реализовывать не придётся

первая половина до "каждое должно быть взято" и "каждый должен знать, что-то сдохло" очень похоже на классическое описание MQ с ACK. И собсна очень легко реализуется, как очередь сообщений - пусть 1 сервис берёт и вытягивает всё, а остальные обрабатывают - когда обработка "всё" - помечай в базе что всё готово

Wingman- Автор вопроса

ну я примерно это и описал тут ^ в "варианте два"

sharding! Есть N обработчиков. Номер каждого обработчика n. Есть хэш функция, которая сопоставляет каждой задаче некоторое число H. Если остаток от деления H на N не равен n, то обработчик не трогает это задание.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта