Сетевое взаимодействие Azure между экземплярами одной роли

Могут ли несколько экземпляров одной и той же роли общаться друг с другом, получив VIP-адрес (виртуальный IP-адрес) для определенной конечной точки, прослушиваемой всеми этими экземплярами из RoleEnvironment? Если это так, возвращаемый VIP может быть сбалансирован по нагрузке для экземпляра вызывающей стороны (из RoleEnvironment методов).


person Ahmet Alp Balkan    schedule 01.05.2013    source источник
comment
Да — это ответ на ваш первый вопрос, если вы имеете в виду получение IP-адреса для каждого экземпляра. См. эту ссылку. Я не понимаю вашего второго вопроса.   -  person Jaxidian    schedule 01.05.2013
comment
Предположим, у вас есть роль A и ее экземпляры roleA_in1 и roleA_in2. Когда _in1 запрашивает IP-адрес конечной точки и отправляет ему, скажем, TCP-пакеты, а между тем эти экземпляры прослушивают этот порт, может ли балансировщик нагрузки направлять TCP-трафик на тот же самый экземпляр?   -  person Ahmet Alp Balkan    schedule 01.05.2013


Ответы (1)


Экземпляры ролей могут взаимодействовать друг с другом через внутренние конечные точки. В отличие от входных конечных точек, они видны только другим экземплярам в рамках развертывания (независимо от роли).

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

Работать с внутренними конечными точками так же просто, как с входными конечными точками. Сначала настройте один: введите здесь описание изображения

Затем возьмите одну наугад. Например (в самом грубом смысле этого слова):

        var random = new Random();
        var role = RoleEnvironment.Roles["WorkerRole1"];
        var instanceNumber = random.Next() % role.Instances.Count;
        var ipendpoint = role.Instances[instanceNumber].InstanceEndpoints["myservice"].IPEndpoint;
        var address = ipendpoint.Address;
        var port = ipendpoint.Port;

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

person David Makogon    schedule 01.05.2013
comment
Отличный ответ Дэвид, спасибо. Два дополнительных вопроса: как бы вы предотвратили получение экземпляром собственной конечной точки? Прямо сейчас вы выбираете его случайным образом, если вы получаете IP-адрес текущего экземпляра и делаете запрос к этой службе, этот запрос выходит из вашей машины и направляется во внутреннюю сеть? (потому что это не должно делать, я думаю.) - person Ahmet Alp Balkan; 02.05.2013
comment
Благодаря облачным службам (экземпляры веб-ролей и рабочих ролей) вы полностью контролируете ситуацию. Если вы не определите внутренние конечные точки, ни одна из них не будет открыта, и экземпляры не смогут взаимодействовать друг с другом. Если вы не определите входные (внешние) конечные точки, трафик из внешнего мира не сможет достигать ваших экземпляров. Полностью зависит от вас. - person David Makogon; 02.05.2013
comment
Нет, ты меня неправильно понял. Допустим, у вас есть 3 экземпляра роли, и все они прослушивают одну внутреннюю конечную точку. (1) Как предотвратить получение экземпляром собственного IP-адреса от RoleEnvironment? (2) Если вы получаете свой собственный IP-адрес от RoleEnvironment и получаете доступ к сервису через этот IP-порт: покидают ли сетевые пакеты этот экземпляр виртуальной машины и возвращаются ли они с маршрутизатора или нет? (Я думаю, что они не должны, но я не уверен.) - person Ahmet Alp Balkan; 02.05.2013