Когда отправлять ACK или NACK на слушателя очереди в STOMP - PullRequest
1 голос
/ 12 февраля 2020

Вопрос в том, когда отправлять брокеру кадры ACK или NACK. Спецификация STOMP гласит:

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

«Потребление» будет означать для меня «после получения и обработки». Поэтому я могу представить себе два сценария ios.

Сценарий A после получения сообщения:

function on_message(message)
    message.ack()
    heavy_processing(message)

или Сценарий B после обработки сообщения:

function on_message(message)
    heavy_processing(message)
    message.ack()

Как я понял, NACK означает сообщить брокеру, что этот слушатель, например, временно помечен как неактивный. И, как я понял, NACK не означает пометить сообщение как необработанное из-за исключения.

Таким образом, следующий псевдокод будет правильно обрабатывать ACK, NACK и исключения из моего понимания:

function on_message(message)
    if online(): # checks resources etc
         message.ack()
    else:
         message.nack()
         return
    try:
        heavy_processing(message) # processing takes 5-10 minutes
    catch Exception: # could be problem with this Listener or malformed message
        message.put_to_dlq() # putting to dlq is a "manual" process
    return

К вашему сведению, система, о которой я говорю, встроена в Python 3.7.x с модулем Stomp.py и ActiveMQ.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

В спецификации STOMP говорится об кадре NACK:

NACK является противоположностью ACK. Он используется, чтобы сообщить серверу, что клиент не использовал сообщение. Затем сервер может отправить сообщение другому клиенту, отбросить его или поместить в очередь недоставленных сообщений. Точное поведение задается сервером c.

Таким образом, кадр NACK сообщает серверу, что клиент не принял сообщение, но не указывает почему .

A NACK frame not указывает, что слушатель как-то временно помечен как неактивный. Посредник продолжит отправлять сообщения слушателю (при условии, что он активен).

A NACK может означать, что сообщение не было обработано из-за исключения. Опять же, в спецификации здесь не делается различий между падежами.

Результирующее поведение NACK остается на сервере.

1 голос
/ 12 февраля 2020

Как вы сказали, «Потребление» будет означать «после получения и обработки», вам необходимо подтвердить сообщение, когда вы успешно обработали ваше сообщение без каких-либо исключений. Таким образом, сценарий B будет подходящим.

Из документации

NACK является противоположностью ACK. Он используется для сообщения серверу о том, что клиент не принял сообщение.

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

Примечание: Если вы ведете отдельную очередь для сообщений с ошибками (те, которые вызывают исключения), то вы можете опубликовать sh эти сообщения в другом (dlq queue в вашем случае) и положительно подтвердить (ACK ) в исходную очередь для этих сообщений с ошибками.

...