我在zeromq中具有发布者订阅者体系结构。我使用python。
我需要能够分辨出一些队列何时将太满,并且最好能够对此做些什么。
我必须能够知道消息是否丢失。
但是,我无法找到与此主题相关的文档。
希望得到一些帮助
谢谢!
答案 0 :(得分:0)
这是我所做的摘要
def _flush_zmq_into_buffer(self):
# poll zmq for new messages. if any are found, put all possible items from zmq to self.buffer
# if many readers, need to use a read-write lock with writer priority
# http://code.activestate.com/recipes/577803-reader-writer-lock-with-priority-for-writers/
while True:
self._iteration += 1
self._flush_zmq_once()
sleep(0.005)
def _take_work_from_buffer(self):
while True:
try:
if self._buffer.qsize() > 0:
work_message = self._buffer.get(block=True)
# can't have any heavy operation here! this has to be as lean as possible!
else:
sleep(0.01)
continue
except queue.Empty as ex:
sleep(0.01)
continue
self._work_once(work_message)
def _flush_zmq_once(self):
self.__tick()
flushed_messages = 0
for i in range(self.max_flush_rate):
try:
message = self._parse_single_zmq_message()
self._buffer.put(message, block=True) # must block. can't lose messages.
except zmq.Again: # zmq empty
flushed_messages = i
break
self._log_load(flushed_messages)
self.__tock()
self.__print_flushed(flushed_messages)
这使我可以比解析消息快得多的速度将zmq缓冲区刷新到自己的缓冲区中,这样就不会丢失任何消息,并且需要支付延迟。
这也使我知道每个刷新周期从zmq刷新了多少条消息,从而了解了负载。
之所以使用轮询事件,是因为对于大量传入消息,事件系统比轮询系统的成本更高。最后一句话未经测试,但我相信这是真的。