Асинхронные подтверждения в RabbitMQ (и node.js) - PullRequest
1 голос
/ 13 сентября 2011

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

Рассмотрим этот сценарий:

1 - Я публикую два сообщения, которые являются задачами, которые должны быть выполнены: сообщение A, а затем сообщение B

2 - мой потребитель получает сообщение A, выполняет задачу, содержащуюся в этом сообщении, но во время выполнения задачи происходит сбой сервера

Мой вопрос: когда сервер будет перезагружен, будет ли сообщение A помещено в очередь и будет ли оно помещено в очередь перед сообщением B (в том же порядке, что и до сбоя)?

Насколько я понимаю, сообщение A было бы потеряно в случае сбоя сервера, поскольку мой потребитель подтвердил его по умолчанию при получении сообщения.

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

Видите ли вы проблему с этим подходом? Вы бы посоветовали мне сделать что-нибудь еще?

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

RabbitMQ не сохраняет порядок сообщений для запроса:

По большей части, да. Скажем, издатель публикует сообщения M1, M2, M3 и M4 (в таком порядке) на том же канале и с той же маршрутизацией Информация. Если эти сообщения направляются в очередь, они будут в конечном итоге в том же порядке, в котором они были опубликованы. Потребляя на очередь выдаст M1, M2, M3, а затем M4.

Однако заказ гарантируется только при отсутствии постановки в очередь. сообщение будет неявно помещено в очередь, если потребитель закрывает канал прежде чем получить сообщение. Например, если потребитель получает M1, не в состоянии подтвердить и закрыть канал, то следующий потребитель будет получать сообщения в порядке M2, M3, M4, M1. Сообщения также могут быть явным образом помещается в очередь, если потребитель вызывает basic.recover {requiree = true}. Часто задаваемые вопросы о доставке хотя бы раз говорят об этом подробно.

FAQ по RabbitMQ

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

С наилучшими пожеланиями

0 голосов
/ 14 сентября 2011

Сообщения, которые используются в режиме без подтверждения (см. http://www.rabbitmq.com/amqp-0-9-1-reference.html#domain.no-ack)), не будут поставлены в очередь после сбоя сервера, поскольку сервер полностью забыл о таких сообщениях, когда они доставлены. Потребитель берет на себя ответственность за такие сообщенияпосле доставки.

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

Если посредник аварийно завершает работу во время обработки сообщения A, порядок сообщений будет сохранен.потребитель вместо брокера должен был аварийно завершить работу, тогда порядок сообщений будет обратным.

...