Объединение пользовательских каналов WCF - PullRequest
0 голосов
/ 13 января 2010

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

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

public class MqChannelFactory : ChannelFactoryBase<IRequestChannel>

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

public class MqRequestChannel : ChannelBase, IRequestChannel

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

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

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

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

Некоторые из рассматриваемых нами вариантов:

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

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

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

1 Ответ

1 голос
/ 13 января 2010

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

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

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

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

...