标签: BlockingQueue
SpringBoot 阻塞队列
01/08/2021QueueBlockingQueueSpringJavaProgrammatic
之前在订单场景使用过DelayedQueue延时列队,实际上还有阻塞列队的用法。刚工作那会写爬虫的时候有使用过。这里总结下使用。
BlockingQueue
- 阻塞列队,BlockingQueue是java.util.concurrent包下的实现类。提供了线程安全的列队访问方式,当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。

SpringBoot 延时队列
12/30/2020SpringDelayedQueueBlockingQueueJava
突然发现公司订单小哥的消息列队是用redis做的,而且用的是list。这里自己也实现下简单的阻塞列队。用于处理延时消息的问题。
- 延时列队就是一种带有延迟功能的消息列队。通常具备消息存储、过期消息的实时获取、高可用。消费熔断。
- 业务场景
- 订单未支付超时。
- 订单发货提醒。
- 短信提醒。
- 自动收货。
- 自动评论。
- 自动取消订单,不发货的情况下。
- 常用的解决方案
- 定时轮询任务,比如jdk中TimerThread轮询数据库表、缓存中的数据。频繁的轮询容易出现过度资源消耗。对数据和缓存也有一定的影响。但是可以作为辅助手段,通常用于补偿或者初始化数据。
- ScheduledExecutorService 周期性线程池
- 时间轮(kafka、Netty的HashedWheelTimer)
- 使用mysql通常是定时扫描表,找出符合条件的数据进行处理。消费成功则更新数据。
- 使用redis可以使用zset,通过分值进行排序。定时轮询的方式去获取符合条件的记录。消费数据后删除消息。失败则重新进入队列。
- Java中java.util.concurrent.DelayQueue
- Jdk实现,列队处于jvm中,不支持分布式和消息持久化。
- Rocketmp延时列队
- 消息持久、重试、分布式等等特性。
- 不支持任意时间精度的,支持level级别的延时消息。