由于您似乎必须在对等方未连接时存储消息,因此该问题同样适用于任何其他解决方案:如果对等方未连接并且消息正在排队怎么办?
如果您想要松散耦合,RabbitMQ 非常棒:分离生产者和消费者端。如果没有连接消费者,代理将为您存储消息。这确实会在一段时间后填满代理上的内存和/或磁盘空间——在这种情况下,RabbitMQ 将关闭。
一般来说,RabbitMQ 是一个很好的工具,用于基于消息的架构,比如你描述的那个:
- 负载均衡:您可以使用多个发布者和/或消费者,从而共享负载。
- 灵活性:如果您的业务逻辑需要,您可以配置多个交换/队列/绑定。您可以轻松更改代理上的路由,而无需重新配置多个发布者/消费者应用程序。
- 流量控制:RabbitMQ 还为您提供了一些用于流量控制的内置方法 - 如果消费者速度太慢而无法跟上发布者,RabbitMQ 会减慢发布者的速度。
- 您可以稍后轻松地重构架构。您可以设置多个代理并通过铲/联合将它们链接起来。如果您需要您的应用程序通过多个数据中心工作,这将非常有用。
- 您可以轻松发现一侧是否比另一侧慢,因为如果您的消费者无法从队列中快速读取,队列将开始增长。
- 高可用性和容错性。RabbitMQ 非常擅长这些(感谢 Erlang)。
所以我会推荐它而不是其他两个(这可能对小规模的应用程序有好处,但是如果需求发生变化并且你需要扩大规模,你可能会迅速发展它)。
编辑:我错过了一些东西 - 如果传递所有消息并不重要,您可以使用 TTL 配置队列(超时后消息将被丢弃)或限制(如果达到新消息,这会限制队列中的消息数量将被丢弃)。