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

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

читающие?

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

32 ответов

11 просмотров

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

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

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

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Кто-нибудь знает почему SPM клонирует репо целиком? Некоторые репы просто огромные, как та же swift-syntax которая нужна для использования макросов. Сначала подумал, что это...
iMike
6
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Привет. Я верно понимаю, что в определении класса Монад m — зафиксирован (к тому же поскольку это моноид в категории эндофункторов). Т.е. используя байнд я не могу перемещать...
Arseny
5
еще вопрос, допустим мы создадим char массив из 10 элементов и присвоим ему через сканф 10 символов. и выведем все символы. Хотел спросить последний элемент /0 будет включать...
Anthem
11
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Карта сайта