Сообщение RabbitMQ для распределения нескольких очередей

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

См. следующую схему. Сообщение публикуется в «Общий обмен», из которого есть привязки к конкретным обменам пользователя (например, «Обмен пользователя 1»), и, наконец, есть последняя привязка от конкретного обмена пользователя к пользовательской очереди (например, «Очередь пользователя 1»). Маршрутизация сообщений

Теперь моя проблема заключается в том, что я не хочу, чтобы какой-то клиент имел преимущество в получении сообщения раньше, чем другие. (например, у пользователя 1 сообщение всегда будет доступно раньше, чем у пользователя 2)

У меня вопрос: доступно ли сообщение в очередях в детерминированном порядке?

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

Спасибо

откровенный


person Frank    schedule 11.04.2017    source источник
comment
Даже если бы она была, разница во времени, вероятно, была бы незаметной.   -  person OrangeDog    schedule 11.04.2017
comment
Да, я знаю, но для клиентов важны даже миллисекунды (SLA говорит, что ни один клиент не получил сообщение первым - как мне это доказать? Действительно ли метод маршрутизации недетерминирован?)   -  person Frank    schedule 11.04.2017
comment
ни у одного клиента нет сообщения первым, это невозможно. Даже если у вас есть один сетевой кабель на очередь, чтобы вы могли отправлять данные одновременно, время передачи все равно будет варьироваться. Вы доказываете это, измеряя свою систему и показывая, что (в среднем) ни один клиент не получает сообщение (некоторое небольшое время) раньше других.   -  person OrangeDog    schedule 11.04.2017
comment
Извините, что я был неточен... ни у одного клиента сначала не было сообщения доступно. Да, мы можем и обязательно будем проводить испытания. Но я бы предпочел получить эту информацию до того, как будут проведены тесты, чтобы избежать изменения модели распространения.   -  person Frank    schedule 11.04.2017
comment
Как я уже сказал, детерминировано это или нет, вы все равно, вероятно, не заметите разницы. И единственный способ доказать это — проверить это.   -  person OrangeDog    schedule 11.04.2017
comment
Хорошо, спасибо за помощь.   -  person Frank    schedule 11.04.2017
comment
Почему у вас вообще есть этот общий обмен? И даже если он у вас действительно есть, разве к нему не хватает очередей? Или как сообщения переходят от обычного обмена к пользовательскому обмену?   -  person cantSleepNow    schedule 14.04.2017
comment
Это будет обмен на обмен привязкой   -  person Vanlightly    schedule 15.04.2017
comment
Это недетерминировано. Каждая очередь может находиться на другом сервере, причем каждый сервер имеет разную загрузку ЦП/памяти/сети, незначительные различия в конфигурации, список можно продолжить. Сообщения могут быть вытеснены из памяти на одном сервере, но не на другом, поэтому, хотя оба они доступны одновременно, доставка на одном сервере будет медленнее, чем на другом. Даже то, как клиенты используют сообщения, может повлиять на ваш сервер, например, клиент X использует предварительную выборку 1, что вызывает больший сетевой трафик на сервере A, чем клиент Y с предварительной выборкой 100 с его очередью на сервере B.   -  person Vanlightly    schedule 15.04.2017


Ответы (1)


Я задал тот же тот же вопрос на форуме RabbitMQ, и вот отвечать:

Маршрутизация сообщений сначала составляет список обменов для маршрутизации в соответствии с доступными привязками, а затем перебирает их. Это работает так же для очередей.

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

Доставка потребителям с N очередями также будет происходить асинхронно и (если для среды выполнения доступно достаточно ядер) параллельно.

Итак, чтобы ответить на вопрос: не существует предсказуемого порядка, в котором одно конкретное сообщение доступно в очередях.

person Frank    schedule 18.04.2017