Lập trình mạng Python: giao thức UDP (phần 10)

Không đáng tin cậy, backoff, phong toả và timeouts (tiếp tục)

Xin chú ý rằng nếu các requests đang thực hiện tới một server đó là, giả sử 200 một phần
nghìn giây đi khỏi, thuật toán bản địa này sẽ luôn gửi ít nhất hai bản sao của mỗi request,
mọi lần, vì nó sẽ không bao giờ biết rằng các requests tới server này luôn mất nhiều hơn 0.1
s. Nếu bạn đang viết một UDP client cái sống một thời gian dài, nghĩ về có nó nhớ bao lâu một
vài requests cuối phải mất để hoàn thành để rằng nó có thể hoãn lần thử lại đầu tiên của nó
cho đến khi server có đủ thời gian trả lời.
Khi bạn chạy client phần code trên, cung cấp cho nó hostname của máy khác trên đó bạn đang chạy
server script, như thể hiện trước đó. Đôi khi, client này sẽ may mắn và nhận một trả lời ngay lập
tức.

$ python udp_remote.py client guinness
Client socket name is (‘127.0.0.1’, 45420)
Waiting up to 0.1 seconds for a reply
The server says ‘Your data was 23 bytes long’

Tuy nhiên, nó thường thấy rằng một hay nhiều hơn các requests của nó không bao giờ dẫn đến các trả
lời, và nó sẽ phải thử lại. Nếu bạn theo dõi các thử lặp lại của nó cẩn thận, bạn thậm chí có thể
thấy exponential backoff xảy ra trong thời gian thực, khi các phát biểu in ra cái echo tới màn hình
ngày càng chậm như delay timer hình thành.

$ python udp_remote.py client guinness
Client socket name is (‘127.0.0.1’, 58414)
Waiting up to 0.1 seconds for a reply
Waiting up to 0.2 seconds for a reply
Waiting up to 0.4 seconds for a reply
Waiting up to 0.8 seconds for a reply
The server says ‘Your data was 23 bytes long’

Bạn có thể thấy trong terminal nơi bạn đang chạy server bất kể các requests đang thực sự tạo hay bất kể
bất cứ cơ hội nào bạn gặp một bỏ thực dữ liệu trên mạng của bạn. Khi bạn chạy test hướng đi, bạn có thể
nhìn vào console của server và thấy rằng tất cả các gói dữ liệu đã thực sự tạo nó.

Pretending to drop packet from (‘192.168.5.10’, 53322)
Pretending to drop packet from (‘192.168.5.10’, 53322)
Pretending to drop packet from (‘192.168.5.10’, 53322)
Pretending to drop packet from (‘192.168.5.10’, 53322)
The client at (‘192.168.5.10’, 53322) says, ‘This is another message’

Cái gì xảy ra nếu server bị down hoàn toàn? UDP cung cấp cho chúng ta không cách nào để phân biệt giữa một
server cái bị down và một mạng cái đơn giản là trong điều kiện kém như vậy cái nó đang bỏ tất các gói dữ liệu
của chúng ta hay các trả lời của chúng. Tất nhiên, tôi cho rằng chúng ta không nên đổ lỗi cho UDP cho vấn đề
này. Thế giới bản thân nó, sau cùng, cung cấp cho chúng ta không cách nào để phân biệt giữa thứ gì đó cái chúng
ta không thể phát hiện và thứ gì đó cái không tồn tại!. Nên, cái tốt nhất cái client có thể làm là từ bỏ một
khi nó làm đủ thử. Chấm dứt quá trình server, và thử chạy client một lần nữa.

$ python udp_remote.py client guinness
Client socket name is (‘127.0.0.1’, 58414)
Waiting up to 0.1 seconds for a reply
Waiting up to 0.2 seconds for a reply
Waiting up to 0.4 seconds for a reply
Waiting up to 0.8 seconds for a reply
Waiting up to 1.6 seconds for a reply
Traceback (most recent call last):

socket.timeout: timed out
The above exception was the direct cause of the following exception:
Traceback (most recent call last):

RuntimeError: I think the server is down

Chia sẻ