Клиенты RabbitMQ ставят в очередь в том же порядке, что вы отправили .Когда подписчики отключаются, вы получаете сетевые сплиты или сообщения NACKs подписчика, которые они могут переупорядочивать;и даже тогда RMQ пытается удерживать их в том же приблизительном порядке, повторно ставя в очередь в той же позиции или как можно ближе к той же позиции.
Вы можете сделать это так, как вы предлагаете; принимать по одному сообщению за раз , потому что, если вы принимаете сообщение, но вылетаете до того, как получите его от брокера, оно появится, когда ваш сервис вернется в ту же позицию.
Предполагается, что в любой момент времени у вас есть только единственный экземпляр службы , потребляющий из очереди.Что, в свою очередь, само по себе является проблемой распределенных систем, если у вас есть такой планировщик, как Kubernetes или Mesos, порождающий экземпляры ваших служб.
Другим решением будет обеспечение упорядочения обработки в службе приема путем «повторного упорядочения»«сообщения основаны на их логических временных / последовательных номерах.
Я написал гораздо более подробное руководство в виде аннотированного кода здесь https://github.com/haf/rmq-publisher-confirms-hopac/blob/master/src/Server/Shared/RabbitMQ.fs - с помощью пакетной обработки вы можете выполнить повторную последовательность.Кроме того, если ваша идемпотентность встраивает последовательные порядковые номера в свою логику, вы можете начать принимать партии, и каждое событие будет идемпотентным, несмотря на то, что его повторно потребляют.