问题描述
我在内存队列中运行多个进程。该队列是在Zookeeper中创建/删除的顺序znode的体现。
添加znode时,在所有涉及的进程中,等效项都会添加到队列中。而且,当删除znode时,等效的项也会在每个涉及的进程中从队列中删除。
由于最终应删除所有添加的项,因此希望可以平衡添加和删除信号。
我遇到了这样的情况,一个znode的添加和删除非常迅速,并且在添加通知之前的某个流程中收到了删除通知。因此发生了尝试删除该项目的尝试,但是失败了,因为它实际上并不存在,然后收到了添加信号,该信号添加了该项目,但是从未将其删除。
一个简单的解决方案是在将项目添加到队列后断言等效znode的存在,这对我来说已经足够了,但似乎效率不高。
我的问题是,是否有一种方法可以以更有效的方式或“动物园管理员”的方式来处理这种情况?
解决方法
您正试图将ZooKeeper用作不适合的消息队列。在ZooKeeper中,没有为观察者通知订购任何交付保证。 相反,在这种情况下,您应该使用诸如Kafka或RabbitMQ之类的消息传递系统。