Trong ngữ cảnh của các dịch vụ web, tôi đã thấy thuật ngữ "kết nối TCP" được sử dụng. Cụ thể, Twitter finagle có các cách để tránh điều đó xảy ra. Nó xảy ra như thế nào? Nó có nghĩa là gì?Có nghĩa là gì đối với các kết nối TCP bị gián đoạn?
Trả lời
Có thể có nhiều công dụng cho thuật ngữ này, nhưng tôi luôn thấy nó được sử dụng trong trường hợp nhiều kết nối TCP đang được thực hiện trong một khoảng thời gian rất ngắn, gây ra các vấn đề về hiệu suất trên máy khách và máy chủ .
Điều này thường xảy ra khi mã máy khách được viết tự động kết nối trên một lỗi TCP thuộc bất kỳ loại nào. Nếu lỗi này xảy ra là lỗi kết nối trước khi kết nối được thực hiện (hoặc rất sớm trong trao đổi giao thức) thì máy khách có thể đi vào vòng lặp bận rộn liên tục tạo kết nối. Điều này có thể gây ra các vấn đề về hiệu suất ở phía máy khách - trước hết là có một quá trình trong một vòng lặp rất bận rộn, thu hút các chu trình CPU, và thứ hai là mỗi lần kết nối tiêu thụ một số cổng phía máy khách - nếu điều này đủ nhanh phần mềm có thể quấn quanh khi họ nhấn số cổng tối đa (như một cổng chỉ là một số 16-bit, điều này chắc chắn là không thể).
Trong khi viết mã mạnh mẽ là một mục tiêu xứng đáng, phương pháp "thử lại tự động" đơn giản này hơi quá ngây thơ. Bạn có thể thấy các vấn đề tương tự trong các ngữ cảnh khác - ví dụ: một quá trình cha mẹ liên tục khởi động lại một tiến trình con mà ngay lập tức bị treo. Một cơ chế phổ biến để tránh nó là một số loại tăng trở lại. Vì vậy, khi kết nối đầu tiên không thành công, bạn sẽ kết nối lại ngay lập tức. Nếu không thành công trong vòng một thời gian ngắn (ví dụ: 30 giây) thì bạn sẽ đợi, giả sử, 2 giây trước khi kết nối lại. Nếu không thành công trong vòng 30 giây, bạn sẽ đợi 4 giây, v.v. Đọc the Wikipedia article on exponential backoff (hoặc this blog post có thể phù hợp hơn cho ứng dụng này) để biết thêm thông tin cơ bản về kỹ thuật này. Cách tiếp cận này có lợi thế là nó không áp đảo khách hàng hoặc máy chủ, nhưng nó cũng có nghĩa là khách hàng vẫn có thể phục hồi mà không cần sự can thiệp thủ công (ví dụ, đặc biệt quan trọng đối với phần mềm trên máy chủ không cần giám sát). cụm).
Trong trường hợp thời gian khôi phục rất quan trọng, việc giới hạn tốc độ tạo kết nối TCP đơn giản cũng khá khả thi - có thể không quá 1 mỗi giây hoặc thứ gì đó. Tuy nhiên, nếu có nhiều máy khách trên mỗi máy chủ, cách tiếp cận đơn giản hơn này vẫn có thể khiến máy chủ bị tràn ngập bởi tải chấp nhận rồi đóng một tỷ lệ kết nối cao. Một điều cần lưu ý nếu bạn định sử dụng backoff theo cấp số nhân - tôi đề nghị áp dụng thời gian chờ tối đa hoặc bạn có thể thấy rằng lỗi kéo dài khiến khách hàng mất quá nhiều thời gian để phục hồi sau khi kết thúc máy chủ bắt đầu chấp nhận lại kết nối. Tôi sẽ đề nghị một cái gì đó như 5 phút như là một tối đa hợp lý trong hầu hết trường hợp, nhưng tất nhiên nó phụ thuộc vào ứng dụng.
- 1. Ngắt gián đoạn là gì?
- 2. Làm thế nào để thả các đường kết nối nơi chức năng bị gián đoạn
- 3. Làm thế nào để nói nếu JQuery Lỗi Có nghĩa là cuộc gọi bị gián đoạn
- 4. WatiN có bị gián đoạn không?
- 5. Sao chép tập tin qua kết nối mạng gián đoạn
- 6. Có ý nghĩa gì đối với đoạn mã này không?
- 7. Kết nối gián đoạn Đặt lại bởi lỗi ngang hàng trong Android kết nối với .NET REST endpoint
- 8. Boost :: asio - làm thế nào để làm gián đoạn một chuỗi máy chủ tcp bị chặn?
- 9. Cách Spring sử dụng kết nối TCP là gì?
- 10. Kết nối WebSocket bị gián đoạn khi Apache HTTPD ở phía trước của Tomcat
- 11. Chính xác "kết nối liên tục" có nghĩa là gì?
- 12. Các tham số đối với CGPathAddCurveToPoint có nghĩa là gì?
- 13. Phát hiện loại iPhone bị gián đoạn
- 14. Làm gián đoạn một chuỗi trong DatagramSocket.receive
- 15. luồng JavaScript có thể thực thi bị gián đoạn không?
- 16. Kết nối TCP, chỉ bash
- 17. cách tiếp tục tải xuống bị gián đoạn
- 18. Cuộc sống kết nối TCP
- 19. Chuyển hướng kết nối TCP
- 20. Mở rộng gián tiếp là gì? $ {! Var *} có nghĩa là gì?
- 21. D3.js: Ngừng chuyển tiếp bị gián đoạn?
- 22. Ngữ cảnh lối ra có nghĩa là gì đối với WaitHandle.WaitOne nghĩa là gì?
- 23. Kết nối TCP/IP qua DataSnap
- 24. Các phương pháp BlockingQueue có luôn ném một InterruptedException khi thread bị gián đoạn không?
- 25. kết nối TCP treo trên status CLOSE_WAIT
- 26. thiết lập gián đoạn cổng nối tiếp trong linux
- 27. Kết nối với SQL Server từ java với TCP bị vô hiệu hóa
- 28. Loại `*` có nghĩa là gì đối với __vfptr?
- 29. "WebSocket bị đóng trước khi kết nối được thiết lập" nghĩa là gì?
- 30. 'args' có nghĩa là gì đối với CliBuilder?
Làm cho tinh thần - điều này chắc chắn có thể là một vấn đề đối với dịch vụ với phía máy khách không thể truy cập (các) máy chủ khác. Cảm ơn câu trả lời của bạn! – eman