javascript - 是否可以以这种方式使用 Node-Redis 还是我会坚持使用 websockets?

标签 javascript node.js redis node-redis fastify

我一直在考虑一个涉及以下内容的设计:

  1. 客户端向端点发出 POST 请求
  2. 然后,该路由(从返回我字符串化的请求对象的构造函数)发布到 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 请求:

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

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

    发布回 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/

    相关文章:

    windows - cpp_redis::subscriber -> connect 导致异常:connect() 失败

    azure - 使用 ServiceStack 加密 Azure 上的 Redis 消息

    javascript - jQuery 不响应 AJAX 加载的内容

    node.js - 使用 Nodejs Selenium Webdriver 实现 headless 自动化

    javascript - 在 AngularJs 中将第一个空输入集中在 html 表单中

    node.js - 数据验证停止工作 multipart/form-data

    node.js - 使用 Node IPC Namedpipe 和 Vb6 CallNamedPipe 客户端

    ruby-on-rails - Redis 查找 set 包含元素的键

    javascript - 在 Angular2 中使用可观察的与其他组件的对话,不接收即将到来的值

    javascript - mustache 模板 : nested templates