Уникальные сообщения в очереди в AMQP?

Это похоже на этот другой вопрос, но с небольшим поворотом : Я читал в спецификации, что идентификатор сообщения для сообщений AMQP должен устанавливаться самим приложением, поэтому теоретически я мог бы использовать это, чтобы гарантировать определенную степень уникальности, верно?

Теперь мой главный вопрос: в какой области этот идентификатор сообщения гарантированно будет уникальным? Для сообщений, находящихся в данный момент в очереди в определенной очереди? По всем очередям? Над вселенной? :-)

И стандартизировано ли это поведение? Я планирую использовать здесь RabbitMQ, но было бы неплохо иметь что-то, не зависящее от производителя :-)

Спасибо.


person Horst Gutmann    schedule 29.10.2009    source источник
comment
Мы часто используем RabbitMQ и специально не устанавливаем идентификатор сообщения, и у нас никогда не было проблем. У нас 6 заявок, 20 бирж, 40 нечетных очередей и около 6000 сообщений в месяц. Так что не отвечает на ваш вопрос, но предполагает, что он не должен быть уникальным?   -  person Simon Thompson    schedule 26.08.2011
comment
Почему сообщения должны быть уникальными? Если вы дадите нам больше информации о том, чего вы пытаетесь достичь, мы сможем помочь вам лучше.   -  person cdeszaq    schedule 14.02.2012


Ответы (2)


Другое предложение соответствует школе dump pipe - smart endpoints. мысли.

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

У нас была такая же проблема при переходе с Gearman на RabbitMQ. Мы используем memcached для отслеживания опубликованных уникальных идентификаторов сообщений, а потребители удаляют сообщения, для которых идентификатор сообщения уже хранится в memcache (дубликаты). Вы также можете проверить memcache перед тем, как поставить его в очередь.

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

person Joost Pastoor    schedule 23.07.2015
comment
Какую команду вы используете в Memcached? Судя по тому, что я видел из доступных там команд, это звучит как хорошая запись для условий гонки. Разве SETNX от Redis не был бы здесь более полезен? - person Horst Gutmann; 23.07.2015
comment
Вы можете использовать add(), что гарантирует, что только 1 процесс может установить ключ. (Остальное получает Memcached::RES_NOTSTORED). Это работает для одного экземпляра memcached, не знаю, как это работает в кластере. - person Joost Pastoor; 24.07.2015

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

person pinepain    schedule 17.07.2013