node.js - 带有多线程 nodeJS 服务器的 Graphql 订阅
问题描述
我正在尝试在多线程架构中创建一个 graphql 订阅服务。
例如,如果我创建如下订阅
const SOMETHING_CHANGED_TOPIC = 'something_changed';
export const resolvers = {
Subscription: {
somethingChanged: {
subscribe: () => pubsub.asyncIterator(SOMETHING_CHANGED_TOPIC),
},
},
}
并且在我的 docker 集群上运行多个相同nodeJS
服务器的实例,我不希望每个实例在每次发布新订阅时都向客户端发送订阅事件。我只希望一个(当然最好在集群之间进行负载平衡)负责向客户端发送订阅。
我现在能想到的唯一方法是创建一个独立的服务器,负责订阅事件,并且只接收来自单一来源的订阅事件作为客户端。但是,如果我分散负责订阅的服务器的负载,就会出现我上面提到的相同的多线程问题。
当有多线程 nodeJS 后端时,如何确保只向客户端发送单个订阅事件?只有客户端过滤才有可能吗?即忽略已经到达的事件 - 但是我认为随着订阅的增长,这是对资源的严重浪费。
解决方案
在这种情况下,我会使用 Redis 作为 PubSub,这样你就有了“一个事实来源”。即https://github.com/tomyitav/redis-messaging-manager。
我敢肯定还有很多其他库可以做类似的事情
推荐阅读
- c++ - 任何简单的方法来引用函数调用的所有参数?
- swift - 为什么服务器响应中的换行导致 JSONDecoder 失败?
- php - 如何在自定义字段上方显示评论星?电子商务
- php - 在域名后添加正斜杠,但仅在实时服务器上
- snowflake-cloud-data-platform - 在 Snowflake DWH 中撤销从架构创建表
- mysql - Mysql JOIN 与两个额外的自定义列
- java - Java加载加密私钥
- javascript - 如何在 Gmail 中的粘贴事件上强制执行 preventDefault()?
- go - 在 golang 中解组深层嵌套数组
- python - 如何将 Telethon 与 Google Cloud Functions 一起使用