Следует ли мне избегать использования асинхронных методов, если я хочу сохранить порядок сообщений в EasyNetQ?

Я видел это в документации EasynetQ "

EasyNetQ реализует отдельный поток-потребитель для каждого экземпляра IBus, поэтому, если вы используете стандартный метод не асинхронной подписки, ваш обработчик сообщений будет запускаться синхронно в том же порядке, в котором сообщения доставляются RabbitMQ. Не должно быть необходимости реализовывать блокировку. Если вы используете асинхронную подписку, обработчики будут по-прежнему вызываться по порядку, но, конечно, они могут подтверждаться не в порядке, в зависимости от того, как вы реализуете свой асинхронный обработчик.

Теперь, означает ли это, что я должен избегать использования асинхронных методов (таких как httpClient.SendAsync() или любых асинхронных версий методов) в моем подписчике, если я хочу сохранить порядок сообщений?

Другими словами, у меня есть message1, message2, я хочу обработать message1, а затем message2. Но если мой подписчик использует методы async/await, то message1 и message2 могут быть обработаны не по порядку.

1 ответ

Решение

Ты прав. Кроме того, вы можете установить количество предварительных выборок равным 1, что забирает 1 сообщение за один раз, даже при использовании асинхронного режима, но добавляет много служебной информации mem / cpu и снижает производительность.

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

Другие вопросы по тегам