WebSocket是否有标准的PubSub协议?

14
我正在寻找一种方法,在不同语言编写的应用程序之间实现基本的发布/订阅,以交换具有JSON有效负载的事件。
WebSocket似乎是传输的显而易见选择,但需要在顶部添加(可以说很小的)层来实现一些管道:
- 就pubsub领域“订阅主题”,“发布消息”达成协议 - 为基础设施达成协议的消息(“心跳”,“验证”)
我原本期望找到一个明显的标准来解决这个问题,但似乎没有任何标准。
- WAMP经常被提到,但在我的(短暂)经验中,服务器/客户端库的实现并不好。 - STOMP也经常被提到,但在我的(甚至更短)经验中,它还不如WAMP。 - Phoenix Channels很好,但它们仅限于Phoenix / Elixir世界,并且不是标准的(因此消息可以在任何phoenix版本上不经通知地改变)。
那么,大家都在使用MQTT/WS(需要其他代理组件,而不是简单的服务器?)还是gRPC?
每个人都在从头开始重新实现吗?(这是其中一件看起来足够容易自己完成的事情,但我猜您最终会得到一个失败的、规范不完善且存在问题的版本...)
还是说,从服务器上提供数据流输通过WS这个想法有根本性的错误?
1个回答

14
有两种主要类别的WebSocket库;一种是实现协议并将其余部分留给开发人员的库,另一种是在协议基础上构建,具有实时消息应用程序通常需要的各种附加功能,例如恢复丢失的连接、pub/sub和通道、身份验证、授权等。
后一种类型通常需要在客户端使用它们自己的库,而不仅仅使用浏览器提供的原始WebSocket API。因此,确保您对它们的工作方式和提供的内容满意变得至关重要。一旦集成到您的架构中,您可能会发现自己被锁定在所选择的解决方案的做事方式上,可靠性、性能和可扩展性的任何问题都可能会反弹回来。 wsfaye-websocketssocket.ioμWebSocketsSocketCluster是一些很好的开源选项。
当涉及到服务器负载时,服务器可以处理的并发连接数很少是瓶颈。大多数体面的WebSocket服务器可以支持数千个并发连接,但是一旦WebSocket服务器处理了实际数据的接收,处理和响应消息所需的工作量是多少?
通常会有各种潜在的问题,比如读写数据库、与游戏服务器集成、为每个客户端分配和管理资源等。一旦一个机器无法处理工作负载,你就需要开始添加额外的服务器,这意味着你现在需要开始考虑负载均衡、不同服务器连接的客户端之间的消息同步、无论连接寿命或客户端连接到的特定服务器的客户端状态的广义访问 - 列表还很长。

实现WebSocket协议支持时涉及很多内容,不仅涉及客户端和服务器实现细节,还涉及对其他传输方式的支持,以确保对不同客户端环境的强大支持,以及更广泛的问题,例如身份验证和授权可靠的消息传递可靠的消息排序历史消息保留等。如果你不想重新发明轮子,在这种情况下,像Ably Realtime这样的数据流网络是一个不错的选择。

关于WebSockets、Pub/Sub和所有与扩展相关的问题,我建议阅读一篇不错的文章。

完全透明:我是Ably的开发者倡导者,但我希望这真正回答了你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接