我一直在考虑一个涉及以下内容的设计:
- 客户端向端点发出 POST 请求
- 然后,该路由(从返回我字符串化的请求对象的构造函数)发布到 Redis channel 。例如
( {request: String, transid: String, data: Object } )
- 另一台服务器监听该 channel ,解析 JSON -> 从 obj 切换请求 key
- 是否具有验证凭据等功能;
- 调用一个类,该类返回一个预制响应对象,该对象被转换为 str,并通过同一(或另一个 channel )发送回正在异步监听等待的路由处理程序(通过该 channel 发送原始请求)(在在这种情况下,fastify。)例如
( { "transid": "1234-Abcd-5678-abcde", "state": Boolean, data: <data> } )
时间轴
路由处理程序向 redis 监听器发出 Pub 请求:
( {request: "auth", transid: "1234-Abcd-5678-abcde", data: { email: "test@test.com", "password": "pass" } )
另一台服务器上的订阅监听器进行内部凭据验证
发布回 Redis channel
( {transid: "1234-Abcd-5678-abcde", state: false, data: { error: "Incorrect" } } )
使用库特定方法(即 request.send(200))路由处理程序回复客户端
我的问题是我不太明白如何实现上述时间线中步骤 4 的结果;即是否有可能在路由处理程序中几乎等待消息?我已经非常接近了,但我怀疑当我设计可扩展的东西时,这是否是一种实用的解决方法。 (用户将详细信息发送到/endpoint,/endpoint 路由处理程序将 json 消息发布到 channel ,外部服务器监听解析该消息并将其发送到 switch 语句,即 [switch(data.request)],该语句调用执行 DB 的函数操作,然后使用类构造函数生成一个对象,通过 redis channel 发送回等待回复的路由处理程序,然后回复客户端。)
请问大家对此有什么意见吗?
最佳答案
pub/sub 背后的概念是解耦并执行异步任务,但你强制系统采用同步风格,这就会消失他的所有优点。
例如:如果您发布消息,但没有订阅者收到它..您会做什么?重试? - 客户端超时,错误? - 但用户只想登录并且数据库已启动并运行
此外,当流量增加时,响应会变得更慢,因为由于 pub/sub 是广播的,所以所有这些消息只有一个订阅者,并且您不想两次处理登录逻辑! (我假设)
因此,要解决这个问题,您应该实现一个点对点逻辑,其中: - 所有订阅者都会收到消息 - 每个订户都互相认识 - 一位订阅者说“我会做这份工作” - 一位“主要”订户表示没问题 - 其他订阅者丢弃该消息 - 主要订户崩溃,您需要选举才能拥有新的主要订户。 - 等等...
但这就是消息代理的作用或 redis stream api does ,所以你不需要自己实现这个。 我以前也这么做过,但那时 Redis 5 还不存在。
出于这些原因,我认为你应该以同步方式进行同步工作。 pub/sub 不适合您的使用示例。
关于javascript - 是否可以以这种方式使用 Node-Redis 还是我会坚持使用 websockets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60871266/