Документация, на которую вы ссылаетесь, относится к клиенту Java.Вместо этого вы должны ссылаться на этот документ .
Вы используете последнюю версию клиента .NET (5.1
), поэтому выполняете свою работу в обработчике событий Received
не будет блокировать другие потоки, которые имеют дело с данными TCP, и не будет блокировать тактовые импульсы - оба из них хороши.
Прежде всего, вызов channel.BasicQos(0, 1, false)
означает, что ваш потребитель получит только одно готовое сообщение ввремя от RabbitMQ и до вызова BasicAck
другое сообщение не будет доставлено.Таким образом, на самом деле нет причин выполнять свою работу в другом потоке, поскольку вы все равно не получите другое сообщение.
Если вы увеличите значение предварительной выборки (путем экспериментов и выполнения тестов), вам придется выполнитьваша работа в фоновом потоке, если ваша работа выполняется более нескольких миллисекунд.
Когда вы выполняете свою работу в обратном вызове события Received
, он блокирует поток, который используется для выполнения этого обратного вызова.поскольку обратный вызов не выполняется в своем собственном потоке.Таким образом, вы можете убедиться, что ваша работа очень короткая, или выполнить работу в другом потоке.
Я просто потратил некоторое время на просмотр клиентского кода .NET, и я почти уверен, что экземпляр IModel
неПоток безопасно.Если вы увеличите предварительную выборку, у вас будет возможность подтверждать несколько сообщений одновременно, поэтому я рекомендую реализовать решение, которое использует это, а также гарантирует, что BasicAck
вызывается в том же потоке, в котором создается соединение.
ПРИМЕЧАНИЕ: команда RabbitMQ отслеживает список рассылки rabbitmq-users
и только иногда отвечает на вопросы по StackOverflow.