Каков порядок сообщений, доставляемых QueueClient.Receive()

В каком порядке QueueClient.Receive() доставляет сообщения? Я провел несколько тестов, и я вижу, что несколько сообщений (я думаю, самые верхние) доставляются снова и снова, если вы не выполните их Complete(). Есть ли способ заставить его доставить в режиме Round Robin?


person Gökhan Kurt    schedule 04.10.2016    source источник


Ответы (2)


Когда у вас есть сообщение, которое доставлено, но не завершено, ожидается, что сообщение появится в очереди после истечения срока действия LockDuration и будет использовано снова. Вы должны завершить сообщение. Если вы этого не сделаете, он в конечном итоге попадет в DLQ, но до этого ваши потребители будут получать его несколько раз.

QueueClient.Receive получает все, что доступно на брокере (сервере). Я не следую идее доставки Round Robin, потому что это очередь. Вы получаете то, что в очереди. Как правило, я предлагаю не полагаться на порядок сообщений.

Сказав это, есть функция ASB Session, которая может сохранить и гарантировать заказ доставки. Если вы ищете сеансы, похожий вопрос задавался ранее.

person Sean Feldman    schedule 04.10.2016
comment
Насчет гарантии на заказанную доставку, как это может работать, если клиент не звонит на сообщение завершено и оно снова выскакивает? Я думаю, что нет никакой гарантии в этом случае - person Maayan Hope; 31.05.2018
comment
Если сообщение не завершено, оно будет доставлено повторно. Я бы сказал, что это не проблема заказа. - person Sean Feldman; 31.05.2018

Когда вы создаете QueueClient, вы можете указать режим приема и установить его на ReceiveAndDelete:

QueueClient.CreateFromConnectionString(connectionString, path, ReceiveMode.ReceiveAndDelete);

Это позволит вам удалить сообщение из очереди, как только вы его получите, вместо того, чтобы вызывать Complete.

Если вы не вызываете Complete или не используете ReceiveAndDelete, порядок будет таким:

  • Получить сообщение (заблокировав его на X секунд)
  • Получить следующее сообщение по порядку (заблокировав его на X секунд)
  • Срок действия блокировки первого сообщения истек, поэтому вы снова получаете его и снова блокируете.
  • То же самое для второго сообщения и так далее до бесконечности.
person Stefano d'Antonio    schedule 08.10.2016
comment
Затем он будет получать некоторое количество сообщений сверху снова и снова. Но сколько их? - person Gökhan Kurt; 10.10.2016
comment
@GökhanKurt не уверен, что понял твой вопрос. - person Stefano d'Antonio; 10.10.2016
comment
Насколько я понимаю из ответа, он заблокирует несколько самых верхних и заблокирует их (2 в вашем примере). Затем, когда срок действия блокировки истечет, он снова попробует эти два. Предполагая, что 2 элемента - это просто пример, сколько он заблокирует и попытается? Или он просто заблокирует самый верхний и будет ждать, пока истечет срок блокировки? Или, возможно, он пробует каждый элемент сверху до тех пор, пока не истечет срок блокировки для самого верхнего, после чего все начнется сначала. - person Gökhan Kurt; 10.10.2016
comment
Я вижу сейчас; Он последовательно заблокирует все сообщения в очереди сверху вниз. По истечении срока действия блокировки следующее сообщение, которое вы получите, будет самым старым из заблокированных. - person Stefano d'Antonio; 10.10.2016
comment
Тогда должно быть какое-то время истечения срока действия по умолчанию. Где вы можете сказать, как долго он будет блокировать каждое сообщение. - person Gökhan Kurt; 10.10.2016
comment
Да, я думаю, вы можете установить его на самой очереди. - person Stefano d'Antonio; 10.10.2016