Внутренняя конечная точка веб-роли Azure — без балансировки нагрузки

В документации Azure говорится, что внутренние конечные точки в веб-роли не будут сбалансированы по нагрузке. Каковы практические последствия этого?

Пример: у меня есть веб-роль с 20 экземплярами. Если я определяю внутреннюю конечную точку для этой веб-роли, какова внутренняя реализация? Например, будут ли все 20 экземпляров обслуживать эту конечную точку? Могу ли я получить конкретную конечную точку для каждого экземпляра?

У нас есть уникальное требование обратного вызова, которое можно было бы хорошо удовлетворить, используя обычное поведение балансировки нагрузки на общедоступной конечной точке, но при этом каждый экземпляр предоставляет внутреннюю конечную точку. Судя по опубликованным данным об ограничениях конечных точек, это невозможно. Итак, при определении внутренней конечной точки это «1 на экземпляр» или как? Все ли экземпляры ролей обслуживают конечную точку? Что имеет в виду Microsoft, когда говорит, что внутренняя конечная точка не сбалансирована по нагрузке? Весь трафик идет только к одному экземпляру? Это не имеет смысла.


person Pittsburgh DBA    schedule 09.09.2012    source источник


Ответы (3)


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

Теперь о различиях между EndPoints. У меня есть запись в блоге с их описанием здесь. Но вкратце, Internal EndPoint будет открывать связь только внутри в рамках развертывания. Вот почему это Внутреннее. Никакой внешний трафик (из Интернета) не сможет перейти на внутреннюю конечную точку. В этом смысле балансировка нагрузки не выполняется, потому что трафик не проходит через/через балансировщик нагрузки! Трафик внутренних конечных точек проходит только между экземплярами ролей (в конечном итоге через некоторые внутренние аппаратные средства маршрутизации), но никогда не выходит за пределы развертывания. При этом уже должно быть ясно, что никакой интернет-трафик не может быть отправлен на внутреннюю конечную точку.

Дополнительное примечание: InputEndpoint, однако, можно обнаружить в Интернете и внутри развертывания. Но он является LoadBalanced, поскольку трафик к InputEndpoint поступает через/через LoadBalancer из Интернета.

Вернемся к числам. Допустим, у вас есть 1 веб-роль с 1 входной конечной точкой и 1 внутренней конечной точкой. Таким образом, в вашем развертывании будет 2 конечных точки. Даже если вы развернете 50 экземпляров, у вас останется только 2 EndPoints, которые учитываются при подсчете общего лимита EndPoints.

Можете ли вы получить конкретную EndPoint для конкретного экземпляра - конечно, да! через класс RoleEnvironemnt. Он имеет перечисление ролей. Каждая роль имеет экземпляры, и каждый экземпляр имеет Конечные точки экземпляра.

Надеюсь это поможет!

person astaykov    schedule 09.09.2012
comment
Конечные точки экземпляра! Проголосовал. Спасибо. Кроме того, вы пояснили, что ограничение конечной точки и экземпляра лучше, чем 100 блогов. Я задавался вопросом, как ограничение в 5 было вообще разумным, учитывая, что у меня может быть 20 серверов (или больше) в роли. - person Pittsburgh DBA; 10.09.2012

Конечные точки определяются на уровне ролей и создаются для каждого экземпляра.

Входная конечная точка имеет общедоступный IP-адрес, что делает ее доступной из Интернета. Трафик к этой входной конечной точке распределяется по нагрузке (с помощью алгоритма циклического перебора) среди всех экземпляров роли, на которых размещается конечная точка.

Внутренняя конечная точка не имеет общедоступного IP-адреса и доступна только внутри облачной службы ИЛИ виртуальная сеть, включая эту облачную службу. Windows Azure не распределяет трафик по балансировке нагрузки на внутренние конечные точки — каждая конечная точка экземпляра роли должна быть адресована отдельно. У Райана Данна есть хороший пост, показывающий простой пример реализации взаимодействия с балансировкой нагрузки. с внутренней конечной точкой, на которой размещается служба WCF.

В выпуске Spring Wave представлена ​​предварительная версия конечной точки ввода экземпляра, которая является общедоступной конечной точкой IP, порт которой перенаправляется на конкретный экземпляр роли. Это, очевидно, не балансирует нагрузку, но обеспечивает способ прямого подключения к конкретному экземпляру.

person Neil Mackenzie    schedule 09.09.2012

Просто пытаюсь сделать вещи более краткими и конкретными:

// get a list of all instances of role "MyRole"
var instances = RoleEnvironment.Roles["MyRole"].Instances;

// pick an instance at random
var instance = instances[new Random().Next(instances.Count())];

// for that instance, get the IP address and port for the endpoint "MyEndpoint"
var endpoint = instance.InstanceEndpoints["MyEndpoint"].IPEndpoint;

Думайте о внутренних конечных точках как о механизме обнаружения других ваших виртуальных машин.

person user94559    schedule 09.09.2012
comment
Спасибо. Это хороший пример. Может ли экземпляр веб-роли знать свою конечную точку или каким-то образом передавать достаточно информации, чтобы рабочая роль могла вызвать обратный вызов для этого конкретного экземпляра? Это то, что нам нужно. В идеале мы хотели бы, чтобы веб-роль могла помещать что-то в полезную нагрузку сообщения, чтобы рабочая роль могла напрямую обращаться к этому экземпляру веб-роли, у которого будет спящий поток. - person Pittsburgh DBA; 10.09.2012
comment
RoleEnvironment.CurrentRoleInstance.InstanceEndpoints[Endpoint1] — это конечная точка для текущего экземпляра роли (т. е. собственная конечная точка). Для конечных точек других инстансов проходим Роли, а потом каждый инстанс - ref. мой ответ). Однако не рекомендуется работать с конкретными экземплярами. - person astaykov; 10.09.2012
comment
@astaykov в этом случае я должен работать с конкретным экземпляром, потому что именно этот экземпляр удерживает соединение с клиентом, и его нужно уведомить. Если этот экземпляр умирает позже, это не имеет значения, потому что единственные процессы, затрагивающие этот экземпляр, — это те, которым экземпляр специально дает указание сделать это. - person Pittsburgh DBA; 10.09.2012
comment
Вы также можете использовать RoleEnvironment.CurrentRoleInstance.Id для идентификации экземпляра. Тогда вы можете просто искать его так: RoleEnvironment.Roles["MyRole"].Instances.Where(i => i.Id == targetId).Single(). - person user94559; 11.09.2012
comment
@smarx Спасибо за совет. Это будет весьма кстати. - person Pittsburgh DBA; 16.09.2012