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

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

ситуация, что сообщение из очереди, тригеррит отправку пушей пользователю, пуши нужно отправлять только 1 раз на 1 сообщение.
Есть 2 Дата Центра, и, в каждом ДЦ есть нода кролика и 2 ноды сервиса, гарантия доставки at least once, есть достаточно шансов, что сообщение будет отправлено несколько раз = обработано = отправлены пуши.
Я однажды решал такую проблему, и решил это с помощью блокировок в БД. Пришло сообщение(у каждого сообщения есть уникальный correlationId), я его ловлю preprocess hookом реббита(Не помню название класса), сохраняю в таблицу, где есть unique констрейнт на correlationId и отправляю в метод-листнер. Таким образом обработать сообщение может только 1 листнер, который смог сохранить сообщение в БД, остальные упадут с ошибкой ConstraintIntegrityViolation, которую мы обработаем.
Может кто знает более элегантное решение?

6 ответов

12 просмотров

кажется, можно переложить эту проблему на гугл и эпл. Например, у эпла есть параметр пуша - apns-collapse-id, который должен помочь в случае дублирования одного и того же сообщения

А бд где лежит?

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

а сейчас плохо работает?

Anton- Автор вопроса
Alexander Komarov
а сейчас плохо работает?

Нет, тот подход, что описал я использовал на другом проекте, там всё работает ок, просто, может, кто-то решал эту проблему по-другому, было бы интересно узнать как

Anton
Нет, тот подход, что описал я использовал на друго...

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно 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
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта