2012-12-15 30 views
6

Vì dường như không thể truy vấn/kiểm tra các hàng đợi ZeroMQ/bộ đệm đệm để xem chúng được sử dụng bao nhiêu, có cách nào để phát hiện khi thư bị xóa do đầy bộ đệm trong ổ cắm Nhà xuất bản khi được gửi/xếp hàng?Phát hiện thư bị rớt trong Hàng đợi ZeroMQ

Ví dụ: nếu hàng đợi của nhà xuất bản đã đầy, thao tác zmq_send sẽ đơn giản thả tin nhắn. Về cơ bản, những gì tôi muốn đạt được là một cách để phát hiện tình huống mà hàng đợi đang bị căng thẳng và/hoặc đầy đủ để có thể (sau này) điều chỉnh giải pháp để hoạt động tốt hơn. Một cách khác là thêm số thứ tự vào mỗi thư và thực hiện phép tính đơn giản trong người đăng ký nhưng tôi không bao giờ có thể chắc chắn rằng thư bị mất do bộ đệm đầy đủ trong nhà xuất bản.

+0

Có một nguồn cấp dữ liệu thực sự thú vị trả lời: Trong những trường hợp nào các ổ cắm zeromq bị rơi hoặc không gửi được tin nhắn? : http://stackoverflow.com/questions/9909909/under-what-circumstances-do-zeromq-sockets-drop-or-fail-to-deliver-messages Có lẽ điều thú vị đối với u – eMarine

Trả lời

6

Có một ví dụ cho điều này trong Hướng dẫn ZeroMQ (mà bạn nên đọc và tiêu hóa nếu bạn muốn sử dụng 0MQ hạnh phúc): http://zguide.zeromq.org/page:all#Slow-Subscriber-Detection-Suicidal-Snail-Pattern

Cơ chế là khi bạn đã trả lời cho mình, để thêm một số thứ tự trong và cho phép người đăng ký phát hiện khoảng trống và thực hiện hành động thích hợp. Đối với hầu hết các kịch bản pubsub, bạn có thể tăng HWM mặc định, là 1.000, cho một cái gì đó cao hơn nhiều; nó phụ thuộc vào kích thước tin nhắn trung bình của bạn.

+0

RIP Pieter. Nhưng câu trả lời này là không thể chấp nhận được. ZMQ nên cung cấp cho chúng tôi một cách để kiểm tra xem thư có được gửi hay không. – James

1

Tôi biết đây là một bài đăng cũ nhưng đây là những gì tôi đã làm khi gần đây phải đối mặt với cùng một vấn đề.

tôi chọn sử dụng một DEALER/ROUTER và thiết lập các tùy chọn ZMQ_SNDHWM để 1. Ngoài ra tôi cung cấp các thông số thời gian chờ trên mỗi zmq_send(). Thời gian chờ có thể là bất cứ điều gì giữa 10 ms đến 3 giây, tùy thuộc vào kịch bản của bạn là gì (gửi cục bộ hoặc từ xa).

Nếu thư không được gửi trong khoảng thời gian chờ hoặc bộ đệm gửi đầy, zmq_send() sẽ trả về sai. Điều đó cho phép tôi thiết lập hàng đợi thử lại trước zmq. Tôi biết nó không phải là một giải pháp hoàn hảo nhưng đối với tôi nó đã làm việc tốt. Những gì tôi câu đố mặc dù là ý nghĩa của sự thật/sai trả lại bởi DEALER -socket zmq_send(). Tôi đã không thể tìm ra câu trả lời cho câu hỏi đó. Cho dù nó chỉ ra rằng tin nhắn đã được đệm hoặc tin nhắn đã được gửi đến ROUTER đã làm tôi thất vọng. Trong trường hợp của tôi, tôi đã nhận được kết quả cần thiết.

Chỉ để ghi lại điều này được thực hiện bằng cách sử dụng netmq nhưng tôi đoán nó cũng áp dụng cho ZeroMQ.

Tôi đồng ý với james. ZeroMQ (và netmq) nên ít nhất là cung cấp một cách để kiểm tra hàng đợi (và nhận được các tin nhắn ra) và cũng là một cách để nói với các ổ cắm khác nhau không để thả tin nhắn. Tùy chọn tốt nhất là gửi tin nhắn không được gửi đúng lúc theo các tùy chọn được định cấu hình cho một số loại hàng đợi bản tin. Hàng đợi bản tin sau đó có thể được xử lý riêng.

Các vấn đề liên quan