У меня следующая настройка AWS:
- Кластер ECS с 2 экземплярами EC2, каждый из которых работает в своей собственной подсети, которые находятся в другой зоне доступности.
- Несколько микросервисов, которые выполняют только одну задачу, так как они сохраняют состояние.
- Один внутренний балансировщик нагрузки приложений с целевыми группами для каждой микрослужбы, сопоставленной портам.
Теперь представьте следующий сценарий: Служба 1 хочет связаться со Службой 2, которая работает на другом экземпляре EC2 в другой зоне доступности. В качестве URL-адреса службы 2 я использую DNS-имя балансировщика нагрузки с портом: internal-load-balancer:8082/path
. Это необходимо, поскольку я использую скользящее развертывание, поэтому микросервисы перемещаются между двумя экземплярами EC2 после каждого развертывания.
Теперь, если я выполню host internal-load-balancer
, я верну 2 IP-адреса, один для балансировщика нагрузки, работающего в подсети 1, и один, работающий в подсети 2:
- 10.0.0.11
- 10.0.32.11
Если я сейчас выполню следующие команды curl на Сервисе 1:
curl 10.0.0.11:8082/
Я возвращаю тайм-аут шлюзаcurl 10.0.32.11:8082/
работает, как ожидалось, и я получаю 200curl 10.0.32.10:8082/
Также работает
Так почему, черт возьми, это работает, если я использую балансировщик нагрузки в той же подсети, но не в другой? Это также работает, если я напрямую связываюсь с экземплярами EC2 в другой зоне доступности. Проблема в том, что запись DNS разрешается как для IP-адресов, так и микросервис просто случайным образом использует один из них, поэтому половина моих запросов работает, а другая половина тайм-аута.
Так что я здесь делаю не так ??? Заранее благодарим за вашу поддержку :)