【问题标题】:Is it possible to use Node-Redis in this fashion or will I stick to websockets?是否可以以这种方式使用 Node-Redis,还是我会坚持使用 websockets?
【发布时间】:2020-03-30 15:08:50
【问题描述】:

我一直在考虑一个设计,涉及:

  1. 客户端向端点发出 POST 请求
  2. 然后,路由(从返回我字符串化的请求对象的构造函数)发布到 redis 通道。例如
( {request: String, transid: String, data: Object } )
  1. 另一台服务器监听该频道,解析 JSON -> 从 obj 切换请求密钥
  2. 是否具有验证凭据等功能;
  3. 调用一个类,该类返回一个预制的响应对象,该对象转换为 str,并通过相同(或另一个通道)发送回正在异步侦听等待的路由处理程序(通过该通道发送原始请求)(在这种情况下,fastify。)例如
    ( { "transid": "1234-Abcd-5678-abcde", "state": Boolean, data: <data> } )

时间轴

路由处理程序向 redis 监听器发出 Pub 请求:

  1. ( {request: "auth", transid: "1234-Abcd-5678-abcde", data: { email: "test@test.com", "password": "pass" } )

  2. 另一台服务器上的订阅侦听器执行内部凭据验证

发布回 redis 频道

  1. ( {transid: "1234-Abcd-5678-abcde", state: false, data: { error: "Incorrect" } } )

  2. 路由处理程序使用库特定方法(即 request.send(200))回复客户端

我的问题是我不完全理解如何在上述时间线中实现第 4 步的结果;即是否有可能在路由处理程序中几乎等待消息?我已经非常接近了,但是当我设计能够扩展的东西时,我质疑这是否是一种实用的方法。 (用户将详细信息发送到 /endpoint,/endpoint 路由处理程序将 json 消息发布到通道,外部服务器侦听解析消息并将其发送到 switch 语句,即 [switch(data.request)],该语句调用执行 DB 的函数操作,然后使用类构造函数生成一个对象,通过 redis 通道发送回路由处理程序,该处理程序将等待回复,然后回复给客户端。)

请问有人对此有意见吗?

【问题讨论】:

    标签: javascript node.js redis node-redis fastify


    【解决方案1】:

    pub/sub 背后的概念是解耦和执行异步任务,但你正在强制系统采用同步风格,这让他的所有优点都消失了。

    例如:如果您发布消息,没有订阅者收到它..您会做什么?重试? - 客户端超时,错误? - 但用户只想登录并且数据库正在运行

    此外,当流量增加时,响应会变慢,因为所有这些消息都只有一个订阅者,因为 pub/sub 是广播的,并且您不想处理两次登录逻辑! (我假设)

    所以要解决它,您应该实现一个 peer2peer 逻辑,其中: - 所有订阅者都收到消息 - 每个订阅者都互相认识 - 一位订阅者说“我会完成这项工作” - 一位“主要”订户说没关系 - 其他订阅者丢弃该消息 - 主要订阅者崩溃,您需要选举才能拥有新的主要订阅者.. - 等等...

    但这是消息代理或redis stream api does 所做的,因此您不需要自己实现。 我过去做过,但 Redis 5 还不存在。

    出于这些原因,我认为您应该以同步的方式进行同步工作。 pub/sub 不适合您的使用示例。

    【讨论】:

    • 感谢 Manuel 的洞察力和替代使用方向。我之前的逻辑是尝试通过使用自我声明的订阅者 UID 来强制 redis pubsub 成为本地消息代理,但我不相信一旦我将来扩展它就会非常实用。我确实同意,也许我试图强制一些本机用于异步的东西。我只看了 10 秒钟的流 api 就误认为它是一些日志代理,完全忽略了它也是一个信使代理的意义。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 2022-06-23
    • 1970-01-01
    • 2012-11-06
    相关资源
    最近更新 更多