【问题标题】:What is the best way to design an API with websockets?使用 websocket 设计 API 的最佳方法是什么?
【发布时间】:2022-11-02 08:07:57
【问题描述】:

我目前正在尝试制作一个聊天应用程序。我想知道我应该如何设计我的服务器端。我计划有一些模式——消息、用户、组。我对如何进行设计有一些想法:

  1. 没有 API,只有 websocket 通信。这将是理想的,但从数据库中编辑东西之类的事情并不容易。
  2. 我只使用 websocket 告诉客户端有更新,并告诉它获取新数据的 URL。这会更容易,但我不确定这是否是一个可行的想法。

    我对 websockets 很陌生,想听听你的建议。如果您有更好的后端设计,请告诉我。如果您需要知道 - 我计划在服务器上使用 JavaScript。

【问题讨论】:

    标签: api rest design-patterns websocket


    【解决方案1】:

    在我看来,最好同时使用两者。他们有不同的目标。 WebSocket 可用于:

    • 发送服务器推送数据。
    • 从客户端向服务器发送少量数据,你经常这样做

    可以使用 REST:

    • 当您使用服务器端框架时
    • 当您不想一直打开 websocket 时。所以你的服务器将有更多的可扩展性
    • 您确实希望避免不活动的长连接时段

    更新

    WebSockets 使您的连接保持活跃。因此,您可以毫不拖延地收到您的消息。但是这样做的代价是服务器的可扩展性。 REST 可用于上传图像。

    【讨论】:

    • 好的,但是考虑到聊天应用程序的想法(消息发送非常频繁),您认为最好的方法是什么。我也不知道缩放以及如何仅在需要时打开 websocket。
    • @ProGamer2711 它有很多优点和缺点。请看我更新的答案。此外,您可以阅读更多关于Is it ok to use HTTP REST API for Chat application?
    • 谢谢你。我现在就读。
    • 没问题。感谢您的帮助。我不会将其标记为最佳答案,因为我仍然不太确定我应该做什么。很快我会决定做什么,但在那之前我仍然对其他答案持开放态度。如果没有任何问题,我会选择您的答案作为最佳答案。
    • @ProGamer2711 我会使用套接字在用户之间进行通信。如果您有机会为您的服务器使用许多端口,那么这是可行的。您可以使用 REST 上传图片
    【解决方案2】:

    我认为这个问题归结为负载平衡。如果几秒钟的延迟无关紧要并且消息相对较大并且我们正在谈论 REQ-REP 通信,那么 HTTP 是很好的。 Websockets 非常适合接近实时的通信,许多小消息都很好,它支持 PUSH-PULL 类型的通信。

    PUSH-PULL 例如推送通知可以通过带有轮询的 HTTP 来模拟,但总是重建连接会导致成本过高。 Websockets 可以做推送通知,但使用外部服务可能更具成本效益,例如谷歌通知服务,因为要维护与那些长时间不活动的用户的大量连接并且只使用您自己的 websockets 服务器执行实时部分可能会很昂贵。

    HTTP 支持缓存和无状态通信,这使得它与 websocket 相比具有高度可扩展性,所以如果某些东西是可重用的,例如回滚到较早的消息,然后更好地使用缓存机制,例如通过存储例如内存缓存通过在文件系统中存储多条消息,将内存或 HTTP 缓存中的最后 25 条消息。虽然这取决于客户,例如移动客户端可能能够在没有 HTTP 的情况下拥有自己的文件系统缓存。另一个想法是,浏览器内桌面客户端的事件可以在文件系统中存储一些数据和消息,或者不那么长,因此即使在那里也可以使用 localstorage 和 sessiontorage 进行缓存,并且仅将 HTTP 用于更大的文件,如图像。

    所以我认为实时聊天部分一定要搭配 websockets,因为它需要低延迟。可以使用 REST 和分页解决方案加载以前的消息。推送通知也可以使用 websockets 完成,但使用不同的服务器可能会更好,因此它不会影响实时聊天的性能,并且可能会有更高的延迟,例如甚至一分钟左右。实际实现取决于对延迟、可扩展性等的期望以及支持的平台,例如浏览器、安卓、iOS等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 2022-08-20
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多