Вопрос

Мы разработали пользовательский канал WCF, который взаимодействует через IBM Websphere MQ.

Мы создали фабрику каналов:

public class MqChannelFactory : ChannelFactoryBase<IRequestChannel>

Который возвращает экземпляры нашего канала:

public class MqRequestChannel : ChannelBase, IRequestChannel

Подключение к IBM MQ queue manager - дорогостоящая операция.В настоящее время мы делаем это в Channel.onOpen().

Следуя рекомендациям по правильному использованию каналов, мы вызываем align ChannelFactory.CreateChannel() каждый раз, когда нам требуется канал, отправляем сообщение, затем вызываем Channel.Close().

Наше предположение состояло в том, что ChannelFactory выполнил объединение каналов, так что при вызове Channel.Close() канал фактически не закрывался, а скорее возвращался в пул.Но каждый раз, когда мы вызываем ChannelFactory.CreateChannel создается экземпляр нового канала, и когда отправляется запрос, выполняется дорогостоящее открытие канала.

Итак, вопрос:Каков наилучший подход к предотвращению открытия канала при каждом запросе?

Некоторые из вариантов, которые мы исследуем:

  • Есть ли в любом случае возможность через конфигурацию указать, что должно иметь место объединение каналов?Должны ли мы внедрять наш собственный пул каналов в нашей ChannelFactory?

  • Должны ли мы просто держать наш канал открытым в течение всего срока действия приложения, отправляя все запросы через него?

  • Должны ли мы выполнять дорогостоящую операцию (подключение к диспетчеру очередей) на фабрике каналов, которую мы кэшируем в течение срока службы приложения?

Это было полезно?

Решение

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

Потенциально вы могли бы объединить соединения на уровне ChannelFactory.Я бы не решился объединять целые каналы (здесь всегда есть некоторая сложность), но вы могли бы объединить соединения внутри компании и заставить каналы при необходимости получать соединения из пула, хранящегося на их фабрике каналов.

Это имеет то преимущество, что клиентская база уже кэширует Экземпляры ClientFactory начиная с .NET 3.0 SP1, так что это может упростить работу с кодом приложения (если вы его используете).

Недостатком, однако, является то, что реализовать это может стать сложнее если адрес конечной точки содержит информацию, необходимую для открытия соединения с диспетчером очередей, поскольку вы потенциально можете создавать каналы для разных адресов конечной точки из одного объекта ChannelFactory.Вероятно, это означает, что вам нужно будет явно запретить это, или что вашей реализации ChannelFactory может потребоваться поддерживать несколько пулов соединений внутри (по одному на адрес конечной точки или что-то в этом роде).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top