如何合适地用消息队列做查询接口

2020-08-27 15:52:56 +08:00
 awesomelei

现有老大需求, 原先同步的接口改为异步的基于消息队列改造的接口, 这意味着一个原先的查询接口不能实时地返回数据, 现在问题是,前端查询页面是否得定时去抓未来可能的查询结果?是否得 ajax 轮询才能实现?

1857 次点击
所在节点    程序员
15 条回复
opengps
2020-08-27 15:55:15 +08:00
用消息队列提供查询结果??这个操作有点迷,你怎么确定 A 查询的结果 不是从队列里消费的 B 的查询结果?
rainbirda
2020-08-27 15:59:05 +08:00
可以开个 websocket,等消息队列消费后,向 websocket 返回数据,应该是可行的
killergun
2020-08-27 16:01:58 +08:00
看对实时性的要求,没有要求就轮询呗,有的话就需要实时通知了
awesomelei
2020-08-27 16:05:26 +08:00
@opengps 生产的时候加个唯一字段, 然后消费的时候带上这个字段值来保证对应关系,哈哈哈
littlewing
2020-08-27 16:05:35 +08:00
异步也不需要消息队列啊
awesomelei
2020-08-27 16:06:11 +08:00
@opengps 就是一个老接口改成 2 个消息系统 topic, 一个请求, 一个响应
dzdh
2020-08-27 16:09:48 +08:00
输出任务 id 然后轮询 id 结果?
kiracyan
2020-08-27 16:11:13 +08:00
看你业务咯 有实时要求就 Websocket 没有就轮询
opengps
2020-08-27 16:19:24 +08:00
@awesomelei 你消费了之后,比如说 A 消费了 B,那么 B 再去消费的时候就没有 B 的结果了
676529483
2020-08-27 16:36:16 +08:00
感觉应该是基于缓存去查询,基于消息队列去同步变化的数据
Rush9999
2020-08-27 16:37:59 +08:00
Varobjs
2020-08-27 17:06:05 +08:00
这样搞?
------------------------------------------------------------------
接口每次查询缓存是否有数据
有:直接返回
没有:发送刷新缓存的消息,返回空?

消息消费进程收到消息,请求 db | api 获取数据,丢进缓存
------------------------------------------------------------------
xuanbg
2020-08-27 17:57:04 +08:00
在接口响应特别慢的前提下,是应该先返回一个任务 id,然后用这个 id 轮询另一个接口获取数据。
oneisall8955
2020-08-27 22:50:13 +08:00
额,我司用的骚操作。整个流程如下:前端 A 调用后端 B,B 后端发异步消息给 C,C 接口很慢,C 有结果再异步发回给 B 。A 如何得到结果呢,前端说不能 ajax 轮询,也不能用 websocket,又不允许 B 阻塞

目前解决办法是:A 分两次请求,第一次请求使用 requestId 请求 B 的预查询接口,B 用消息中使用这个 ID 发消息给 C,C 结果消息再返回这个 ID,B 得到结果存带过期时间的缓存。

A 发完第一次请求后立即使用 ID 请求 B 的获取结果接口,B 用谷歌的重试库,10 秒内自动随机 10 次从缓存中获取结果,获取不到就是失败。

重试次数和时间都需要按照业务来估计,觉得这个方案还是很复杂。。。说到底第二次请求 B 也阻塞最多 10 秒了吧只是自动重试而已
no1xsyzy
2020-08-28 14:09:26 +08:00
@opengps #1 #9 转 token-based CPS 就行了,A 根本消费不到 B,甚至不知道还有 B
实践上可以是单独设置 topic,或者根据每个前端设置 topic

@awesomelei #0 经典四种:轮询、长轮询、SSE 、WebSocket
opendota 的分析请求就是轮询。

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

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

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

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

© 2021 V2EX