我想在Python应用程序中使用AMPQ服务,但没有使用ZeroMQ。所以我想知道是否可以这样做:
可以这样做吗? ZeroMQ是否跟踪已发送的消息?如果在发送消息后进行订阅,ZMQ是否会检测应该接收哪些旧消息以及哪些不应该接收?
答案 0 :(得分:3)
如果您正在使用PUB-SUB连接(看起来好像在描述),那么快速回答是否定的。发布socket会丢弃邮件而不是排队。
即使您将套接字类型更改为PUSH和PULL,您仍然会遇到问题。是的,PUSH套接字将阻止未收到的消息,但由于您将连接另一个客户端,因此将发送该消息,因此如果其中一个客户端丢弃,则不会阻止该消息。使用PUSH-PULL类型,您无法“订阅”某些消息,因为您可以使用PUB-SUB连接。
您可以实现一些逻辑来执行您所描述的内容。结帐zmq的guide(第二项目项目),了解他们为可靠连接“推荐”的内容。描述的内容本质上是一种跟踪客户端接收哪些消息(递增id?)的方法,以及客户端可以“请求重新发送错过的消息”的第二种连接。
上面的部分也可以通过客户端实现服务器'heartbeat',它会给出收到的最后一条消息。服务器检查这一点以确保客户端不在后面并重新发布消息(如果是。)
答案 1 :(得分:3)
g19fanatic has already answered your question.
再加上他的回答:
ZeroMq提供超级套接字。使用它的关键优势在于,一旦识别出通信模式,就很容易使用它。你不必担心
但是,ZeroMq无法解决消息持久性问题。 (ZeroMQ代表零消息队列)。像AMQP实现的消息队列提供消息排队和传递保证。它存储消息直到它被传递。为实现这一目标,它使用了更复杂的协议(AMQP)。 ZeroMQ仅提供消息传递模式。
它允许您在其上实现任何协议,持久性或其他属性。
有些人喜欢在ZeroMQ客户端上使用AMQP基础设施。
请参阅RabbitMq plugin to use ZeroMQ as client。
https://serverfault.com/questions/80679/how-to-pick-between-rabbitmq-and-zeromq-or-something-else
其他解决方案是使用Redis Pub / Sub:http://redis.io/topics/pubsub