Редактировать (2016-1-26): Каналы НЕ являются потокобезопасными .Документация по этому вопросу изменилась в период с апреля и мая 2015. Новый текст:
Экземпляры канала не должны совместно использоваться потоками.Приложения должны предпочитать использовать канал для каждого потока, а не использовать один и тот же канал для нескольких потоков.Хотя некоторые операции над каналами безопасны для одновременного вызова, некоторые - нет, и это приведет к неправильному чередованию кадров в проводе.Совместное использование каналов между потоками также будет мешать * Подтверждениям издателя.
По вашему вопросу звучит так, будто у вас нет предопределенного фиксированного количества потоков, которые в основном публикуют / подписываются на RabbitMQ (в которомВ этом случае вы могли бы рассмотреть возможность создания канала как часть инициализации потока или использования ThreadLocal<IModel>
).
Если параллельные операции RabbitMQ редки или размеры сообщений всегда малы, вам может быть не просто написатьlock(channel)
вокруг всех ваших операций RabbitMQ pub / sub.Если вам нужно, чтобы несколько запросов передавались с чередованием - для этого в первую очередь нужны каналы - используя произвольные потоки, вы можете создать пул каналов , например ConcurrentQueue<IModel>
, где вы ставите в очередьнеиспользуемые каналы и Dequeue на время, когда они вам нужны. Создание канала занимает очень мало времени , и из тестов производительности у меня возникает ощущение, что процесс создания канала не затрагивает никакой сетевой операции ввода-вывода, т.е. кажется, что канал получает автоматическисозданный на сервере RabbitMQ при первом использовании клиентом.
OLD (до 2016-1-26): в настоящее время в основном устарели детали реализации Java и .net:
Re: каналы и несколько потоков, что немного сбивает с толку из-за его зависимости от реализации.
Реализация Java : Каналы являются потокобезопасными :
Экземпляры канала безопасны для использования несколькими потоками.
Но :
подтверждает, что это не такобрабатывается правильно, когда канал используется несколькими потоками
.net реализация : Каналы не являются поточно-безопасными :
Если более чем одному потоку необходим доступ к конкретным экземплярам IModel, tПриложение должно принудительно применять взаимное исключение.
Симптомы неправильной сериализации операций IModel включают, но не ограничиваются,
• неверные последовательности кадров, отправляемые по проводам
• NotSupportedExceptions выдается ...
Таким образом, в дополнение к полезному ответу Робина, который применяется независимо от того, является ли он потокобезопасным, в реализации .net, вы не можете просто поделитьсясоединение .