Websocket 构建实时服务器的技术有哪些?

Websocket 构建实时服务器的技术有哪些?,websocket,server,real-time,Websocket,Server,Real Time,我是一名后端开发人员,我想知道构建实时服务器的常用技术是什么。我知道我可以使用像Firebase这样的服务,但我真的很想创建它。我有一些在Java上使用WebSocket的经验,但我想知道更多实现实时服务器的方法。当我说实时时,我指的是Facebook之类的东西。我还想知道如何扩展实时服务器 谢谢大家! Butterfly Server.NET是一个用C#编写的实时服务器,允许您创建实时应用程序。你可以在上看到来源。我已经在多个论坛上问过同样的问题。这个问题的共同答案仍然很奇怪: 但这

我是一名后端开发人员,我想知道构建实时服务器的常用技术是什么。我知道我可以使用像Firebase这样的服务,但我真的很想创建它。我有一些在Java上使用WebSocket的经验,但我想知道更多实现实时服务器的方法。当我说实时时,我指的是Facebook之类的东西。我还想知道如何扩展实时服务器


谢谢大家!

Butterfly Server.NET是一个用C#编写的实时服务器,允许您创建实时应用程序。你可以在上看到来源。

我已经在多个论坛上问过同样的问题。这个问题的共同答案仍然很奇怪:

但这些主要是向客户端传输或流式传输事件的方式。需要在其上建立一些东西。还有很多其他的事情要考虑,例如:

实时API的注意事项 向客户端发送哪些事件
如何仅向每个客户端发送他们需要的事件
如何处理事件的授权
在何处保存事件订阅的状态(对于无状态服务)
如何从因连接丢失和服务崩溃而错过的事件中恢复
为搜索或分页查询生成事件
如何缩放

发布/订阅解决方案 有多种发布/订阅解决方案,例如:

但由于基于主题的发布/订阅体系结构的局限性,上面的一些问题仍然没有答案,必须由您自己解决。例如失去连接,其中,也没有,和

Resgate-实时API网关 传统的基于主题的发布/订阅模式的替代方案是使用资源感知的实时API网关,例如

网关不让客户机订阅主题,而是跟踪客户机已获取的资源(对象或数组),使客户机数据保持最新,直到取消订阅为止

作为Resgate的开发人员,我真的可以推荐您去看看它,因为它解决了上述所有问题,是语言不可知的,简单而轻巧,而且速度极快

阅读更多信息

缩放比例 假设您希望在并发客户端的数量和生成的事件的数量上进行扩展。您最终需要确保每个客户机只通过传统的基于主题的发布/订阅或资源订阅获取他们感兴趣的数据。以上所有解决方案都能解决这一问题

我还假设上述所有解决方案都通过允许您添加更多处理持久WebSocket连接的节点/服务器来扩展并发客户端

使用Resgate,第一级扩展只需运行多个实例(这是一个简单的可执行文件),然后添加一个负载平衡器,在它们之间均匀分布连接:

处理1亿个并发客户端

假设一个Resgate实例处理10000个持久WebSocket连接,您可以向一个实例添加10000个Resgate(分布到多个数据中心)。这将允许总共100万个连接。当然,根据您的数据,您可能还存在其他缩放问题,例如网络流量;)

第二层扩展(并增加冗余)是将整个设置复制到不同的数据中心,并让服务使用其他工具(如Kafka、CockroachDB等)在数据中心之间同步数据

缩放数据检索 对于只处理事件的传统发布/订阅解决方案,您还必须处理HTTP(REST)请求的扩展


对于Resgate,这不是必需的,因为资源数据也是通过WebSocket连接获取的。这使得Resgate不仅可以确保资源数据和事件同步(另一个问题是单独的发布/订阅解决方案),而且还可以缓存数据。如果多个客户端请求相同的数据,Resgate只需从服务中获取一次,有效地提高了可扩展性。

谢谢@ANisus!我不明白为什么要投否决票。你的问题是正确的;寻求普通技术(而不是最好的技术)会减少竞争,而答案其实并不那么容易找到。我去过你现在的地方!:)除了我的回答,我知道Facebook部分使用GraphQL,但该解决方案主要关注于查询,而不是实时更新-他们的订阅模式有一些。@RenanGeraldo顺便说一句,Resgate代表资源订阅网关,但在巴西,我被告知它意味着“救援”。对吗?:)我已经在使用WebSocket了。这样扩展应用程序的最佳方式是什么?我在网上找不到多少信息。这是我找到的最好的教程,它解释了需要使用Publisher/Subscribers。这是最好的方法吗?@RenanGeraldo我在答案中添加了一个缩放部分。主要是如何使用Resgate进行缩放,但我想其他选项也会采用类似的方法。是的。您需要某种订阅;)。如果您有任何问题,可以在引用的博客文章中找到我的电子邮件。