【发布时间】:2020-11-02 16:57:36
【问题描述】:
我有我的后端副本以提供水平缩放。后端有 apollo graphql 订阅。还有一个为特定订阅提供通知的微服务。
由于我没有在后端保留任何状态,因此我尝试通过实现 Redis PUB/SUB 来解决问题。微服务收到事件后,会发布到后端。
在我的后端订阅解析器中
webhookCalled: {
subscribe: withFilter(
() => pubsubMyEvent.asyncIterator([MY_EVENT]),
(payload, _, context) => {
return context.dataValues.id == payload.userid;
}
)
}
在上面的代码中,我试图过滤掉未发送到有效负载的订阅。我不太确定withFilter 例程的成本有多大。
当我从 Redis 收到 PUB 时,我正在打电话
pubsubMyEvent.publish(MY_EVENT, { myEventData });
这里我不喜欢的是每个后端都会处理(publish(...))所有事件,即使最后只有一个后端会真正将订阅消息发送到 graphql 客户端。
问题:如何有效地处理向 graphql 订阅客户端发送事件,同时拥有可扩展的后端?当需要通知单个 websocket 连接时,也许不要打扰所有后端副本。我是否应该跟踪 Redis 中所有连接的客户端,以便 Redis 知道每个 graphql 订阅客户端的连接位置?
【问题讨论】:
标签: javascript redis graphql apollo-server