В каком порядке QueueClient.Receive() доставляет сообщения? Я провел несколько тестов, и я вижу, что несколько сообщений (я думаю, самые верхние) доставляются снова и снова, если вы не выполните их Complete(). Есть ли способ заставить его доставить в режиме Round Robin?
Каков порядок сообщений, доставляемых QueueClient.Receive()
Ответы (2)
Когда у вас есть сообщение, которое доставлено, но не завершено, ожидается, что сообщение появится в очереди после истечения срока действия LockDuration
и будет использовано снова. Вы должны завершить сообщение. Если вы этого не сделаете, он в конечном итоге попадет в DLQ, но до этого ваши потребители будут получать его несколько раз.
QueueClient.Receive
получает все, что доступно на брокере (сервере). Я не следую идее доставки Round Robin, потому что это очередь. Вы получаете то, что в очереди. Как правило, я предлагаю не полагаться на порядок сообщений.
Сказав это, есть функция ASB Session, которая может сохранить и гарантировать заказ доставки. Если вы ищете сеансы, похожий вопрос задавался ранее.
Когда вы создаете QueueClient
, вы можете указать режим приема и установить его на ReceiveAndDelete
:
QueueClient.CreateFromConnectionString(connectionString, path, ReceiveMode.ReceiveAndDelete);
Это позволит вам удалить сообщение из очереди, как только вы его получите, вместо того, чтобы вызывать Complete
.
Если вы не вызываете Complete
или не используете ReceiveAndDelete
, порядок будет таким:
- Получить сообщение (заблокировав его на X секунд)
- Получить следующее сообщение по порядку (заблокировав его на X секунд)
- Срок действия блокировки первого сообщения истек, поэтому вы снова получаете его и снова блокируете.
- То же самое для второго сообщения и так далее до бесконечности.