黑马点评+延时队列
时间: 2025-04-02 16:04:04 浏览: 49
### 黑马点评系统的延时队列实现方式
在黑马点评系统中,延时队列的功能可以通过多种技术手段来实现。以下是几种可能的方式及其特点:
#### 1. **基于 RocketMQ 的延迟队列**
RocketMQ 提供了内置的延迟消息功能,可以用于实现延时队列。然而需要注意的是,RocketMQ 只支持预定义的时间间隔(如 1 秒、5 秒、10 秒……直到 2 小时),并不支持任意时间长度的延迟设置[^1]。
如果项目需求允许使用这些固定的时间段,则可以直接利用 RocketMQ 的延迟队列特性完成任务调度。对于超出其能力范围的需求,开发者需要额外设计逻辑补充不足之处。
#### 2. **通过 Redis ZSet 实现自定义延迟队列**
另一种常见做法是在 Redis 中借助有序集合 (ZSet) 来构建自己的延迟队列解决方案[^2]。具体而言,每条待处理的任务会被存入 ZSet 数据结构里,并附带一个表示到期时刻的分数值(score),该数值通常由当前 Unix 时间戳加上期望等待毫秒数构成。随后可通过定时轮询或者阻塞弹出操作取出已到达执行条件的数据项继续后续流程。
此方法灵活性较高,能够满足更精确到毫秒级甚至更低粒度上的控制要求;不过相比专用的消息中间件产品来说,在性能表现上可能会有所差异,特别是在高并发场景下需谨慎评估资源消耗情况以及潜在瓶颈所在位置等因素影响下的整体效率水平变化趋势等问题。
#### 3. **结合实际业务场景的选择**
考虑到不同工具各有优劣,最终选用哪种方案还需依据具体的业务背景决定。例如,在某些情况下,尽管 RabbitMQ 和 Kafka 都具备原生支持延迟消息的能力,但如果现有架构已经大量依赖于 Redis ,那么为了减少引入新技术带来的复杂性和维护成本,采用上述提到过的基于 Redis 的 DIY 版本或许会更加合适一些[^3]。
综上所述,无论是选择成熟的第三方组件还是自行开发简易版替代品都需要综合考量多方面因素之后再做定夺。
```python
import time
from redis import StrictRedis
def add_task(redis_client, task_id, delay_seconds):
"""向 Redis 添加带有延迟属性的任务"""
execute_time = int(time.time()) + delay_seconds
redis_client.zadd('delay_queue', {task_id: execute_time})
def process_tasks(redis_client):
"""持续监控并处理就绪状态中的任务"""
while True:
current_timestamp = int(time.time())
ready_tasks = redis_client.zrangebyscore(
'delay_queue', '-inf', str(current_timestamp))
if not ready_tasks:
continue
for task in ready_tasks:
handle_task(task.decode('utf-8'))
# 清理已完成任务记录
redis_client.zremrangebyscore('delay_queue', '-inf', str(current_timestamp))
def handle_task(task_id):
print(f'Processing Task ID:{task_id}')
if __name__ == '__main__':
rds_cli = StrictRedis(host='localhost', port=6379, db=0)
# 示例:添加两个分别延迟 5 秒和 10 秒后的任务
add_task(rds_cli, 'job_001', 5)
add_task(rds_cli, 'job_002', 10)
# 启动处理器线程/进程...
process_tasks(rds_cli)
```
阅读全文
相关推荐









