RabbitMQ - как не потерять событие
От: Shmj Ниоткуда  
Дата: 08.03.20 13:55
Оценка:
Кто-нибудь использует RabbitMQ или что подобное для межсерверных событий?

Пока разбираюсь...

Вопрос такой. Допустим, сгенерено событие, мы его отловили и начали обработку. Если перед обработкой отметить что событие уже обработано — то есть риск так и не завершить обработку. Какой-то там стандартный механизм есть — кто сталкивался?
Re: RabbitMQ - как не потерять событие
От: RushDevion Россия  
Дата: 08.03.20 14:58
Оценка: +2
S>Вопрос такой. Допустим, сгенерено событие, мы его отловили и начали обработку. Если перед обработкой отметить что событие уже обработано — то есть риск так и не завершить обработку. Какой-то там стандартный механизм есть — кто сталкивался?

Есть стандартный механизм подтверждения: Consumer Acknowledgements.
Т.е. подписались на очередь, получили сообщение, обработали, подтвердили (ack), RMQ удалил сообщение.
Если ack не было, RMQ будет считать, что сообщение не доставлено и попробует доставить его снова.
Re: RabbitMQ - как не потерять событие
От: Слава  
Дата: 08.03.20 15:24
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Вопрос такой. Допустим, сгенерено событие, мы его отловили и начали обработку. Если перед обработкой отметить что событие уже обработано — то есть риск так и не завершить обработку. Какой-то там стандартный механизм есть — кто сталкивался?


Если вы начнёте копать вглубь, то вам откроются бездны. В общем случае — всё плохо.
Re[2]: RabbitMQ - как не потерять событие
От: Shmj Ниоткуда  
Дата: 08.03.20 17:51
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Если ack не было, RMQ будет считать, что сообщение не доставлено и попробует доставить его снова.


Когда?
Re[2]: RabbitMQ - как не потерять событие
От: Shmj Ниоткуда  
Дата: 08.03.20 17:51
Оценка:
Здравствуйте, Слава, Вы писали:

С>Если вы начнёте копать вглубь, то вам откроются бездны. В общем случае — всё плохо.


А подробнее?
Re: RabbitMQ - как не потерять событие
От: VladCore  
Дата: 08.03.20 18:08
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Кто-нибудь использует RabbitMQ или что подобное для межсерверных событий?


S>Пока разбираюсь...


S>Вопрос такой. Допустим, сгенерено событие, мы его отловили и начали обработку. Если перед обработкой отметить что событие уже обработано — то есть риск так и не завершить обработку. Какой-то там стандартный механизм есть — кто сталкивался?


я писал финансовый exchange на rabbitmq
1) добавляй в заголовок автоинкремент. если потеряется сообщение то желающие об этом узнают.
2) Юзай Health Check для обхода косяков с транспортом.
Re[3]: RabbitMQ - как не потерять событие
От: RushDevion Россия  
Дата: 08.03.20 18:28
Оценка:
RD>>Если ack не было, RMQ будет считать, что сообщение не доставлено и попробует доставить его снова.
S>Когда?

It depends
Если предположить, что автоматический ack у нас отключен.
И что наша конфигурация: 1 очередь -> 1 consumer (в случае потока событий это обычно так), то
1) Если ack не было, потому что отвалился канал (порвалось соединение, упал клиент), то практически сразу после переподключения.
2) Если ack/nack не было, потому что клиент тупит и не шлет его, то... никогда.
Re: RabbitMQ - как не потерять событие
От: Ночной Смотрящий Россия  
Дата: 08.03.20 19:11
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Вопрос такой. Допустим, сгенерено событие, мы его отловили и начали обработку. Если перед обработкой отметить что событие уже обработано


Зачем?

S> — то есть риск так и не завершить обработку. Какой-то там стандартный механизм есть — кто сталкивался?


Есть. Не посылать Ack пока обработка не завершена, и посылать Nack если при обработке произошла ошибка, требующая повторной попытки.
И, кстати, тут никакой специфики кролика нет, в ServiceBus ровно та же стратегия, только терминология другая.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: RabbitMQ - как не потерять событие
От: Sazon  
Дата: 08.03.20 20:02
Оценка: +1
Здравствуйте, VladCore, Вы писали:

VC>Здравствуйте, Shmj, Вы писали:


S>>Кто-нибудь использует RabbitMQ или что подобное для межсерверных событий?


S>>Пока разбираюсь...


S>>Вопрос такой. Допустим, сгенерено событие, мы его отловили и начали обработку. Если перед обработкой отметить что событие уже обработано — то есть риск так и не завершить обработку. Какой-то там стандартный механизм есть — кто сталкивался?


VC>я писал финансовый exchange на rabbitmq

VC>1) добавляй в заголовок автоинкремент. если потеряется сообщение то желающие об этом узнают.
VC>2) Юзай Health Check для обхода косяков с транспортом.

amqp-heartbit + tcp-keepalive — не решают проблему транспорта?
Re[3]: RabbitMQ - как не потерять событие
От: VladCore  
Дата: 08.03.20 23:10
Оценка:
Здравствуйте, Sazon, Вы писали:

S>>>Кто-нибудь использует RabbitMQ или что подобное для межсерверных событий?


S>>>Пока разбираюсь...


S>>>Вопрос такой. Допустим, сгенерено событие, мы его отловили и начали обработку. Если перед обработкой отметить что событие уже обработано — то есть риск так и не завершить обработку. Какой-то там стандартный механизм есть — кто сталкивался?


