Похоже, что у вас есть потребители, связанные с очередью allAlarms
, но не с какой-либо из alarms_[deviceID]
очередей.
В AMQP один потребитель привязан к одной очереди по имени (и каждая очередь может иметь к ней несколько клиентов). Сообщения доставляются потребителям очереди в циклическом режиме таким образом, что для данного сообщения в очереди точно один потребитель, который получит сообщение. То есть, потребители не могут прослушать несколько очередей.
Поскольку вы используете обмен темы, вы правильно маршрутизируете одно сообщение в несколько очередей с помощью ключа маршрутизации и привязок к очереди. Это означает, что у вас может быть потребитель для каждой очереди, и когда сообщение доставляется на обмен, каждая очередь получит копию сообщения, и каждая очередь доставляет сообщение точно одному потребителю по каждой очереди ,
Таким образом, если allAlarms
потребляет сообщения, это связано с тем, что у него есть потребитель, подключенный к очереди. Если какой-либо из alarms_[deviceID]
не потребляет сообщения, они не должны иметь потребителей, связанных с этими отдельными очередями. Вы должны запускать потребителей для каждого alarms_[deviceID]
по названию. Это позволит вам также иметь различную потребительскую логику для разных очередей.
Одна последняя вещь:
В идеале, я хотел бы также иметь возможность посылать команды обратно в устройствах, использующих одни и те же очереди, где устройства публикуют свои тревоги.
Вы не хотите делать это, используя одну и ту же очередь, потому что нет ничего, что помешало бы пользователям, не являющимся устройствами в очереди, отбирать эти сообщения.
Я считаю, что вы описываете RPC над RabbitMQ. Для этого вы захотите опубликовать сообщения в очереди аварий с заголовком reply-to
, который является именем временной очереди. Эта временная очередь представляет собой одноразовую очередь, которую потребитель будет публиковать, когда это будет сделано для связи с устройством. Устройство опубликует информацию об обмене тревогами и сразу же начнет прослушивать временную очередь для ответа от потребителя.
Для получения дополнительной информации о RPC над RabbitMQ проверить this tutorial.
В конце концов, положив ручку на бумагу, я понял столько же. Сейчас я использую allAlarms. – alex