场景:爬虫抓取任务出现积压的时候往往是抓取策略出现了一些变化,此时需要人为干预恢复抓取,但是此时会积压过多存量信息。
比如积压 10k 条,日进 5k 条,每小时能处理 1k 条,那么比如服务挂掉两天之后开始恢复,队列里面就积压了 20k 条,预计的恢复时间大概是一天。(恢复:最新今队列的数据能在比较短的时间被处理)
如果依赖消息队列,我能想到这两个思路:
感觉都需要人工干预队列的行为,我想的是有没有一种类似堆栈的中间件,实现 LIFO,永远处理的是最新进来的消息,处理完之后开始尝试旧的存量的消息,直到都消费完为止?
1
amwyyyy 2021-07-13 11:14:13 +08:00
rocketmq pull 模式,想怎么消费随你
|
3
xiaoqiao24 2021-07-13 14:12:02 +08:00
|
4
kop1989 2021-07-13 15:36:46 +08:00
把每次新 push 进来的消息都添加到队列头。
|
5
kop1989 2021-07-13 15:37:55 +08:00
但是这样做过于简单粗暴,我觉得你所需要的不光是后进先出,而是具有当前 /历史标记。当前标记的走队列,历史标记的走栈,这样更加合理一点。
|
6
swulling 2021-07-13 15:45:21 +08:00
你的根本需求,可以用双队列实现。
定义两个队列,1 和 2 。写入方先写 1,故障恢复后,切换为写 2 。 消费者同时轮询消费 1 和 2,这样存量消息和新消息按相同的速度消费,直到 1 消费完成。 |
7
a719114136 2021-07-13 16:24:20 +08:00
redis 可以。
RabbitMQ 的话得自己做一些操作,不想人工干预的话就通过多个队列: 1. 找个地方维护一个队列名列表 2. 爬虫永远往队列名列表中的最新一个插入 3. 消费者每次启动向队列名列表中插入一个新队列名 |