我有我的后端副本,以提供横向扩展。后端有apollo graphql订阅。还有一个微服务为特定订阅提供通知。
因为我在后端没有保存任何状态,所以我尝试通过实现redis pub/sub来解决这个问题。当microservice接收到一个事件时,它会发布到后端。
在订阅解析器的后端我有
webhookCalled: {
subscribe: withFilter(
() => pubsubMyEvent.asyncIterator([MY_EVENT]),
(payload, _, context) => {
return context.dataValues.id == payload.userid;
}
)
}
在上面的代码中,我试图过滤掉负载未寻址的订阅。我不太确定有多贵 withFilter
例行公事。当我接到redis的电话
pubsubMyEvent.publish(MY_EVENT, { myEventData });
我不喜欢的是每回都要处理( publish(...)
)所有事件,即使最后只有一个后端将实际向graphql客户端发送订阅消息。
问题:如何有效地处理向graphql订阅客户端发送事件,同时拥有可伸缩的后端?当需要通知单个websocket连接时,也许不必麻烦所有的后端拷贝。我是否应该跟踪redis中所有连接的客户端,以便redis知道每个graphql订阅客户端的连接位置?
1条答案
按热度按时间nhhxz33t1#
向订阅同一频道的所有客户端发送已发布的事件属于redis的性质。
保持相同体系结构的一个可能的解决方案是为每个用户使用不同的通道,而不是只使用一个通道。被备份者应该订阅频道
MY_EVENT + user.uuid
一旦一个新用户连接和取消订阅同一频道一旦用户断开。另一方面,一旦调用webhook,服务就不应该在全局通道上发布,而应该在MY_EVENT + user.uuid
频道。