Повторное использование экземпляра сервера WCF между операциями без параллелизма
Как сделать так, чтобы экземпляр сервера WCF (экземпляр класса в файле.svc.cs / .svc.vb) оставался в живых между запросами?
Это сервис без сохранения состояния, доступный только для чтения: я в порядке, когда разные клиенты используют один и тот же экземпляр. Тем не менее, это не потокобезопасно: я не хочу, чтобы два потока выполняли метод в этом экземпляре одновременно.
В идеале я ищу, чтобы WCF управлял "рабочим пулом" этих экземпляров. Скажем, 10. Новый запрос приходит: получить экземпляр, обработать запрос. Запрос окончен, возвращайтесь в бассейн. Уже запущено 10 одновременных запросов? Пауза 11-го, пока новый работник не освободится.
То, что я / не хочу / хочу, это сеансы для каждого клиента. Запуск в таких случаях стоит дорого, я не хочу делать это каждый раз, когда подключается новый клиент.
Еще одна вещь, которую я не хочу: иметь дело с этой клиентской стороной. Это не является обязанностью клиента, который ничего не должен знать о реализации сервера. И я не всегда могу это контролировать.
Я немного теряюсь в незнакомой терминологии из документации MSDN. У меня много работы, но эта система пула, кажется, мне не подходит.
Нужно ли создавать статический пул и управлять им самостоятельно?
Спасибо
PS: источником путаницы для меня является то, что почти все в этом отношении указывает на конфигурацию привязок. Как BasicHttp или wsHttp. Но это звучит неправильно: это должно быть на более высоком уровне, не связанном с привязкой: это касается рабочих менеджеров. Или нет?
1 ответ
Если у вас есть служба WCF, которая централизует бизнес-логику, предоставляет / контролирует доступ к другому "единственному" внутреннему ресурсу (например, файлу данных, сетевому сокету) или иным образом содержит некоторый тип общего ресурса, то вам, скорее всего, потребуется реализовать синглтон.
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
В общем, используйте одноэлементный объект, если он хорошо отображается на натуральный одноэлементный объект в домене приложения. Синглтон подразумевает, что синглтон имеет какое-то ценное состояние, которым вы хотите поделиться для нескольких клиентов. Проблема заключается в том, что, когда несколько клиентов подключаются к одиночному серверу, все они могут делать это одновременно в нескольких рабочих потоках. Синглтон должен синхронизировать доступ к своему состоянию, чтобы избежать повреждения состояния. Это, в свою очередь, означает, что только один клиент одновременно может получить доступ к синглтону. Это может ухудшить отзывчивость и доступность до такой степени, что синглтон станет непригодным для использования по мере роста системы.
Сервис Singleton - это универсальный сервис, который имеет как плюсы (как указано выше), так и минусы (как подразумевается в вашем вопросе, вы должны управлять безопасностью потоков). Когда служба настроена как одноэлементная, все клиенты подключаются к одному и тому же общеизвестному экземпляру независимо друг от друга, независимо от того, к какой конечной точке службы они подключаются. Служба singleton работает вечно и уничтожается только после выключения хоста. Синглтон создается ровно один раз при создании хоста.