2016-04-13 6 views
0

Не могли бы вы дать мне лучшее представление о том, как мы можем масштабировать службы без состояния без разбиения на разделы?Масштабирование Azure сервисной ткани Услуги без гражданства

Скажем, у нас есть 5 узлов в кластере, и у нас есть 5 экземпляров службы. При простом тестировании узел ведет себя как липкий, где все запросы, которые я отправляю, обслуживаются только одним узлом. В сценарии, когда у нас большой объем запросов, которые входят, могут использоваться другие экземпляры для обслуживания трафика. Как мы справляемся с такими масштабными ситуациями в сфере обслуживания?

Спасибо!

ответ

1

Обычно нет необходимости использовать разделение для лиц без услуг SF, поэтому следует избегать, что если вы можете:

more on SF partitioning, including why its not normally used for stateless services

Если вы используете ServiceProxy API, он будет поддерживать липкие соединения с заданным физическим узла в кластере. Если вы (скажем) разоблачаете конечные точки HTTP, у вас будет один для каждого физического экземпляра в кластере (это означает, что вы в конечном итоге будете разговаривать по одному за раз, если только вы вручную не перекроете их). Вы можете избежать этого:

  1. Создание нового экземпляра прокси для каждого вызова, который имеет тенденцию быть дорогим, если вы делаете это много (или вручную цикл через список экземпляров конечных адресов, которые могут быть утомительным и/или дорогой)

  2. Поместите балансировщик нагрузки перед вашим кластером и настройте весь трафик от ваших клиентов на узлы SF, которые будут перенаправлены через это. Балансировки нагрузки могут быть сконфигурирована для Round-Robin, семантика и т.д. стиля:

Azure Load Balancer

Azure Traffic Manager

Успехов!

+0

Я использовал один экземпляр прокси для всех вызовов, и я думаю, именно поэтому я не смог попасть в другие узлы. Вы сказали: «Это будет дорого, если вы это сделаете». Я использую веб-службу, и конечная точка Api начнет создавать прокси-сервер, и эта конечная точка будет сильно ударить. Не рекомендуется ли это? @JoshL – Krishh

+1

Ты на правильном пути, да. Единственное, что следует учитывать, это то, что каждый экземпляр без сохранения в кластере будет иметь свою собственную уникальную конечную точку, поэтому, если вы хотите, чтобы запросы обрабатывались каким-либо экземпляром, вам понадобится какой-то механизм для обеспечения того, чтобы это произошло. SF не делает этого для вас (пока). Эти два подхода, о которых я упоминал выше, являются жизнеспособными для этого вариантами. – JoshL

+0

Если у меня есть веб-api и регулярная служба без состояния в кластере, мне все равно нужен балансировщик нагрузки при выполнении вызовов из веб-api в службу, чтобы не застревать с использованием одного узла при каждом вызове? –

1

Вы можете запросить запрос, используя обратный прокси-сервер, установленный на каждом узле. Использование https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reverseproxy

Обратный прокси затем разрешает конечную точку для вас. Если у вас есть несколько экземпляров службы без сохранения состояния, она будет перенаправлять ваш запрос на случайный.

Если во время большой нагрузки вы можете увеличить количество экземпляров вашей службы, а прокси-сервер автоматически включит новые экземпляры.

+0

Как я могу автоматически увеличить количество экземпляров во время загрузки, а затем уменьшить его? –

+0

У вас должно быть среднее значение для измерения нагрузки, а затем вызывать увеличение/уменьшение количества экземпляров. Вы можете создать приложение-наблюдатель, чтобы контролировать производительность (использование ЦП, количество сообщений очереди и т. Д.), А затем автоматически обновлять счетчик экземпляров. – duongthaiha

0

Предполагается, что вы вызываете свои услуги из-за пределов кластера. Если да, ваша проблема не специфична для Service Fabric, это Azure VMSS + LB.

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

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

Это режим распределения по умолчанию (Hash-based). Вы должны также проверить правила маршрутизации в LB, чтобы проверить, является ли режим распространения Hash-based (5 tuple = ip + port), или если это Режим аффинации IP (только ip), в противном случае несколько соединений от одного и того же IP все равно будет привязан к одному узлу.

Источник: Azure Load Balaner Distribution Mode

Смежные вопросы