Websocket 向无法请求的客户端传递实时消息的最佳方式是什么

Websocket 向无法请求的客户端传递实时消息的最佳方式是什么,websocket,rabbitmq,Websocket,Rabbitmq,我们需要向我们的客户发送实时消息,但他们的服务器在代理之后,我们无法初始化连接;webhook变体无法工作 考虑到以下情况,传递实时消息的最佳方式是什么: 代理后面的客户端 客户端可能会关闭很长一段时间,并且必须传递所有消息 协议/方式必须足够通用,这样即使是PHP开发人员也可以轻松地使用它 我想到了三种变体: WebSocket-客户端打开WebSocket连接,我们发送存储在DB中的消息,同时实时提交消息 RabbitMQ-所有消息都存储在持久的持久队列中。如果合作伙伴在一段时间内不从队

我们需要向我们的客户发送实时消息,但他们的服务器在代理之后,我们无法初始化连接;webhook变体无法工作

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

  • 代理后面的客户端
  • 客户端可能会关闭很长一段时间,并且必须传递所有消息
  • 协议/方式必须足够通用,这样即使是PHP开发人员也可以轻松地使用它
我想到了三种变体:

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

  • 如有任何建议,将不胜感激。谢谢

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

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

    一般来说,RabbitMQ是基于消息传递的体系结构(如您描述的体系结构)的绝佳工具:

    • 负载平衡:您可以使用多个发布者和/或使用者,从而共享负载
    • 灵活性:如果业务逻辑需要,您可以配置多个交换/队列/绑定。您可以轻松地在代理上更改路由,而无需重新配置多个发布者/使用者应用程序
    • 流控制:RabbitMQ还为您提供了一些用于流控制的内置方法-如果使用者速度太慢,无法跟上发布者的步伐,RabbitMQ将减慢发布者的速度
    • 以后可以轻松地重构体系结构。您可以设置多个代理,并通过Spook/federation将它们链接起来。如果您需要应用程序通过多个数据中心工作,这非常有用
    • 您可以很容易地发现其中一方是否比另一方慢,因为如果您的消费者不能足够快地读取队列,队列将开始增长
    • 高可用性和容错性。RabbitMQ非常擅长这些(多亏了Erlang)
    因此,我推荐它胜过其他两款(这对于小规模的应用程序来说可能很好,但随着需求的变化,您可能会很快地将其发展壮大,并且您需要扩大规模)


    编辑:我遗漏了一些内容-如果传递所有消息并不重要,您可以使用TTL(消息将在超时后被丢弃)或限制(这将限制队列中的消息数量,如果达到此限制,将丢弃新消息).

    这确实会填满内存和/或磁盘空间
    是否可以配置RabbitMQ,以便在队列大小接近
    N后
    消息将保存在磁盘上?这会降低rabbitMQ在其他队列处理上的性能吗?据我所知,不会。您可以将队列设置为持久性(消息将在重新启动后保留)或非持久性(消息将在rabbitMQ重新启动后丢失)。如果将消息存储在队列中是一个坏主意,那么使用WebSocket可能会更方便我们的客户端?因为AMQP有点高级,这不是一个坏主意-你只需要确保你监控你的队列,并且你有足够的磁盘空间。在最坏的情况下,应触发警报并停止发布。RabbitMQ比WebSocket做的更多,但哪一个更合适取决于您需要什么。什么是SMS网关?我的意思是我正在开发一个SMS网关。