多服务器实例下,怎么让不同请求的 backend 共享同一个 promise - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
maxthon
V2EX    Node.js

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

  •  
  •   maxthon 2022 年 8 月 14 日 4354 次点击
    这是一个创建于 1278 天前的主题,其中的信息可能已经有所发展或是发生改变。
    说明一下:
    - 用户会按时间顺序请求 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 年 8 月 15 日 via Android
    这。。。大概可以理解成:
    在 A 时预加载 B 的数据,并在 B 被调用时使用这个数据。

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

    你得到了 redis pub/sub 的方法,就直接用这个方法呗。
    lmshl
        5
    lmshl  
       2022 年 8 月 15 日   1
    建议负载均衡层面根据 token 做 sticky session ,这样就能保证客户端短时间请求始终转发到同一个 instance 中去了。
    内存里用 Map 简单缓存一下这个 Promise ,记得把时间也记录下来,定期清理掉过期的 Promise 防止泄漏
    lmshl
        6
    lmshl  
       2022 年 8 月 15 日
    在这个基础上再实现一个 fallback 机制,极端情况下,前一个 instance 凑巧被杀死了,后一个缓存里读不到 Promise 的时候还是需要走全流程
    maxthon
        7
    maxthon  
    OP
       2022 年 8 月 15 日
    @lmshl 好的,这个看起来比较不错
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3265 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 05:44 PVG 13:44 LAX 21:44 JFK 00:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86