Сценарий реального мира RabbitMQ

От использования RabbitMQ я требую: производитель создает сообщения, а получатель получает все сообщения, которые публикуются после того, как он впервые подключился к очереди.

Поскольку потребитель хочет использовать все опубликованные сообщения. Поскольку, если к одной очереди подключено более одного потребителя, потребители не получат все сообщения (также см. здесь). Следовательно, потребитель должен создать «эксклюзивную» очередь и подключиться к желаемому обмену. Кроме того, он хочет получать все опубликованные сообщения, даже если он не работает (в будущем). Следовательно, очередь «долговечна». Теперь сценарий выглядит так:

Потребитель C1 создает очередь Q1, которая является эксклюзивной и долговечной. Теперь он не работает в течение некоторого времени, а тем временем другой пользователь C2 пытается подключиться к очереди Q1. C2 будет успешным, поскольку Q1 теперь не имеет подключенного к нему абонента. Итак, C2 подключается к эксклюзивной и надежной очереди. Теперь, если C1 пытается подключиться к очереди Q1, он не может этого сделать, поскольку потребитель C2 уже подписан на очередь Q1.

Как предотвратить такой сценарий?

Надеюсь, на этот раз все ясно.


person Gurpreet Singh    schedule 08.07.2011    source источник


Ответы (3)


Аааа !! Простой ответ ... Я не знал этого о потребителе. Сделайте потребителя эксклюзивным. Теперь только этот потребитель может подключиться к очереди. Но если канал, создающий этого потребителя, будет закрыт, цель потерпит неудачу. Следовательно, канал никогда не должен быть закрыт, если используются эксклюзивные очереди или потребители. Дополнительную информацию об этом можно найти здесь.

person Gurpreet Singh    schedule 08.07.2011

Возможно, Потребитель C2 сможет создать свою собственную очередь с тем же ключом маршрутизации, а затем получать новые сообщения, опубликованные с тех пор.

Если C1 возвращается, он может использовать предыдущее соединение. И оба потребителя получают сообщения.

person Fgblanch    schedule 08.07.2011
comment
Да, то, что вы говорите, совершенно нормально. Но возможно, что в момент, когда C1 не работает, C2 пытается создать очередь для получения сообщения. И, случайно или каким-то образом, если имя очереди, заданное C2, точно такое же, что использовалось C1. Тогда наша цель будет потеряна. - person Gurpreet Singh; 08.07.2011
comment
Да, но именно поэтому вы должны убедиться, что имя очереди потребителя C2 не совпадает. Должно быть довольно легко создать новые имена для очередей каждого потребителя. - person Fgblanch; 08.07.2011

Я уже ответил на это в вопросе с таким же названием, который вы разместили вчера, и я не уверен, куда это делось. Вы его удалили?

В любом случае, ответ (опять же) - использовать уникальную схему именования. Просто убедитесь, что ваши потребители используют некоторую форму предсказуемого, но уникального для каждого потребителя ключа, который используется в качестве имени очереди, которое они объявляют.

Ваше приложение несет ответственность за предотвращение подключения потребителя C2 к очереди, предназначенной для потребителя C1. RabbitMQ не сможет предотвратить это волшебным образом.

person Brian Kelly    schedule 08.07.2011
comment
Да уж удалил !! Думаю, у меня есть правильный ответ: сделайте потребителя эксклюзивным. Теперь только этот потребитель может подключиться к очереди. Я еще не исследовал это. Дополнительную информацию об этом можно найти здесь. - person Gurpreet Singh; 08.07.2011
comment
Теперь я это подтвердил. Только если канал, который создает потребителя, всегда активен, тогда, даже когда эксклюзивный потребитель не работает, никакой другой потребитель не может подключиться к этой очереди. - person Gurpreet Singh; 08.07.2011
comment
Хорошо - опубликуйте его как ответ на этот вопрос и примите его. Так другие выиграют. - person Brian Kelly; 08.07.2011