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

2022-08-14 19:42:27 +08:00
 maxthon
说明一下:
- 用户会按时间顺序请求 A 接口 和 B 接口
- 目前 B 接口需要请求第三方 api ,比较慢( 10 秒)
- 现在想提前到 A 接口去请求,B 接口使用
- 但是有一个问题就是不能保证 B 接口被访问的时候第三方 api 已经返回
- 我的想法就是 A 接口 share 一个 promise ,让 B 接口可以拿到并等到数据返回

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

(之前得到过一个方法:可以用 redis pubsub )
3606 次点击
所在节点    Node.js
7 条回复
IvanLi127
2022-08-15 00:39:41 +08:00
这。。。大概可以理解成:
在 A 时预加载 B 的数据,并在 B 被调用时使用这个数据。

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

你得到了 redis pub/sub 的方法,就直接用这个方法呗。
lmshl
2022-08-15 12:12:42 +08:00
建议负载均衡层面根据 token 做 sticky session ,这样就能保证客户端短时间请求始终转发到同一个 instance 中去了。
内存里用 Map 简单缓存一下这个 Promise ,记得把时间也记录下来,定期清理掉过期的 Promise 防止泄漏
lmshl
2022-08-15 12:14:25 +08:00
在这个基础上再实现一个 fallback 机制,极端情况下,前一个 instance 凑巧被杀死了,后一个缓存里读不到 Promise 的时候还是需要走全流程
maxthon
2022-08-15 13:05:09 +08:00
@lmshl 好的,这个看起来比较不错

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/872800

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX