Publish/Subscribe 可靠的消息传递:Redis VS RabbitMQ
Publish/Subscribe reliable messaging: Redis VS RabbitMQ
背景
我正在制作一个 publish/subscribe 典型应用程序,其中发布者向消费者发送消息。
发布者和消费者在不同的机器上,他们之间的连接偶尔会中断。
Objective
这里的目标是确保无论连接或机器本身发生什么情况,发布者发送的消息总是被消费者。
消息的顺序不是必须的。
问题
根据我的研究,RabbitMQ 是这种场景的正确选择:
但是,尽管 RabbitMQ 有一个关于 publish and subscriber this tutorial does not present us to persistent queues nor does it mention confirms 的教程,但我认为这是确保消息传递的关键。
另一方面,Redis 也可以做到这一点:
但我找不到任何官方教程或示例,我目前的轻描淡写让我相信持久队列和消息确认必须由我们完成,因为 Redis 主要是内存数据存储而不是消息像 RabbitMQ 这样的经纪人。
问题
- 对于这个用例,哪种解决方案最容易实施? (Redis方案还是RabbitMQ方案?)
- 请提供一个 link 您认为最好的例子!
我认为它们都易于使用,因为有许多为它们开发的库。
有几个可以命名,例如 disque、bull、kue、amqplib 等...
他们的文档非常好。您可以简单地复制和粘贴并在几分钟内得到它运行。
我使用 seneca
并且 seneca amqp 是一个很好的例子
关于实施,它们应该都很简单 - 它们都有各种语言的库,请在此处查看 redis and here for rabbitmq。我在这里说实话:我不使用 javascript 所以我不知道受人尊敬的库是如何实现或支持的。
关于您在本教程中没有找到的内容(或者可能遗漏了 in the second one,其中有一些关于持久队列和持久消息以及确认消息的词语)有一些很好的解释:
- about persistence
- about confirms(与您在问题中提供的 link 相同,为清楚起见,仅在此处列出)
- about reliability
发布者确认确实不在教程中,但有 example on github in amqp.node's repo。
使用 rabbit mq 消息像这样传输(在大多数情况下)
publisher -> exchange -> queue -> consumer
并且在这些停靠点中的每一个都需要实现某种持久性。此外,如果您使用集群和队列镜像,您将获得更高的可靠性(当然还有可用性)。
背景
我最初想要发布和订阅消息和队列持久性。
这在理论上并不完全适合发布和订阅:
- 此模式不关心是否收到消息。发布者只是将消息散开,如果有任何订阅者在收听,那很好,否则它不在乎。
确实,根据我的需求,我需要更多的工作队列模式,甚至 RPC 模式。
分析
人们说两者都应该很容易,但这确实是主观的。
RabbitMQ 总体上有更好的官方文档,在大多数语言中都有清晰的示例,而 Redis 信息主要在第三方博客和稀疏的 github 存储库中 - 这使得它很难找到。
关于示例,RabbitMQ 有两个示例清楚地回答了我的问题:
通过混合这两者,我能够让发布者向多个消费者发送可靠的消息——即使其中一个失败。消息不会丢失,也不会被遗忘。
rabbitMQ 的垮台:
- 这种方法最大的问题是如果consumer/worker崩溃了,你需要自己定义逻辑来确保任务不会丢失。发生这种情况是因为一旦任务完成,遵循 RPC 模式和来自工作队列的持久队列,服务器将继续向工作人员发送消息,直到它再次恢复。但是 worker 不知道它是否已经从服务器读取了回复,所以它会从服务器获取几个 ACK。要解决此问题,每个工作消息都需要有一个 ID,您将其保存到磁盘(以防失败),或者请求必须是幂等的。
- 另一个问题是,如果连接丢失,客户端会因为无法连接而出现错误。这也是你必须要提前准备的。
至于redis,它在这个博客中有一个很好的持久队列的例子:
跟随官方recommendation. You can check the github repo获取更多信息。
redis 的垮台:
- 和rabbitmq一样,你也需要自己处理worker crash,否则正在进行的任务会丢失。
- 您必须进行投票。每个消费者都需要每隔 X 秒向生产者询问是否有任何消息。
在我看来,这是最糟糕的 rabbitmq。
结论
我最终选择了 rabbitmq,原因如下:
- 更强大的官方在线文档,带有示例。
- 消费者无需轮询生产者。
- 错误处理和redis一样简单。
考虑到这一点,对于这种特定情况,我有信心说redis 是这种情况下最糟糕的rabbitmq。
希望对您有所帮助。
背景
我正在制作一个 publish/subscribe 典型应用程序,其中发布者向消费者发送消息。
发布者和消费者在不同的机器上,他们之间的连接偶尔会中断。
Objective
这里的目标是确保无论连接或机器本身发生什么情况,发布者发送的消息总是被消费者。
消息的顺序不是必须的。
问题
根据我的研究,RabbitMQ 是这种场景的正确选择:
但是,尽管 RabbitMQ 有一个关于 publish and subscriber this tutorial does not present us to persistent queues nor does it mention confirms 的教程,但我认为这是确保消息传递的关键。
另一方面,Redis 也可以做到这一点:
但我找不到任何官方教程或示例,我目前的轻描淡写让我相信持久队列和消息确认必须由我们完成,因为 Redis 主要是内存数据存储而不是消息像 RabbitMQ 这样的经纪人。
问题
- 对于这个用例,哪种解决方案最容易实施? (Redis方案还是RabbitMQ方案?)
- 请提供一个 link 您认为最好的例子!
我认为它们都易于使用,因为有许多为它们开发的库。
有几个可以命名,例如 disque、bull、kue、amqplib 等...
他们的文档非常好。您可以简单地复制和粘贴并在几分钟内得到它运行。
我使用 seneca
并且 seneca amqp 是一个很好的例子
关于实施,它们应该都很简单 - 它们都有各种语言的库,请在此处查看 redis and here for rabbitmq。我在这里说实话:我不使用 javascript 所以我不知道受人尊敬的库是如何实现或支持的。
关于您在本教程中没有找到的内容(或者可能遗漏了 in the second one,其中有一些关于持久队列和持久消息以及确认消息的词语)有一些很好的解释:
- about persistence
- about confirms(与您在问题中提供的 link 相同,为清楚起见,仅在此处列出)
- about reliability
发布者确认确实不在教程中,但有 example on github in amqp.node's repo。
使用 rabbit mq 消息像这样传输(在大多数情况下)
publisher -> exchange -> queue -> consumer
并且在这些停靠点中的每一个都需要实现某种持久性。此外,如果您使用集群和队列镜像,您将获得更高的可靠性(当然还有可用性)。
背景
我最初想要发布和订阅消息和队列持久性。
这在理论上并不完全适合发布和订阅:
- 此模式不关心是否收到消息。发布者只是将消息散开,如果有任何订阅者在收听,那很好,否则它不在乎。
确实,根据我的需求,我需要更多的工作队列模式,甚至 RPC 模式。
分析
人们说两者都应该很容易,但这确实是主观的。
RabbitMQ 总体上有更好的官方文档,在大多数语言中都有清晰的示例,而 Redis 信息主要在第三方博客和稀疏的 github 存储库中 - 这使得它很难找到。
关于示例,RabbitMQ 有两个示例清楚地回答了我的问题:
通过混合这两者,我能够让发布者向多个消费者发送可靠的消息——即使其中一个失败。消息不会丢失,也不会被遗忘。
rabbitMQ 的垮台:
- 这种方法最大的问题是如果consumer/worker崩溃了,你需要自己定义逻辑来确保任务不会丢失。发生这种情况是因为一旦任务完成,遵循 RPC 模式和来自工作队列的持久队列,服务器将继续向工作人员发送消息,直到它再次恢复。但是 worker 不知道它是否已经从服务器读取了回复,所以它会从服务器获取几个 ACK。要解决此问题,每个工作消息都需要有一个 ID,您将其保存到磁盘(以防失败),或者请求必须是幂等的。
- 另一个问题是,如果连接丢失,客户端会因为无法连接而出现错误。这也是你必须要提前准备的。
至于redis,它在这个博客中有一个很好的持久队列的例子:
跟随官方recommendation. You can check the github repo获取更多信息。
redis 的垮台:
- 和rabbitmq一样,你也需要自己处理worker crash,否则正在进行的任务会丢失。
- 您必须进行投票。每个消费者都需要每隔 X 秒向生产者询问是否有任何消息。
在我看来,这是最糟糕的 rabbitmq。
结论
我最终选择了 rabbitmq,原因如下:
- 更强大的官方在线文档,带有示例。
- 消费者无需轮询生产者。
- 错误处理和redis一样简单。
考虑到这一点,对于这种特定情况,我有信心说redis 是这种情况下最糟糕的rabbitmq。
希望对您有所帮助。