延遲任務(wù)的應(yīng)用場(chǎng)景比較廣泛,比如訂單超時(shí)關(guān)閉交易,支付結(jié)果延遲推送等逮栅,實(shí)現(xiàn)方案比較多,這期我們將介紹一下利用RabbitMQ死信隊(duì)列實(shí)現(xiàn)延遲任務(wù)军俊。
實(shí)現(xiàn)原理
RabbitMQ的死信隊(duì)列可以設(shè)置一個(gè)超時(shí)時(shí)間粪躬,超時(shí)之后之后消息可以回到綁定的隊(duì)列中昔穴,此時(shí)回調(diào)用戶給定的接口即可泳唠;原理簡(jiǎn)單但是需要保證消息的可靠性
源碼地址
https://github.com/WinterChenS/delay-server
項(xiàng)目依賴
- jdk8
- maven
- springboot 2.3.0
- Redis
- RabbitMQ
- docker (可選)
實(shí)現(xiàn)功能
- 可通用的延時(shí)任務(wù)服務(wù)
- 可定制的超時(shí)時(shí)間以及重試次數(shù)宙搬,確保消息的可靠
- 回調(diào)異常重試
- 可拓展的失敗消息存儲(chǔ)策略
如何使用
1.拉取代碼
git clone https://github.com/WinterChenS/delay-server.git
2.修改application.properties
3.編譯
以下方式選一即可
3.1 普通編譯
cd delay-server &&
mvn clean package
3.2 docker編譯
cd delay-server &&
mvn clean package docker:build
4.運(yùn)行
運(yùn)行方式選一即可
4.1 普通運(yùn)行
cd target &&
nohup java -jar delay-server-0.0.1-SNAPSHOT.jar &
4.2 docker運(yùn)行
docker run -p 8088:8088 -d winterchen/delay-server
5.調(diào)用
OkHttp
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n \"id\": \"0923840293429384023\",\n \"expireTime\": 3,\n \"message\": \"hello\",\n \"callbackPath\": \"http://127.0.0.1:8088/test/success\",\n \"currentTime\": 29387492384,\n \"retryCount\": 3\n}");
Request request = new Request.Builder()
.url("http://127.0.0.1:8088/api/v1/default/delay")
.post(body)
.addHeader("Content-Type", "application/json")
.addHeader("cache-control", "no-cache")
.build();
Response response = client.newCall(request).execute();
接口參數(shù)描述:
參數(shù)名 | 類型 | 解釋 | 是否必須 | 示例 |
---|---|---|---|---|
id | String | 請(qǐng)求唯一ID | 是 | 982739492347932 |
expireTime | Long | 過(guò)期時(shí)間(秒) | 是 | 30 |
message | String | 消息體(隨意字符串) | 是 | {"name":"ston","message":"23424"} |
callbackPath | String | 過(guò)期回調(diào)地址 | 是 | http://127.0.0.1:8088/test/success |
currentTime | Long | 當(dāng)前系統(tǒng)時(shí)間 | 是 | 29387492384 |
retryCount | Integer | 失敗重試次數(shù)(默認(rèn)無(wú)限重試) | 否 | 0 |
docker鏡像使用
docker
docker run -p 8088:8088 \
-e SERVER_PORT=8088 \
-e SPRING_RABBITMQ_HOST=127.0.0.1 \
-e SPRING_RABBITMQ_PORT=5672 \
-e SPRING_RABBITMQ_USERNAME=guest \
-e SPRING_RABBITMQ_PASSWORD=guest \
-e SPRING_REDIS_HOST=127.0.0.1 \
-e SPRING_REDIS_PORT=6379 \
-e SPRING_REDIS_PASSWORD=root \
-e SPRING_REDIS_TIMEOUT=10000 \
winterchen/delay-server
docker-compose
version: '3'
services:
delay-server:
container_name: delay-server
image: winterchen/delay-server
ports:
- "8088:8088"
volumes:
- "./delay/log:/log"
environment:
SERVER_PORT: 8088
SPRING_RABBITMQ_HOST: 127.0.0.1
SPRING_RABBITMQ_PORT: 5672
SPRING_RABBITMQ_USERNAME: guest
SPRING_RABBITMQ_PASSWORD: guest
SPRING_RABBITMQ_LISTENER_SIMPLE_ACKNOWLEDGE-MODE: manual
SPRING_REDIS_HOST: 127.0.0.1
SPRING_REDIS_PORT: 6379
SPRING_REDIS_PASSWORD: root
SPRING_REDIS_TIMEOUT: 10000
SPRING_REDIS_DATABASE: 0
SPRING_REDIS_LETTUCE_POOL_MAX_ACTIVE: 8
SPRING_REDIS_LETTUCE_POOL_MAX_WAIT: -1
SPRING_REDIS_LETTUCE_POOL_MAX_IDLE: 8
SPRING_REDIS_LETTUCE_POOL_MIN_IDLE: 0
COM_WINTERCHEN_FAIL_STORE_STRATEGY_CODE: REDIS
拓展
該服務(wù)支持arrch64谆级,點(diǎn)擊即可獲取詳細(xì)使用方法
點(diǎn)擊進(jìn)入
使用注意事項(xiàng)
- 該項(xiàng)目?jī)H供學(xué)習(xí)哨苛,請(qǐng)勿在生產(chǎn)中使用
- 使用該服務(wù)需要保證回調(diào)接口的冪等性