Publish/Subscribe reliable messaging: Redis VS RabbitMQ
Background
I am making a publish/subscribe typical application where a publisher sends messages to a consumer.
The publisher and the consumer are on different machines and the connection between them can break occasionally.
Objective
The goal here is to make sure that no matter what happens to the connection, or to the machines themselves, a message sent by a publisher is always received by the consumer .
Ordering of messages is not a must.
Problem
According to my research, RabbitMQ is the right choice for this scenario:
However, although RabbitMQ has a tutorial about publish and subscriber this tutorial does not present us to persistent queues nor does it mention confirms which I believe are the key to making sure messages are delivered.
On the other hand, Redis is also capable of doing this:
but I couldn't find any official tutorials or examples and my current understatement leads to me to believe that persistent queues and message confirms must be done by us, as Redis is mainly an in memory-datastore instead of a message broker like RabbitMQ.
Questions
Background
I originally wanted publish and subscribe with message and queue persistence.
This in theory, does not exactly fit publish and subscribe:
Indeed, looking at my needs I would need more of a Work Queue pattern, or even an RPC pattern.
Analysis
People say both should be easy, but that really is subjective.
RabbitMQ has a better official documentation overall with clear examples in most languages, while Redis information is mainly in third party blogs and in sparse github repos - which makes it considerably harder to find.
As for the examples, RabbitMQ has two examples that clearly answer my questions:
By mixing the two I was able to have a publisher send to several consumers reliable messages - even if one of them fails. Messages are not lost, nor forgotten.
Downfall of rabbitMQ:
As for redis, it has a good example of durable queues in this blog:
Which follows the official recommendation. You can check the github repo for more info.
Downfall of redis:
This is, in my opinion, a worst rabbitmq.
Conclusion
I ending up going with rabbitmq for the following reasons:
With this in mind, for this specific case, I am confident in saying that redis is a worst rabbitmq in this scenario.
Hope it helps.
Regarding implementation, they should both be easy - they both have libraries in various languages, check here for redis and here for rabbitmq. I'll just be honest here: I don't use javascript so I don't know how are the respected libraries implemented or supported.
Regarding what you didn't find in the tutorial (or maybe missed in the second one where there are a few words about durable queues and persistent messages and acknowledging messages) there are some nicely explained things:
Publisher confirms are indeed not in the tutorial but there is an example on github in amqp.node's repo.
With rabbit mq message travels (in most cases) like this
publisher -> exchange -> queue -> consumer
and on each of these stops there is some sort of persistence to be achieved. Also if you get to clusters and queue mirroring you'll achieve even greater reliability (and availability of course).
i think they are both easy to use as there are many libraries developed for them both.
There are a fews to name such as disque, bull, kue, amqplib, etc...
The documentations for them are pretty good. You can simple copy and paste and have it running in few mins.
I use seneca
and seneca amqp is a pretty good example
https://github.com/senecajs/seneca-amqp-transport
链接地址: http://www.djcxy.com/p/34162.html上一篇: 通过WCF提供RabbitMQ服务器对