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

Привет! Как реализовать паттерн outbox, когда есть 2 реплики его

читающие?

Есть 2 го сервиса, которые вычитывают outbox табличку и создают ивенты. Но т.к. реплики 2, то каждая запись будет вычитываться 2 раза. Какие есть способы это решить?

32 ответов

31 просмотр

Делаете поле статус, при вычитывании ставите его в PROCESSING, после отправки ставите в DONE, вычитываете только записи в статусе NEW

Читать в одну реплику.

Rostislav-Teryaev Автор вопроса
Владимир Гришин
Делаете поле статус, при вычитывании ставите его в...

звучит на самом деле круто) надо попробовать, спасибо

Rostislav-Teryaev Автор вопроса
Vadim
Читать в одну реплику.

их всегда больше 1й для отказоустойчивости

Rostislav Teryaev
звучит на самом деле круто) надо попробовать, спас...

еще можете тупо ставить advisory lock, вычитывать все что надо, потом закрывать транзаху и отдавать этот лок

Rostislav Teryaev
звучит на самом деле круто) надо попробовать, спас...

Звучит не круто. Во-первых, без локов эта история не будет работать. Во-вторых, две реплики создают беспорядок в событиях, а это часто бывает важно.

Чем две реплики гарантируют отказустойчивость? Если база лежит, лежат обе реплики. Если кафка лежит, лежат обе реплики. Для такой задачи одной реплики хватит. Вам из базы в кафку положить. Без локов на базе. Плюс остается оригинальный порядок событий.

Rostislav-Teryaev Автор вопроса
Vadim
Чем две реплики гарантируют отказустойчивость? Есл...

тем, что если 1 реплика лежит, вторая не лежит они в разных дц

Rostislav Teryaev
тем, что если 1 реплика лежит, вторая не лежит они...

Таблица тоже в разных дц? А вообще, можно взять готовый cdc типа дебезиума.

Rostislav-Teryaev Автор вопроса
Vadim
Таблица тоже в разных дц? А вообще, можно взять го...

в одном. Но реплики сервисов всегда две поднимаются

Rostislav Teryaev
в одном. Но реплики сервисов всегда две поднимаютс...

с этого и стоило начинать, что просто несолько инстансов приложения. тогда какой нибудь Leader election

Rostislav-Teryaev Автор вопроса
Dmitry M
с этого и стоило начинать, что просто несолько инс...

так вроде и написал, что 2 реплики есть

Rostislav-Teryaev Автор вопроса
Dmitry M
с этого и стоило начинать, что просто несолько инс...

leader election - будет одна реплика работать. А в идеале две

Rostislav-Teryaev Автор вопроса
Vadim
Вы для чего оутбукс берете?

клиент делает запрос в сервис1, если валидация прошла, отдаю 200. Дальше надо из сервиса1 сделать запрос в сервис2 и сервис3, которые могут не работать в данный момент, например, в течении суток. (Потом поднимуться). И вот сервис1 кладет в аутбокс, потом сам же вычитывает и шлет в 2 других сервиса

Rostislav-Teryaev Автор вопроса
Vadim
Это очереди.

Хорошо, если заменить базу на очередь, то как обеспечить транзакционность? Пришел запрос отправил в очередь1 и перед отправкой в очередь2 сервис упал - косяк.

Rostislav Teryaev
Хорошо, если заменить базу на очередь, то как обес...

Если использовать кролик, то вы отправляете в обменник, а не очередь, к обменнику могут быть прикреплены две очереди. Если использовать кафку, вы отправляете в один топик, который читают разные консьюмер-группы.

Vadim
Чем две реплики гарантируют отказустойчивость? Есл...

Может быть требование например по реплике на ДЦ. База тоже может состоять из не одной реплики

Rostislav-Teryaev Автор вопроса
Rostislav Teryaev
вариант. Пока так и сделаю

Важнее задачу в джире закрыть или использовать правильный инструмент под задачу?

Rostislav Teryaev
их всегда больше 1й для отказоустойчивости

Для отказоустойчивости стейтфул приложений, обычно все равно только одна реплика активная. Даже если запущены две. Вторая в пассивном режиме

Rostislav-Teryaev Автор вопроса
Rostislav Teryaev
а почему подумал, что это стейтфулл?

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

Rostislav-Teryaev Автор вопроса
Vlad Tokarev
Ну эта табличка разве не является в каком-то смысл...

ну база то это всегда стейт. Суть в том, чтобы сервисы сделать стейтлес. В какой-то мере я это и хотел

Rostislav Teryaev
а почему подумал, что это стейтфулл?

Если хочется для ускорения именно обрабатывать) можно еще каждой реплике назначать номер от 0 до N и каждая реплика должна обрабатывать ивенты с ID остатком деления на номер реплики будет 0. Но это лишь ускорит процесс обработки. Для отказоустойчивости все равно будет подстраховочная реплика для каждого номера, которая подхватит работу, если лидер упадет

Vlad Tokarev
Если хочется для ускорения именно обрабатывать) мо...

зачем, если можно просто через лок брать пачки?

В конечном итоге нужно добиться exactly once или at least once delivery?

Rostislav-Teryaev Автор вопроса
grigadog
В конечном итоге нужно добиться exactly once или a...

at least once не добиться. Тут потребность не в какой-то семантике, а чтобы 2 реплики не делали ту же самую работу

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

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

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