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

What are the technologies for building real-time servers?

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

谢谢大家!

Butterfly Server .NET 是一个用 C# 编写的实时服务器,允许您创建实时应用程序。您可以在 https://github.com/firesharkstudios/butterfly-server-dotnet.

查看源代码

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

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

实时API的注意事项

向客户端发送什么事件
如何只向每个客户端发送他们需要的事件
如何处理事件授权
在何处保存事件订阅的状态(对于无状态服务)
如何从因连接丢失和服务崩溃而错过的事件中恢复
为搜索或分页查询生成事件
如何扩展

Publish/Subscribe 解决方案

有多种 pub/sub 解决方案,例如:

但是由于基于pub/sub架构的主题的限制,上面的一些问题仍然没有得到解答,必须自己处理。例如丢失的连接,其中 , neither does SocketCluster, and PubNub has a limited queue.

Resgate - 实时 API 网关

基于传统主题的 pub/sub 模式的替代方法是使用资源感知 实时 API 网关 ,例如 Resgate

不是客户端订阅主题,网关会跟踪客户端获取的资源(对象或数组),使客户端数据保持最新,直到它取消订阅。

作为 Resgate 的开发人员,我真的可以推荐检查它,因为它解决了上述所有问题,与语言无关,简单轻量,而且速度极快。

NATS blog 阅读更多内容。

缩放

假设您希望同时扩展并发客户端的数量 和生成的事件数量 。您最终将需要确保每个客户端仅通过基于传统主题的 publish/subscribe 或通过资源订阅获取他们感兴趣的数据。以上所有解决方案都可以解决这个问题。

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

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

处理 100M 并发客户端

假设单个 Resgate 实例处理 10000 个持久 WebSocket 连接,您可以将 10000 个 Resgate(分布到多个数据中心)添加到单个 NATS Server。这将允许总共 100M 个连接。当然,根据您的数据,您可能还会遇到其他扩展问题,例如网络流量 ;) .

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

缩放数据检索

使用仅处理事件的传统 publish/subscribe 解决方案,您还必须处理 HTTP (REST) 请求的扩展。

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