V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
maxthon
V2EX  ›  Node.js

多服务器实例下,怎么让不同请求的 backend 共享同一个 promise

  •  
  •   maxthon · 2022-08-14 19:42:27 +08:00 · 3797 次点击
    这是一个创建于 830 天前的主题,其中的信息可能已经有所发展或是发生改变。
    说明一下:
    - 用户会按时间顺序请求 A 接口 和 B 接口
    - 目前 B 接口需要请求第三方 api ,比较慢( 10 秒)
    - 现在想提前到 A 接口去请求,B 接口使用
    - 但是有一个问题就是不能保证 B 接口被访问的时候第三方 api 已经返回
    - 我的想法就是 A 接口 share 一个 promise ,让 B 接口可以拿到并等到数据返回

    但是目前并没有这样一个解决方案(因为 A 和 B 可能发生在不同服务器,所以无法直接共享文件或者内存)
    所以看看大家有没有什么比较好的解决方案

    (之前得到过一个方法:可以用 redis pubsub )
    7 条回复    2022-08-15 13:05:09 +08:00
    IvanLi127
        1
    IvanLi127  
       2022-08-15 00:39:41 +08:00 via Android
    这。。。大概可以理解成:
    在 A 时预加载 B 的数据,并在 B 被调用时使用这个数据。

    你可以让客户端或者 A 所在服务调用 B 所在服务,或者通过消息队列通知给 B 所在的服务。
    然后,你只要在 B 服务实现预加载或者是缓存功能就好了。
    maxthon
        2
    maxthon  
    OP
       2022-08-15 01:26:43 +08:00
    @IvanLi127 对于 B 接口不同时间的调用,也可能是由不同 server 承接
    maxthon
        3
    maxthon  
    OP
       2022-08-15 01:47:49 +08:00
    可以认为 A 和 B 在同一个 web service 中,但是这个 service 会有很多 server (或者 instance )
    libook
        4
    libook  
       2022-08-15 10:41:16 +08:00   ❤️ 1
    既然已经跨实例了,就已经脱离语言本身的范畴了,需要使用系统架构来满足需求。

    你得到了 redis pub/sub 的方法,就直接用这个方法呗。
    lmshl
        5
    lmshl  
       2022-08-15 12:12:42 +08:00   ❤️ 1
    建议负载均衡层面根据 token 做 sticky session ,这样就能保证客户端短时间请求始终转发到同一个 instance 中去了。
    内存里用 Map 简单缓存一下这个 Promise ,记得把时间也记录下来,定期清理掉过期的 Promise 防止泄漏
    lmshl
        6
    lmshl  
       2022-08-15 12:14:25 +08:00
    在这个基础上再实现一个 fallback 机制,极端情况下,前一个 instance 凑巧被杀死了,后一个缓存里读不到 Promise 的时候还是需要走全流程
    maxthon
        7
    maxthon  
    OP
       2022-08-15 13:05:09 +08:00
    @lmshl 好的,这个看起来比较不错
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   965 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:37 · PVG 05:37 · LAX 13:37 · JFK 16:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.