У меня есть два контейнера докеров, которые пытаются общаться с другим, используя веб-запросы, но испытывают случайную задержку. Во время отладки я разбил проблему на медленное время подключения к сокету, запустив простой сервер сокетов в одном
импортный сокет
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('0.0.0.0', 80))
serversocket.listen(5)
пока верно:
(клиентский сокет, адрес) = serversocket.accept()
print((клиентский сокет, адрес))
clientsocket.shutdown(socket.SHUT_RDWR)
clientsocket.close()
и многократно привязываться к нему от другого, распечатывая, сколько времени требуется для подключения
импортный сокет
а=время.время()
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("другой-контейнер", 80))
печать (время. время () - а)
То, что я вижу, это время соединения, например:
0.0009965896606445312
0.0010194778442382812
0.0009961128234863281
0.0009963512420654297
0.0010194778442382812
0.0010199546813964844
3.0038609504699707
0.0005102157592773438
Что интересно, если я использую 2 клиента и неоднократно подключаюсь к одному до тех пор, пока он не столкнется с этой загадочной задержкой, а затем немедленно переключаюсь на другой, он может подключаться к серверу (даже несколько раз), в то время как другой все еще заблокирован, пытаясь подключить.
Несколько особенностей архитектуры: оба хоста представляют собой контейнеры Windows, работающие в Docker EE с использованием сети Docker NAT по умолчанию.
Также стоит указать, что я вижу эти задержки даже при подключении с использованием прямых IP-адресов (без DNS)
Что бы это ни стоило, я также вижу эту проблему, используя Apache для обратного прокси-веб-запросов от одного к другому, где большинство запросов выполняются мгновенно, тогда как другие зависают на секунды (моя исходная проблема)
Редактировать:
Далее в моем тестировании я также подтвердил, что проблема также существует, если я запускаю свой маленький клиент для тестирования сокетов с хоста, подключаясь к серверу сокетов, работающему в контейнере, а также наоборот (сервер на хосте и клиент в контейнере). )