【发布时间】:2021-06-20 13:58:36
【问题描述】:
我在负载平衡的环境中使用 GCP PubSub 作为 Web Sockets 的后端。当前的实现为负载均衡器后面的每个服务器都有一个主题,以及最终用户和服务器之间的映射。当我希望向特定用户发送消息时,我使用映射来确定将其发布到哪个主题。
这可行,但它有很多移动部件,并且需要在通过缩减或推出应用程序的更新版本来移除服务器时清理主题。
我现在正在探索一种更复杂的实现,其中只有一个主题。由于每台服务器都知道它的最终用户,理论上我可以向这个单一主题发布一条消息,并且每台服务器都可以检查该消息,并将其与其用户列表进行比较。只有当前为消息中指定的最终用户提供 Web Socket 连接的服务器才会处理它。
这让我想到了我的问题 - 我如何通过 PubSub 实现这一目标?
- 目前我使用的是 Pull 订阅,我需要使用 Push 订阅吗?也许这样可以同时向所有订阅者交付?
- 在 Pull 模型中,如果订阅者不
.ack()消息,可能会允许重新传递消息,但最终将消息发送给相应的订阅者可能需要很长时间(击败Web Sockets 的目的,即“实时”更新)——这是对它在 Pull 订阅模型中的工作方式的公平评估吗? - 我是否使用了错误的工具来完成这项工作?这是可能的,但我希望我只需要对当前工具进行不同的使用
【问题讨论】:
-
服务器处理的用户列表在服务器启动时是已知的还是可以进化的?你如何在服务器之间分片用户?什么是分区键?
-
用户在运行时与服务器相关联。打开 Web 套接字的请求通过负载均衡器发送,并根据其配置路由到特定服务器。此时,在映射表中记录了一个条目,将用户与提供 Web 套接字连接的特定服务器相关联。
-
您可以并行拥有多少台服务器,以及多少个 Web 套接字连接(实际上,您现在和将来预计每秒或每小时有多少条消息)?消息发布和消息处理之间的预期最大延迟是多少?
-
这些都是很好的问题,因为应用程序在其生命周期中是新生的,我没有任何经验数据可以准确地回答它们。目前,这些属性中最重要的是消息发布和处理之间的延迟,我们希望将其降至最低。想象一下,一位用户索取了一张音乐会门票(数量有限),我们希望其他用户尽可能接近实时地看到更新后的票数。
标签: google-cloud-pubsub broadcast