# tql-delayqueue
**Repository Path**: kuo-ge/tql-delayqueue
## Basic Information
- **Project Name**: tql-delayqueue
- **Description**: 延迟消息框架,延迟消息支持秒级精度、消息高可靠性、水平扩展,基于redisson实现
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2024-07-25
- **Last Updated**: 2024-08-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: 延迟消息, 延迟队列, redisson, Java
## README
# tql-delayqueue
#### 介绍
- 这是一个延迟消息框架,延迟消息支持秒级精度、消息高可靠性、水平扩展,基于redisson实现
- 写这个的原因是在公司的电商项目中,发现有类似的场景都需要这种能力(如:订单未支付超时后的回调通知以变更订单状态逻辑、多少时间后发起外卖骑手的呼叫等等):
- 如果是直接使用redisson的延迟队列,则会存在消息丢失的可靠性缺陷问题、高并发发送延迟消息中可能存在redis单key热点、使用的模版代码繁琐不通用等
- 调研发现一般大公司会基于消息中间件(如: kafka、Rabbitmq等)做定制化开发,但是这不具备通用性且大多只支持时间段级别的延迟 (1-3min一个时间段、4-10min一个时间段等等)即不支持秒级的延迟精度
- 同时,对于很多中小企业来说,更多的是业务发展,而非去实现一个延迟消息框架
- 底层基于redisson而非消息中间件,是因为redis目前是几乎所有项目都会使用的、轻量的,而消息中间件则不一定、偏重的
#### 阶段
##### 目前完成了功能最小集的开发:
- 支持namespace级别的延迟消息发送与隔离
- 支持基于partition的消息分区以及loadbalance
- 支持 one partition one poll queue thread 的线程封闭拉取队列消息和删除,同时支持在回调业务时可多线程并发执行
##### 接下来
- 会逐步扩大单元测试的覆盖面以check核心功能的可靠
- 也会尽快完善相关的设计和使用文档
- 会增加一些扩展点以支持AOP能力、数据指标能力等等
#### 快速开始
1、引入maven依赖 (以常见的spring starter为例)
```
tql
delayqueue-spring-boot-starter
1.0-SNAPSHOT
```
2、在你的Spring服务中注入tql服务并发送延迟消息
```
@Autowired
private TQLExecuteService tqlExecuteService;
public void sendDelayOrderCallbackMessage() {
tqlExecuteService.executeWithFixedDelay(new DelayQueueElement<>(orderCode), orderDataMap, "payOrder"), 60);
}
```
3、实现namespace级别的回调逻辑
```
@Namespace(name = "payOrder")
@Slf4j
public class PayOrderCallbackListener implements CallbackListener {
@Override
public void doCallback(String namespace, T data) {
log.info("payOrder callback, namespace:"+ namespace + ", data:" + data);
}
}
```
4、环境要求
- base on jdk8+
- redis
#### 基础概念
todo~
#### 软件架构
todo~