- Главная
- Информатика
- WCF-службы: Надёжность, Управление экземплярами (сеансы)
Содержание
- 2. Надёжность транспорта и сообщений Надёжность транспорта обеспечивает гарантированную доставку на уровне сетевых пакетов, включая их последовательность.
- 3. Настройка надёжности связи Включение надёжности должно осуществляться как на стороне службы, так и на стороне клиента.
- 4. Управление экземплярами При подключении клиента к службе, у клиента создаётся необходимый экземпляр посредника (прокси), который организует
- 5. Службы уровня вызова Настроить службу как службу уровня вызова можно при помощи атрибута поведения у контракта
- 6. Службы уровня сеанса Сеансы WCF являются «клиентскими» и имеют следующие основные особенности: Они явным образом инициируются
- 7. Настройка сеансов Возможность поддержки сеансов определяется привязкой, контрактом и поведением службы, например (принято по умолчанию): [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
- 8. Завершение сеанса Сеанс открывается при первом обращении клиента к службе, а завершается при закрытии клиентом своего
- 9. Согласование привязки, контракта и поведения службы
- 10. Синглетные службы Все клиенты независимо друг от друга подключаются к единственному экземпляру службы, обслуживающему все конечные
- 11. Регулирование нагрузки WCF позволяет регулировать нагрузку службы в её поведении. Например: maxConcurrentCalls=" 12" maxConcurrentSessions="34" maxConcurrentInstances="56" />
- 13. Скачать презентацию
Слайд 2Надёжность транспорта и сообщений
Надёжность транспорта обеспечивает гарантированную доставку на уровне сетевых
Надёжность транспорта и сообщений
Надёжность транспорта обеспечивает гарантированную доставку на уровне сетевых
Надёжность сообщений обеспечивает гарантированную доставку* и порядок сообщений, не зависимо от количества пакетов, посредников и сетевых переходов (хопов). Сообщения могут обрабатываться в порядке их отправки (включено по умолчанию) или в порядке получения. В WCF надежность сообщений настраивается на уровне привязки:
* - В случае неудачной передачи сообщений организуется повторная передача (по умолчанию – 8 попыток). Для определения времени повторной передачи использует алгоритм с экспоненциальной задержкой. Задержка перед первой попыткой повторной передачи составляет 1 секунду, для каждой последующей попытки время задержки удваивается. Таким образом, временной интервал 8 попыток составляет около 8,5 минут.
Слайд 3Настройка надёжности связи
Включение надёжности должно осуществляться как на стороне службы, так и
Настройка надёжности связи
Включение надёжности должно осуществляться как на стороне службы, так и
Установить упорядоченную доставку, например, для всех конечных точек службы можно и при помощи атрибута у контракта службы: Упорядочение доставки (по умолчанию – true) Включение надёжности Настройка привязки конечной точки с bindingConfiguration="MyNetTCP" Уточнение настроек для привязок типа netTcpBinding
contract="IMyContract"
bindingConfiguration="MyNetTCP" >
...
[DeliveryRequirements(RequireOrderedDelivery = true)]
Class MyService: IMyContract
{...}
Слайд 4Управление экземплярами
При подключении клиента к службе, у клиента создаётся необходимый экземпляр посредника
Управление экземплярами
При подключении клиента к службе, у клиента создаётся необходимый экземпляр посредника
Для каждого запроса к операциям службы может создаваться отдельный экземпляр службы. В этом случае все операции в службе оказываются независимыми, если искусственно не поддерживается состояние операций, например, при помощи БД.
Службы уровня вызова – PerCall: для каждого клиентского запроса создаётся (и в последствии уничтожается) новый экземпляр службы.
Службы уровня сеанса – PerSession: создаётся один экземпляр службы* для каждого подключения одного и того же клиента. Принято по умолчанию.
Синглетные службы – Single: все подключения клиентов обслуживаются одним экземпляром службы.
Отдавайте предпочтение службам уровня вызова. Избегайте сеансовых и тем более синглетных служб. Используйте упорядоченную доставку в сеансовых службах.
*- в классических Web-сервисах создаётся сеанс с методом, а не со всем сервисом, что не позволяет создавать один сеанс для всех методов.
Слайд 5Службы уровня вызова
Настроить службу как службу уровня вызова можно при помощи
Службы уровня вызова
Настроить службу как службу уровня вызова можно при помощи
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
Class MyService: IMyContract
{...}
Теперь для каждого вызова одного и того же метода (операции) клиента будет создаваться новый экземпляр службы при одном и том же подключении посредника. Клиент не знает, что он каждый раз имеет дело с новым экземпляром службы. При необходимости, такие службы должны быть службами с контролем состояния.
Преимущества:
Объект выделяется клиенту только на время обработки вызова.
Многократное создание и уничтожение экземпляра службы на стороне службы без разрыва связи с клиентом (с посредником клиента) обходится гораздо дешевле, чем в классической клиент-серверной модели (создание экземпляра + подключение).
Службы уровня вызова хорошо масштабируются. При проектировании таких служб рекомендуется делать 10-кратный запас по нагрузке «на будущее».
Службы уровня вызова хорошо укладываются в транзакционную модель програм-мирования независимо от системной нагрузки.
Слайд 6Службы уровня сеанса
Сеансы WCF являются «клиентскими» и имеют следующие основные особенности:
Они
Службы уровня сеанса
Сеансы WCF являются «клиентскими» и имеют следующие основные особенности:
Они
Клиентский сеанс определяется на уровне конкретной рабочей точки, т.е. один клиент может иметь несколько сеансов, организованных через разные точки.
Нет общего хранилища данных, связанного с сеансом WCF в отличие от ASP.NET.
Когда клиент создаёт нового посредника для службы, которая настроена как сеансовая служба, то клиент получает новый специализированный экземпляр службы, не зависящий от всех остальных экземпляров той же службы. Экземпляр продолжает существовать до тех пор, пока не станет ненужным клиенту. При этом экземпляр службы может использоваться для хранения состояния, а модель программирования оказывается близкой к клиент-серверной модели.
По умолчанию службы поддерживают не более 10 параллельных сеансов. Служба принимает подключения новых клиентов до достижения этого числа. После этого служба отклоняет подключения новых клиентов, пока не будет закрыт один из текущих сеансов. Поддержку большего количества клиентов можно обеспечить двумя способами: не использовать сеансовую привязку; увеличить ограничение сеансов в поведении службы – MaxConcurrentSessions. Поддержка большого количества сеансов требует больших затрат ресурсов, связанных с каждым специализированным экземпляром службы.
Слайд 7Настройка сеансов
Возможность поддержки сеансов определяется привязкой, контрактом и поведением службы, например (принято
Настройка сеансов
Возможность поддержки сеансов определяется привязкой, контрактом и поведением службы, например (принято
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
Class MyService: IMyContract
{...}
[ServiceContract(SessionMode=SessionMode.Allowed)]
Interface: IMyContract
{...}
Свойство SessionMode.Allowed разрешает сеансы, но не делает их обязательными,
SessionMode.Required устанавливает сеансы если они возможны,
SessionMode.NotAllowed запрещает сеансы, получаем службу уровня вызова.
Сеанс между клиентом и экземпляром службы надёжен лишь в той степени, в какой надёжен транспортный сеанс.
Слайд 8Завершение сеанса
Сеанс открывается при первом обращении клиента к службе, а завершается при
Завершение сеанса
Сеанс открывается при первом обращении клиента к службе, а завершается при
Значение тайм-аута можно задавать через свойство ReliableSession соответствующей привязки. Например, для WS-привязки клиента установка тайм-аут 25 минут на программном уровне может иметь вид:
System.ServiceModel.WSHttpBinding MyWsBinding =
new System.ServiceModel.WSHttpBinding();
MyWsBinding.ReliableSession.Enabled = true;
MyWsBinding.ReliableSession.InactivityTimeout =
TimeSpan.FromMinutes(25);
Или в конфигурационном файле при включенной надёжной доставке:
Если клиент или служба задают разные тайм-ауты, то используется более короткий интервал
Слайд 9Согласование привязки, контракта и поведения службы
Согласование привязки, контракта и поведения службы
Слайд 10Синглетные службы
Все клиенты независимо друг от друга подключаются к единственному экземпляру службы,
Синглетные службы
Все клиенты независимо друг от друга подключаются к единственному экземпляру службы,
Чтобы установить службу на синглетный режим необходимо сделать следующие настройки поведения:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
Class MyService: IMyContract
{...}
Синглетные службы плохо масштабируются. В любой момент времени с синглетом может работать только один клиент. Такое ограничение снижает производитель-ность, скорость отклика и доступа. Например, если операция с синглетом занимает 0.1 секунды, служба сможет обслуживать только 10 клиентов в секунду. При большем количестве клиентов (20 или 100) производительность системы становится неприемлемой.
Слайд 11Регулирование нагрузки
WCF позволяет регулировать нагрузку службы в её поведении. Например:
name="…">
maxConcurrentCalls=" 12"
maxConcurrentSessions="34"
maxConcurrentInstances="56" />
…
Максимальное число вызовов, обрабатываемых в данный момент всеми экземплярами служб уровня вызова (по умолчанию - 10).
Максимальное количество клиентов, использующих сеансы (по умолчанию - 16)
Максимальное число одновременно существующих экземпляров. Для служб уровня сеанса оно совпадает с maxConcurrentSessions. Для служб уровня вызова – берётся минимальное из указанного и maxConcurrentCalls.
Для синглетных служб - игнорируется
Регулирование нагрузки
WCF позволяет регулировать нагрузку службы в её поведении. Например:
Максимальное число вызовов, обрабатываемых в данный момент всеми экземплярами служб уровня вызова (по умолчанию - 10). Максимальное количество клиентов, использующих сеансы (по умолчанию - 16) Максимальное число одновременно существующих экземпляров. Для служб уровня сеанса оно совпадает с maxConcurrentSessions. Для служб уровня вызова – берётся минимальное из указанного и maxConcurrentCalls.
Для синглетных служб - игнорируется
maxConcurrentSessions="34"
maxConcurrentInstances="56" />
…