我是后端开发人员,我想知道构建实时服务器的常用技术是什么。我知道我可以使用像Firebase这样的服务,但我真的想创建它。我有一些在Java上使用Websockets的经验,但我想知道更多实现实时服务器的方法。当我说实时时,我指的是像Facebook这样的东西。我也想知道如何扩展实时服务器。
谢谢你们!
我在多个论坛上都问了同样的问题。这个问题的常见答案仍然很奇怪:
但这些主要是向客户传输或传输事件的方式。需要建立一些东西。还有许多其他事项需要考虑,例如:
要发送给客户的事件 如何仅向每个客户发送他们需要的事件 如何处理事件授权 在哪里保持对事件订阅的状态(对于无状态服务) 如何从丢失的连接和服务崩溃中恢复错过的事件 为搜索或分页查询生成事件 如何扩展
那里有多个pub / sub解决方案,例如:
但由于基于主题的pub / sub架构的限制,上述一些问题仍未得到解决,必须由您自己处理。例子是丢失的连接,其中Pusher has no fallback,SocketCluster和PubNub has a limited queue。
传统的基于主题的发布/订阅模式的替代方法是使用资源感知的实时API网关,例如Resgate。
网关不是订阅主题的客户端,而是跟踪客户端提取的资源(对象或数组),使客户端数据保持最新状态,直到取消订阅为止。
作为Resgate的开发人员,我真的可以推荐检查它,因为它解决了上述所有问题,语言无关,简单,重量轻,速度极快。
在NATS blog了解更多信息。
假设您想要同时扩展并发客户端数量和生成的事件数量。您最终需要确保每个客户端只通过传统的基于主题的发布/订阅或通过资源订阅获取他们感兴趣的数据。所有上述解决方案都可以处
我还假设所有上述解决方案都允许您添加更多处理持久WebSocket连接的节点/服务器来扩展并发客户端。
使用Resgate,只需运行多个实例(它是一个简单的可执行文件),并添加一个负载平衡器,在它们之间均匀分配连接,即可完成第一级扩展:
处理100M并发客户端
假设一个Resgate实例处理10000个持久性WebSocket连接,您可以将10000个Resgates(分布到多个数据中心)添加到单个NATS Server。这将允许总共100M连接。当然,根据您的数据,您可能还有其他扩展问题,例如网络流量;)。
第二层扩展(和添加冗余)是将整个设置复制到不同的数据中心,并使服务使用其他工具(如Kafka,CockroachDB等)在数据中心之间同步数据。
使用仅处理事件的传统发布/订阅解决方案,您还必须处理HTTP(REST)请求的扩展。
使用Resgate,这不是必需的,因为资源数据也是通过WebSocket连接获取的。这允许Resgate不仅确保资源数据和事件同步(另一个问题与单独的pub / sub解决方案),而且还可以缓存数据。如果多个客户端请求相同的数据,Resgate只需要从服务中获取一次,从而有效地提高了可伸缩性。
Butterfly Server .NET是一个用C#编写的实时服务器,允许您创建实时应用程序。你可以在https://github.com/firesharkstudios/butterfly-server-dotnet看到来源。