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

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

читающие?

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

32 ответов

27 просмотров

Делаете поле статус, при вычитывании ставите его в 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 реплики не делали ту же самую работу

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

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

Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
13
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
11
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
Карта сайта