ฉันมีคอนเทนเนอร์นักเทียบท่าสองคอนเทนเนอร์ที่พยายามคุยกับอีกคอนเทนเนอร์หนึ่งโดยใช้คำขอเว็บ แต่ประสบปัญหาเวลาแฝงแบบสุ่ม ในขณะที่ทำการดีบั๊ก ฉันได้แบ่งปัญหาออกเป็นเวลาในการเชื่อมต่อซ็อกเก็ตที่ช้า โดยเรียกใช้เซิร์ฟเวอร์ซ็อกเก็ตอย่างง่ายในเครื่องเดียว
ซ็อกเก็ตนำเข้า
เซิร์ฟเวอร์ซ็อกเก็ต = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('0.0.0.0', 80))
serversocket.listen(5)
ในขณะที่ทรู:
(clientsocket ที่อยู่) = serversocket.accept()
พิมพ์ ((clientsocket, ที่อยู่))
clientsocket.shutdown(ซ็อกเก็ต.SHUT_RDWR)
clientsocket.close()
และผูกซ้ำกับอีกอันหนึ่งโดยพิมพ์ว่าใช้เวลานานเท่าใดในการเชื่อมต่อ
ซ็อกเก็ตนำเข้า
a=time.time()
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("คอนเทนเนอร์อื่น", 80))
พิมพ์ (time.time () - ก)
สิ่งที่ฉันเห็นคือเวลาการเชื่อมต่อเช่น:
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 เพื่อย้อนกลับคำขอเว็บพร็อกซีจากที่หนึ่งไปยังอีกที่หนึ่ง โดยที่คำขอส่วนใหญ่ดำเนินการเสร็จสิ้นทันที ในขณะที่คำขออื่นๆ หยุดทำงานเป็นเวลาไม่กี่วินาที (ปัญหาดั้งเดิมของฉัน)
แก้ไข:
นอกจากนี้ในการทดสอบของฉัน ฉันได้ยืนยันด้วยว่าปัญหายังมีอยู่หากฉันรันไคลเอ็นต์ทดสอบซ็อกเก็ตขนาดเล็กของฉันจากโฮสต์ เชื่อมต่อกับเซิร์ฟเวอร์ซ็อกเก็ตที่ทำงานในคอนเทนเนอร์ เช่นเดียวกับในทางกลับกัน (เซิร์ฟเวอร์บนโฮสต์และไคลเอนต์ในคอนเทนเนอร์ )