【问题标题】:What is the best way to deliver real-time messages to Client that can not be requested将无法请求的实时消息传递给客户端的最佳方式是什么
【发布时间】:2013-09-24 08:58:31
【问题描述】:

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

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

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

我想到了三种变体:

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

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

【问题讨论】:

  • 短信网关是谁?
  • 我的意思是我正在开发一个 SMS 网关。

标签: websocket rabbitmq


【解决方案1】:

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

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

一般来说,RabbitMQ 是一个非常棒的工具,可用于您所描述的基于消息传递的架构:

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

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

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

【讨论】:

  • This can indeed fill up memory and/or disk space 是否可以配置 RabbitMQ 以便在队列大小接近N 后消息将保存在磁盘上?这会降低 rabbitMQ 在其他队列处理上的性能吗?
  • 据我所知,没有。您可以将队列设置为持久(消息将在重新启动后保留)或不(RabbitMQ 重新启​​动后消息将丢失)。
  • 如果将消息存储在队列中是一个坏主意,那么使用 WebSockets 对我们的客户来说可能更方便吗?因为 AMQP 更高级。
  • 这不是一个坏主意——你只需要确保你监控你的队列并且你有足够的磁盘空间。在最坏的情况下,应该触发警报并停止发布者。 RabbitMQ 比 WebSockets 做的更多——但哪个更合适取决于你需要什么,exactl.y
猜你喜欢
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多