VC>>я писал финансовый exchange на rabbitmq

VC>>1) добавляй в заголовок автоинкремент. если потеряется сообщение то желающие об этом узнают.
VC>>2) Юзай Health Check для обхода косяков с транспортом.

S>amqp-heartbit + tcp-keepalive — не решают проблему транспорта?


хз. та биржа с которой я имел дело, давала так называемый application level heartbeat. встроенным не пользовались
Re: RabbitMQ - как не потерять событие
От: agos Россия http://trtrmitya.wordpress.com
Дата: 09.03.20 06:41
Оценка: 8 (2)
Здравствуйте, Shmj, Вы писали:


S>Вопрос такой. Допустим, сгенерено событие, мы его отловили и начали обработку. Если перед обработкой отметить что событие уже обработано — то есть риск так и не завершить обработку. Какой-то там стандартный механизм есть — кто сталкивался?


Может упасть всё и везде надо подложить соломку.

Во-первых, кластер. Как минимум три ноды.

Надо включать confirmation на отправке, чтобы клиент был уверен, что брокер принял сообщение.

Надо делать mirrored очереди, чтобы при потере ноды сообщения остались.

Надо включать durable для очередей И для сообщений чтобы они пережили рестарт брокера 🤦‍♂️

Надо включать lazy чтобы сообщения не оставались в памяти, иначе при внезапном отключении вы потеряете сообщения, по которым получили confirmation ack.

Надо делать обработку deadletter'ов.

Надо прописать alternate у exchange и мониторить очередь с ним, чтобы отлавливать мусор.

Крайне желательно использовать push модель, они сделали медленный вариант pull модели, поэтому остаётся только push.
Не переходите улицу на тот свет..
Re[2]: RabbitMQ - как не потерять событие
От: Ночной Смотрящий Россия  
Дата: 09.03.20 10:15
Оценка:
Здравствуйте, agos, Вы писали:

A>Может упасть всё и везде надо подложить соломку.


Точно? Всегда? Вне зависимости от требований?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: RabbitMQ - как не потерять событие
От: Shmj Ниоткуда  
Дата: 09.03.20 10:44
Оценка:
Здравствуйте, agos, Вы писали:

Спасибо, видно что не просто игрались с ним.

A>Надо делать обработку deadletter'ов.


Могли бы кратко описать механизм deadletter'ов?
Re[3]: RabbitMQ - как не потерять событие
От: agos Россия http://trtrmitya.wordpress.com
Дата: 09.03.20 13:57
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, agos, Вы писали:


A>>Может упасть всё и везде надо подложить соломку.


НС>Точно? Всегда? Вне зависимости от требований?


Ок, ок, если можно терять, то не везде стелить соломку
Не переходите улицу на тот свет..
Re: RabbitMQ - как не потерять событие
От: sr_dev  
Дата: 09.03.20 14:15
Оценка: 2 (1) -1
Здравствуйте, Shmj, Вы писали:

S>Кто-нибудь использует RabbitMQ или что подобное для межсерверных событий?


S>Пока разбираюсь...


S>Вопрос такой. Допустим, сгенерено событие, мы его отловили и начали обработку. Если перед обработкой отметить что событие уже обработано — то есть риск так и не завершить обработку. Какой-то там стандартный механизм есть — кто сталкивался?


оффтоп. используй redis гугли reliable queue pattern. использую в проектах с сотнями тыс сообщений в час, один инстанс редиса тянет, годами никаких проблем. кафками и геарманами наелся.
опа опа мы воюем с нато
любит хавать этот кал
путинская вата
Re[4]: RabbitMQ - как не потерять событие
От: Ночной Смотрящий Россия  
Дата: 09.03.20 14:20
Оценка:
Здравствуйте, agos, Вы писали:

НС>>Точно? Всегда? Вне зависимости от требований?

A>Ок, ок, если можно терять, то не везде стелить соломку

Это вообще не бинарная величиа можно/нельзя. SLA выражается числом. И если SLA SaaS очереди, к примеру, 99%, а требуемый SLA сервиса — 95, то рвать попу на британский флаг совсем не обязательно.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[3]: RabbitMQ - как не потерять событие
От: Ночной Смотрящий Россия  
Дата: 09.03.20 14:20
Оценка:
Здравствуйте, Shmj, Вы писали:

A>>Надо делать обработку deadletter'ов.

S>Могли бы кратко описать механизм deadletter'ов?

Что не так с докой?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[3]: RabbitMQ - как не потерять событие
От: Tom Россия http://www.RSDN.ru
Дата: 14.04.20 19:40
Оценка: 6 (2)
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Слава, Вы писали:


С>>Если вы начнёте копать вглубь, то вам откроются бездны. В общем случае — всё плохо.


S>А подробнее?


Если подробюнее то есть понятия delivery guarantee, если мы говорим о очередях то их две:

1. at most once
2. at least once

первое — вы получите одно и то же сообщение максимум раз, достигается посылкой ACK сразу после принятия сообщения и до егшо обработки. Соответственно если обработка сообщения свалилась, например потому что доступ к базе данных пропал то сообщение потеряно.

второе — ACK посылается после того как сообщение обработано, но есть риск в том что послать ACK вы не сможете (упала сеть, машина итп), соответственно есть риск получить одно и то же сообщение дважды и код должен это учитывать.

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

Если хочется exactly once/effectively once то стоит смотреть в сторону систем распределённого лога, Apache Kafka, Apache Pulsar
Народная мудрось
всем все никому ничего(с).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.