【问题标题】:Architecture: Websockets sends message based on triggers from database架构:Websockets 基于来自数据库的触发器发送消息
【发布时间】:2021-04-28 16:53:30
【问题描述】:

我只是为了练习而实现 WebSockets,但遇到了架构问题。

拥有 WebSockets 很好,但我想不出一个简单的可扩展场景。

可能的场景:

浏览器用户在前端开始一些计算困难的任务。它通过 API 服务器,API 将任务放入队列,其他一些带有 celery 的 GPU 服务器拉取任务并开始处理它。在途中的某个地方,可能有一个保存状态的数据库。所以我会说 API 和 celery 服务器在数据库中写入有关正在发生的事情的特定任务信息。

现在是重要的部分。有一个 WebSocket 服务器连接到浏览器客户端。如果 WebSockets 是单工的,并且只向浏览器客户端发送有关任务进度的消息(状态、进度条百分比等),那就太好了。 WebSocket 很聪明,不需要定期轮询,但可以根据触发的事件(由 API 和 celery)向浏览器客户端发送数据。显然,WebSocket 服务器需要监听这个任务状态(Redis 什么的,当然不是和 WebSocket 服务器在同一个地方的东西)。这意味着在 WebSocket 循环中必须有该状态的侦听器。但这最终会返回到 WebSocket 服务器轮询这个 redis 或其他东西以查看任务的状态 -> 如果有很多用户,这肯定是连接杀手,因为会有很多 WebSocket 连接轮询同一个数据库。

那么问题来了:如何在架构上解决这个问题(没有轮询,WebSockets 只在某些 DB 中某个值的状态变化时才发送消息)?

【问题讨论】:

    标签: database events websocket triggers architecture


    【解决方案1】:

    我建议 celery 服务器也将任务信息发送到某个队列。 WebSocket 服务器必须有一个代码负责从该队列中读取并将该任务信息分发给其侦听该特定任务信息的客户端(WebSocket 连接)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 2018-08-09
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多