0

我们需要将实时消息传递给我们的客户,但他们的服务器在代理后面,我们无法初始化连接;webhook 变体不起作用。

考虑到以下情况,传递实时消息的最佳方式是什么:

  • 代理后面的客户端
  • 客户端可以长时间关闭,所有消息都必须投递
  • 协议/方式必须足够通用,这样即使是 PHP 开发人员也可以轻松使用它

我想到了三种变体:

  1. WebSocket - 客户端打开一个 websocket 连接,我们发送存储在 DB 中的消息,同时实时发送消息。
  2. RabbitMQ - 所有消息都存储在一个持久的、持久的队列中。如果合作伙伴在一段时间内不从队列中读取怎么办?
  3. HTTP GET - 合作伙伴将按块提取消息。在这种方法中,很难选择最佳的拉动间隔。

任何建议,将不胜感激。谢谢!

4

1 回答 1

0

由于您似乎必须在对等方未连接时存储消息,因此该问题同样适用于任何其他解决方案:如果对等方未连接并且消息正在排队怎么办?

如果您想要松散耦合,RabbitMQ 非常棒:分离生产者和消费者端。如果没有连接消费者,代理将为您存储消息。这确实会在一段时间后填满代理上的内存和/或磁盘空间——在这种情况下,RabbitMQ 将关闭。

一般来说,RabbitMQ 是一个很好的工具,用于基于消息的架构,比如你描述的那个:

  • 负载均衡:您可以使用多个发布者和/或消费者,从而共享负载。
  • 灵活性:如果您的业务逻辑需要,您可以配置多个交换/队列/绑定。您可以轻松更改代理上的路由,而无需重新配置多个发布者/消费者应用程序。
  • 流量控制:RabbitMQ 还为您提供了一些用于流量控制的内置方法 - 如果消费者速度太慢而无法跟上发布者,RabbitMQ 会减慢发布者的速度。
  • 您可以稍后轻松地重构架构。您可以设置多个代理并通过铲/联合将它们链接起来。如果您需要您的应用程序通过多个数据中心工作,这将非常有用。
  • 您可以轻松发现一侧是否比另一侧慢,因为如果您的消费者无法从队列中快速读取,队列将开始增长。
  • 高可用性和容错性。RabbitMQ 非常擅长这些(感谢 Erlang)。

所以我会推荐它而不是其他两个(这可能对小规模的应用程序有好处,但是如果需求发生变化并且你需要扩大规模,你可能会迅速发展它)。

编辑:我错过了一些东西 - 如果传递所有消息并不重要,您可以使用 TTL 配置队列(超时后消息将被丢弃)或限制(如果达到新消息,这会限制队列中的消息数量将被丢弃)。

于 2013-09-24T11:52:51.097 回答