我们需要向客户端传递实时消息,但他们的服务器在代理后面,我们无法初始化连接;webhook变体不起作用。
考虑到以下因素,传递实时消息的最佳方式是什么:
- 代理后面的客户端
- 客户端可以长时间关闭,并且必须传递所有消息
- 协议/方式必须足够通用,以便即使是PHP开发人员也可以轻松使用它
我想到了三个变体:
- WebSocket - 客户端打开一个websocket连接,我们发送存储在数据库中的消息,以及同时实时发送的消息。
- RabbitMQ - 所有消息都存储在持久、持久的队列中。如果合作伙伴在一段时间内不会从队列中读取,该怎么办?
- HTTP GET - 合作伙伴将按块拉取消息。在这种方法中,很难选择最佳的拉动间隔。
任何建议将不胜感激。谢谢!
由于您似乎必须在对等体未连接时存储消息,因此该问题同样适用于任何其他解决方案:如果对等体未连接并且消息正在排队怎么办?
如果你想要松散耦合,RabbitMQ 是很好的选择:将生产者和消费者分开。如果没有连接消费者,代理将为您存储消息。这确实会在一段时间后填满代理上的内存和/或磁盘空间 - 在这种情况下,RabbitMQ 将关闭。
一般来说,RabbitMQ 对于基于消息传递的架构来说是一个很好的工具,就像你描述的那样:
- 负载
- 均衡:可以使用多个发布者和/或使用者,从而分担负载。
- 灵活性:如果业务逻辑需要,您可以配置多个交换/队列/绑定。您可以轻松更改代理上的路由,而无需重新配置多个发布者/使用者应用程序。 流量控制
- :RabbitMQ 还为您提供了一些内置的流量控制方法 - 如果消费者太慢而跟不上发布者,RabbitMQ 会减慢发布者的速度。
- 您可以稍后轻松地重构体系结构。您可以设置多个代理并通过铲子/联合链接它们。如果您需要应用程序通过多个数据中心工作,这将非常有用。
- 您可以轻松发现一侧是否比另一侧慢,因为如果您的消费者无法从队列中足够快地读取,队列将开始增长。
- 高可用性和容错能力。RabbitMQ 非常擅长这些(感谢 Erlang(。
所以我推荐它而不是其他两个(这对于一个小型应用程序来说可能是件好事,但你可能会在需求发生变化并且你需要扩展东西时迅速发展它(。
编辑:我错过了什么 - 如果传递所有消息并不重要,您可以使用 TTL(消息将在超时后被丢弃(或限制(这限制了队列中的消息数量,如果达到,新消息将被丢弃(配置队列。