tôi nhận thấy rằng một ổ cắm PUB zeromq sẽ đệm tất cả các dữ liệu gửi đi nếu nó là kết nối, ví dụZeroMQ PUB ổ cắm đệm tất cả ra tôi sẽ dữ liệu khi nó được kết nối
import zmq
import time
context = zmq.Context()
# create a PUB socket
pub = context.socket (zmq.PUB)
pub.connect("tcp://127.0.0.1:5566")
# push some message before connected
# they should be dropped
for i in range(5):
pub.send('a message should not be dropped')
time.sleep(1)
# create a SUB socket
sub = context.socket (zmq.SUB)
sub.bind("tcp://127.0.0.1:5566")
sub.setsockopt(zmq.SUBSCRIBE, "")
time.sleep(1)
# this is the only message we should see in SUB
pub.send('hi')
while True:
print sub.recv()
Tiểu liên kết sau những thông điệp, họ nên được loại bỏ, bởi vì PUB sẽ thả tin nhắn nếu không có ai kết nối với nó. Nhưng thay vì bỏ thư, nó sẽ lưu tất cả thư.
a message should not be dropped
a message should not be dropped
a message should not be dropped
a message should not be dropped
a message should not be dropped
hi
Như bạn thấy, những "tin nhắn không nên bỏ" được đệm bởi ổ cắm, sau khi được kết nối, nó sẽ đưa chúng vào ổ cắm SUB. Nếu tôi kết nối vào ổ cắm PUB, và kết nối tại ổ cắm SUB, thì nó hoạt động chính xác.
import zmq
import time
context = zmq.Context()
# create a PUB socket
pub = context.socket (zmq.PUB)
pub.bind("tcp://127.0.0.1:5566")
# push some message before connected
# they should be dropped
for i in range(5):
pub.send('a message should not be dropped')
time.sleep(1)
# create a SUB socket
sub = context.socket (zmq.SUB)
sub.connect("tcp://127.0.0.1:5566")
sub.setsockopt(zmq.SUBSCRIBE, "")
time.sleep(1)
# this is the only message we should see in SUB
pub.send('hi')
while True:
print repr(sub.recv())
Và bạn chỉ có thể nhìn thấy đầu ra
'hi'
Loại hành vi này lạ gây ra một vấn đề, nó đệm tất cả dữ liệu trên một ổ cắm kết nối, tôi có hai máy chủ, máy chủ A công bố dữ liệu đến máy chủ B
Server A -- publish --> Server B
Nó hoạt động tốt nếu máy chủ B trực tuyến. Nhưng nếu tôi khởi động Máy chủ A và không khởi động Máy chủ B thì sao?
Kết quả là, ổ cắm kết nối PUB trên Máy chủ A giữ tất cả dữ liệu đó, việc sử dụng bộ nhớ ngày càng cao.
Đây là vấn đề, loại hành vi này là lỗi hoặc tính năng? Nếu đó là tính năng, tôi có thể tìm tài liệu đề cập đến hành vi này ở đâu? Và làm thế nào tôi có thể ngừng kết nối ổ cắm PUB tất cả dữ liệu?
Cảm ơn.
Tôi biết tôi có thể đặt HWM để giới hạn số thư trong bộ đệm. Nhưng nó không giải quyết vấn đề, họ cách PUB xử lý HWM nhà nước là để thả tin nhắn mới. Nó có nghĩa là nếu bạn thiết lập HWM, chỉ có các tin nhắn hàng đầu được lưu giữ trong bộ đệm. Những gì tôi đang viết là hệ thống phát trực tuyến âm thanh. Loại hành vi này làm cho nó rất khó chịu khi sử dụng. Giả sử, bạn gửi tin nhắn [1, 2, 3, 4], và sau đó HWM được đặt thành 2, sau đó socket sẽ đệm [1, 2] cho bạn, tất cả các tin nhắn mới sẽ bị xóa. Nhưng đối với phát trực tuyến âm thanh, phần quan trọng nhất là dữ liệu mới đến. Có cách nào để điều chỉnh cách HWM giảm tin nhắn không? –
Ah, do đó, bạn có nghĩa là hành vi bạn muốn là nếu HWM được đặt thành 2 và bạn gửi [1, 2, 3, 4] thì nó sẽ thả [1, 2] và giữ [3, 4], nhưng sau đó nếu bạn gửi 5 nó sẽ thả 3 và bạn kết thúc với [4, 5]? Tôi không nghĩ rằng hành vi đó tồn tại trong ZMQ. – aculich
Điều này rất thú vị. Chắc chắn có khả năng để thả "cũ" tin nhắn sẽ là cần thiết cho một số ứng dụng (điện thoại IP đến với tâm trí như là một ví dụ phổ biến). –