Сценарии тестирования платформы Service Fabric: обмен данными между службами
Микрослужбы и стили сервисноориентированной архитектуры естественным образом развертываются на платформе Azure Service Fabric. В распределенных архитектурах этих типов компонентные приложения микрослужб обычно состоят из нескольких служб, которые должны взаимодействовать друг с другом. Даже в простейших случаях у вас обычно есть как минимум веб-служба без отслеживания состояния и служба хранилища данных с отслеживанием состояния, которые должны взаимодействовать друг с другом.
Обмен данными между службами — критически важная точка интеграции приложения, так как каждая служба предоставляет удаленный API-интерфейс для других служб. Работа с набором границ API, включающая ввод-вывод данных, обычно требует тщательного подхода с интенсивным тестированием и проверкой.
При объединении этих границ служб другом в распределенной системе следует ответить на ряд вопросов.
- Транспортный протокол. Вы будете использовать протокол HTTP для улучшения взаимодействия или пользовательский двоичный протокол, чтобы обеспечить максимальную пропускную способность?
- Обработка ошибок. Как будут обрабатываться постоянные и временные ошибки? Что произойдет, когда служба переместится на другой узел?
- Время ожидания и задержка. Как каждый слой службы будет обрабатывать задержку через стек для пользователя в многоуровневых приложениях?
Если вы используете один из встроенных компонентов обмена данными между службами, доступных в Service Fabric, или выполняете сборку собственного компонента, тестирование взаимодействия между службами является критически важным для обеспечения устойчивости приложения.
Подготовка служб к перемещению
Со временем экземпляры служб могут перемещаться, особенно если они настроены с использованием метрик нагрузки для оптимальной балансировки ресурсов. Service Fabric перемещает экземпляры вашей службы, чтобы обеспечить максимальную доступность даже во время обновлений, отработки отказов, масштабирования и других ситуаций, которые возникают за время существования распределенной системы.
По мере перемещения служб в кластере ваши клиенты и другие службы должны быть готовы к двум сценариям, возникающим при взаимодействии со службой.
- Экземпляр службы или реплика раздела перемещены с момента последнего обмена данными с ними. Это характерно для жизненного цикла службы и вполне может произойти в течение жизненного цикла приложения.
- Экземпляр службы или реплика раздела перемещается. Хотя отработка отказа службы с одного узла на другой выполняется в Service Fabric очень быстро, возможны задержки в доступности, если компонент связи службы медленно запускается.
Для бесперебойной работы системы важно правильно обрабатывать такие сценарии. Чтобы сделать это, помните следующее.
- Каждая служба, к которой можно подключиться, имеет адрес для прослушивания (например, HTTP или WebSockets). При перемещении экземпляра или раздела службы меняется адрес соответствующей конечной точки (Перемещается на другой узел с другим IP-адресом.) Если вы используете встроенные компоненты связи, они будут автоматически обрабатывать повторно разрешающиеся адреса служб.
- Может наблюдаться временное увеличение задержки, так как экземпляр службы снова запускает свой прослушиватель. Это зависит от того, насколько быстро служба открывает прослушиватель после перемещения экземпляра службы.
- При открытии службы на новом узле все существующие подключения потребуется закрыть и открыть заново. Нормальное завершение работы (или перезапуск узла) предоставляет достаточно времени для нормального завершения работы существующих подключений.
Тестирование. Перемещение экземпляров службы
С помощью средств тестирования в Service Fabric можно создать сценарий тестирования для проверки этих ситуаций разными способами.
Переместите первичную реплику службы с отслеживанием состояния.
Первичную реплику раздела службы с отслеживанием состояния может понадобиться переместить по ряду причин. Используйте это применительно к первичной реплике определенного раздела, чтобы посмотреть, как ваши службы реагируют на перемещение, полностью их контролируя.
PS > Move-ServiceFabricPrimaryReplica -PartitionId 6faa4ffa-521a-44e9-8351-dfca0f7e0466 -ServiceName fabric:/MyApplication/MyService
Остановите работу узла.
Когда работа узла будет остановлена, Service Fabric переместит все экземпляры или разделы службы, которые находились на этом узле, на один из других доступных узлов в кластере. Используйте это при проверке ситуации, при которой узел теряется для кластера, что приводит к необходимости переместить все экземпляры служб и реплики на этом узле.
Узел можно остановить с помощью следующего командлета PowerShell Stop-ServiceFabricNode :
PS > Stop-ServiceFabricNode -NodeName Node_1
Поддержание доступности службы
Платформа Service Fabric обеспечивает высокую доступность служб. Но в исключительных случаях проблемы с базовой инфраструктурой все еще могут привести к недоступности. Эти сценарии также важно проверить.
В службах с отслеживанием состояния используется система на основе кворума для репликации данных о состоянии и обеспечения высокого уровня доступности. Это значит, что для выполнения операций записи кворум реплик должен быть доступным. В редких случаях, например при масштабном сбое оборудования, кворум реплик может быть недоступен. В этом случае вы не сможете выполнять операции записи, но по-прежнему будете иметь возможность выполнять операции чтения.
Тестирование. Недоступность операции записи
Средства тестирования в Service Fabric позволяют выполнять проверку путем внесения ошибки, которая приводит к потере кворума. Хотя такие случаи возникают редко, клиенты и службы, которые зависят от службы с отслеживанием состояния, должны быть готовы к ситуациям, когда они не смогут отправлять запросы на запись в эту службу. Также следует помнить, что сама служба с отслеживанием состояния знает о такой возможности и может надлежащим образом сообщить о ней вызывающим сторонам.
Потерю кворума можно вызвать с помощью командлета PowerShell Invoke-ServiceFabricPartitionQuorumLoss :
PS > Invoke-ServiceFabricPartitionQuorumLoss -ServiceName fabric:/Myapplication/MyService -QuorumLossMode QuorumReplicas -QuorumLossDurationInSeconds 20
В этом примере мы задаем для параметра QuorumLossMode
значение QuorumReplicas
, чтобы указать, что нам нужно вызвать потерю кворума без отключения всех реплик. Таким образом выполнение операций чтения по-прежнему возможно. Чтобы протестировать сценарий, при котором недоступен весь раздел, для этого параметра можно задать значение AllReplicas
.
Следующие шаги
Дополнительные сведения о действиях, доступных благодаря подсистеме тестирования