Согласно руководству пользователя RabbitMQ «Экземпляры IModel не должны использоваться более чем одним потоком одновременно: код приложения должен поддерживать четкое представление о владении потоком для экземпляров IModel». Если IModel используется совместно, следует использовать блокировку, как вы сказалино, по моему мнению, это приводит к более сложному коду, потому что соединение и модель должны поддерживаться в случае разъединения.
Хотя вы не упоминаете, требуются ли транзакции для обеспечения большей надежности при доставке сообщений,Канал должен быть установлен в режиме транзакции, и, возможно, вам потребуется транзакция для каждой доставки.
Использование новой модели для доставки обеспечивает более простое управление ошибками, но, очевидно, замедлит пропускную способность (и то же самое, используя транзакции).).
Вы также можете, в зависимости от ваших требований, использовать недлительные очереди и прямые или разветвленные обмены, которые обеспечивают лучшую пропускную способность.
Например, на компьютере разработчика служба Windows tОн принимает сообщения из очереди, используя один единственный поток (десериализацию, создает некоторую бизнес-логику, и, наконец, отправляет новое сериализованное сообщение, используя транзакции, открывая / закрывая соединение, и модель может обрабатывать около 3000 сообщений в секунду.(сериализация была выполнена через XmlSerializer, который хуже, чем DataContractSerializer)