У нас есть служба .NET, размещенная в Azure (в настоящее время на виртуальной машине, а затем в качестве веб-задания), которая выполняет запросы HTTP / HTTPS к внешней общедоступной службе через сторонний API. В целях масштабируемости и надежности (поскольку служба ненадежна и, вероятно, будет недоступна в течение более длительных периодов времени при слишком большом количестве запросов), мы хотели бы сбалансировать нагрузку на эту службу.
Я думаю, что это гораздо лучше решается с помощью инфраструктуры, чем с помощью кода, но я не знаю достаточно об инфраструктуре, предлагаемой Azure, чтобы знать, может ли это быть решено даже с помощью инфраструктуры. Я прочитал обзорные документы о Azure load Balancer , но они говорят только о балансировке запросов в Azure (общедоступная и внутренняя балансировка нагрузки), а не о запросах, выходящих из это в интернет.
Итак, предлагает ли Azure некоторую инфраструктуру, позволяющую мне балансировать запросы, поступающие из моего приложения в Интернет?
Конкретные требования:
- Сопоставить одну конечную точку HTTP с числом настроенных конечных точек, в идеале с использованием настроенных весов (то есть выбрать конечную точку A в 66% случаев, конечную точку B в 22%, конечную точку C в 12%).
- Когда одна из настроенных конечных точек выходит из строя, прозрачно переключается на другую конечную точку и игнорирует отказавшую в течение некоторого времени.
Обновление (2018-05-06): @ kim, приведенный ниже, привлек мое внимание к диспетчеру трафика Azure, который использует балансировку нагрузки на основе DNS и опрос для автоматического переключения при сбое. Вероятно, это стандартный способ балансировки нагрузки, но идеальным решением для моей проблемы был бы прокси-сервер, который получает запросы, воспроизводит их на одной из конечных точек с балансировкой нагрузки, обнаруживает сбои прямо для одного запроса и немедленно переключается на другой ресурс, повторить запрос с другой конечной точкой. Таким образом, вызывающее приложение никогда не заметит, что что-то не так, если не будет рабочей конечной точки. Я понимаю, что это, вероятно, слишком специфично для моей проблемы, чтобы иметь стандартное инфраструктурное решение, но я все равно добавляю это, на всякий случай ...