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

标签 websocket server real-time

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

谢谢你们!

最佳答案

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

  • WebSocket
  • Socket.io
  • Server-Sent Events (SSE)

  • 但这些主要是向客户端传输或流式传输事件的方式。一些东西需要建立在它之上。还有很多其他的事情需要考虑,例如:
    实时 API 的注意事项
    向客户端发送什么事件
    如何只向每个客户端发送他们需要的事件
    如何处理事件的授权
    在哪里保持事件订阅的状态(对于无状态服务)
    如何从因连接丢失和服务崩溃而错过的事件中恢复
    为搜索或分页查询生成事件
    如何缩放
    发布/订阅解决方案
    有多种发布/订阅解决方案,例如:
  • Pusher
  • PubNub
  • SocketCluster
  • etc.

  • 但是由于基于主题的发布/订阅架构的限制,上述一些问题仍然没有答案,必须自己解决。示例是丢失的连接,其中 Pusher has no fallbackSocketCluster 也不行, 和 PubNub has a limited queue .
    Resgate - 实时 API 网关
    传统基于主题的发布/订阅模式的替代方案是使用资源感知实时 API 网关,例如 Resgate .
    网关不是客户端订阅主题,而是跟踪客户端获取了哪些资源(对象或数组),使客户端数据保持最新,直到它取消订阅。
    作为 Resgate 的开发人员,我真的建议您检查一下,因为它解决了上述所有问题,与语言无关,简单轻量级,而且速度极快。
    阅读更多 NATS blog .
    缩放
    假设您想要同时扩展并发客户端的数量和生成的事件数量。您最终需要确保每个客户端仅通过基于传统主题的发布/订阅或通过资源订阅获取他们感兴趣的数据。以上所有解决方案都可以解决这个问题。
    我还假设上述所有解决方案通过允许您添加更多处理持久 WebSocket 连接的节点/服务器来扩展并发客户端。
    使用 Resgate,通过简单地运行多个实例(它是一个简单的可执行文件)并添加一个负载均衡器来在它们之间平均分配连接来完成第一级扩展:
    enter image description here
    处理 100M 并发客户端
    假设单个 Resgate 实例处理 10000 个持久 WebSocket 连接,您可以将 10000 个 Resgate(分布到多个数据中心)添加到单个 NATS Server .这将允许总共 100M 的连接。当然,根据您的数据,您可能还有其他扩展问题,例如网络流量 ;) 。
    第二层扩展(并添加冗余)是将整个设置复制到不同的数据中心,并让服务使用其他工具(如 Kafka、CockroachDB 等)在数据中心之间同步数据。
    扩展数据检索
    使用仅处理事件的传统发布/订阅解决方案,您还必须处理 HTTP (REST) 请求的扩展。
    使用 Resgate,这不是必需的,因为资源数据也是通过 WebSocket 连接获取的。这使得 Resgate 不仅可以确保资源数据和事件同步(单独发布/订阅解决方案的另一个问题),而且可以缓存数据。如果多个客户端请求相同的数据,Resgate 只需要从服务中获取一次,有效地提高了可扩展性。

    关于websocket - 构建实时服务器的技术有哪些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51848474/

    相关文章:

    android - XMPP、WebSocket 等问题

    javascript - 在浏览器中接收 WebSocket ArrayBuffer 数据 - 而不是接收字符串

    linux - 在构建面向性能的 linux 服务器以运行不同的应用程序时如何选择硬件?

    linux - 何时为 Linux 内核 4.11 发布 RT_PREEMPT 补丁

    hadoop - 如何使用水槽获取实时推文?

    c - 在linux内核模块中寻找意外抢占的原因

    Spring webSocket - 使用 IE8 拒绝基于用户权限的主题订阅 - 从未调用过确定用户()

    javascript - Socket.IO 客户端如何连接?

    events - 来自服务器的 grpc 未经请求的消息?

    node.js - Sails.js (Node.js) 服务器架构、扩展和性能