向客户端发送无法请求的实时消息的最佳方法是什么

时间:2013-09-24 08:58:32

标签: websocket rabbitmq

我们需要向客户提供实时消息,但他们的服务器位于代理服务器后面,我们无法初始化连接; webhook变体不起作用。

考虑到以下情况,提供实时消息的最佳方式是:

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

我想到了三个变种:

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

1 个答案:

答案 0 :(得分:0)

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

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

通常,RabbitMQ是基于消息传递的体系结构的一个很好的工具,如您所描述的那样:

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

所以我推荐它用于其他两个(这可能适用于小规模的应用程序,但是如果需求发生变化,您可能需要快速扩展它们。)

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