RabbitMQ 或者其他中间件能不能实现 LIFO 的堆栈而不是队列呢?

2021-07-13 10:49:56 +08:00
 phpfpm

场景:爬虫抓取任务出现积压的时候往往是抓取策略出现了一些变化,此时需要人为干预恢复抓取,但是此时会积压过多存量信息。

比如积压 10k 条,日进 5k 条,每小时能处理 1k 条,那么比如服务挂掉两天之后开始恢复,队列里面就积压了 20k 条,预计的恢复时间大概是一天。(恢复:最新今队列的数据能在比较短的时间被处理)

如果依赖消息队列,我能想到这两个思路:

  1. 把存量消息都清掉,然后按照一定速率慢速回放插入队列
  2. 把存量消息都清掉,把所有的存量消息以低优先级插入队列

感觉都需要人工干预队列的行为,我想的是有没有一种类似堆栈的中间件,实现 LIFO,永远处理的是最新进来的消息,处理完之后开始尝试旧的存量的消息,直到都消费完为止?

1113 次点击
所在节点    问与答
7 条回复
amwyyyy
2021-07-13 11:14:13 +08:00
rocketmq pull 模式,想怎么消费随你
phpfpm
2021-07-13 13:44:03 +08:00
@amwyyyy 一股脑都推过来然后爱咋地咋地是吧

也。。行。。吧。。。。
xiaoqiao24
2021-07-13 14:12:02 +08:00
kop1989
2021-07-13 15:36:46 +08:00
把每次新 push 进来的消息都添加到队列头。
kop1989
2021-07-13 15:37:55 +08:00
但是这样做过于简单粗暴,我觉得你所需要的不光是后进先出,而是具有当前 /历史标记。当前标记的走队列,历史标记的走栈,这样更加合理一点。
swulling
2021-07-13 15:45:21 +08:00
你的根本需求,可以用双队列实现。

定义两个队列,1 和 2 。写入方先写 1,故障恢复后,切换为写 2 。

消费者同时轮询消费 1 和 2,这样存量消息和新消息按相同的速度消费,直到 1 消费完成。
a719114136
2021-07-13 16:24:20 +08:00
redis 可以。

RabbitMQ 的话得自己做一些操作,不想人工干预的话就通过多个队列:
1. 找个地方维护一个队列名列表
2. 爬虫永远往队列名列表中的最新一个插入
3. 消费者每次启动向队列名列表中插入一个新队列名

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

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

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

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

© 2021 V2EX