Câu hỏi chung của tôi là: Sử dụng Redis cho PubSub, điều gì xảy ra với thông báo khi nhà xuất bản đẩy tin nhắn vào kênh nhanh hơn người đăng ký có thể đọc chúng?Redis Pubsub và Message Queuing
Ví dụ, giả sử tôi có:
- Một đơn giản thông điệp xuất bản xuất bản ở mức 2 msg/giây.
- Một thuê bao đơn giản đọc tin nhắn với tốc độ 1 msg/giây.
Giả thiết ngây thơ của tôi sẽ là người đăng ký sẽ chỉ thấy 50% tin nhắn được xuất bản lên Redis. Để kiểm tra giả thuyết này, tôi đã viết hai kịch bản:
pub.py
queue = redis.StrictRedis(host='localhost', port=6379, db=0)
channel = queue.pubsub()
for i in range(10):
queue.publish("test", i)
time.sleep(0.5)
sub.py
r = redis.StrictRedis(host='localhost', port=6379, db=0)
p = r.pubsub()
p.subscribe('test')
while True:
message = p.get_message()
if message:
print "Subscriber: %s" % message['data']
time.sleep(1)
Kết quả
- Khi tôi chạy
sub.py
đầu tiên, ngay lập tức theo saupub.py
, tôi thấy rằngsub.py
thực sự hiển thị tất cả các tin nhắn (1-10), cái khác với độ trễ 1 giây ở giữa. Giả định ban đầu của tôi là sai, Redis đang xếp hàng. Cần kiểm tra thêm. - Khi tôi chạy
pub.py
trước, sau đó đợi 5 giây trước khi chạysub.py
, tôi thấy rằngsub.py
chỉ hiển thị nửa sau của thư (5-10). Tôi đã có thể giả định này ban đầu, nhưng với kết quả trước đây của tôi, tôi sẽ có tin nhắn suy nghĩ được xếp hàng đợi, dẫn tôi đến kết luận sau đây ...
Kết luận
- Redis máy chủ dường như thông điệp xếp hàng cho từng khách hàng, cho mỗi kênh.
- Miễn là khách hàng đang nghe, việc đọc tin nhắn không quan trọng đến mức nào. Miễn là nó được kết nối, tin nhắn sẽ vẫn được xếp hàng đợi cho khách hàng đó, cho kênh đó.
Câu hỏi còn lại
- Là những kết luận hợp lệ?
- Nếu có, thông báo khách hàng/kênh sẽ vẫn được xếp hàng trong bao lâu?
- Nếu có, có một lệnh
redis-cli info
để xem có bao nhiêu thư được xếp hàng đợi (cho mỗi khách hàng/kênh) không?
"Có câu trả lời mới cho câu hỏi - nhấp vào _đây_ để tải câu hỏi" - bạn nhập nhanh hơn tôi và đưa ra câu trả lời tuyệt vời :) –
Xin lỗi :-) Tôi được thúc đẩy bởi câu hỏi! –
Câu trả lời rất hay! Có thể vô hiệu hóa bộ đệm Redis hoàn toàn và chỉ nhận dữ liệu thực tế trên sự kiện mới (ví dụ: cập nhật thị trường chứng khoán) ngay cả khi mất dữ liệu trước đó để đảm bảo dữ liệu được cập nhật nhất? –