当前位置:网站首页>Leader: who can use redis expired monitoring to close orders and get out of here!
Leader: who can use redis expired monitoring to close orders and get out of here!
2022-06-25 04:43:00 【Java confidant_】
Click on the official account , Practical technical articles Know in time 
I read teacher a Niu's masterpiece a few days ago Leader : Who uses the scheduled task to close the order , Get out of here ![1] It is found that the scheme has several flaws , Here are some suggestions for discussion .
In the electricity supplier 、 Payment and other fields , There are often such scenes , The user gave up payment after placing an order , The order will be closed after the specified time period , Careful, you must have found something like a treasure 、 A certain East has such logic , And the time is accurate , Error in 1s Inside ; How did they achieve it ?
There are several general implementation methods :
Use rocketmq、rabbitmq、pulsar Wait for the delayed delivery function of the message queue
Use redisson Provided DelayedQueue
There are some schemes that are widely circulated but have fatal defects , Don't use it to implement deferred tasks
Use redis Expired monitoring for
Use rabbitmq The dead letter line
Use non persistent time wheels
redis Overdue monitoring
stay Redis The official Manual of keyspace-notifications: timing-of-expired-events It is clearly stated in :
Basically expired events are generated when the Redis server deletes the key and not when the time to live theoretically reaches the value of zero
redis The implementation of automatic expiration is : Scheduled task offline scan and delete some expired keys ; Lazy checking for expiration when accessing keys and deleting expired keys .redis There is no guarantee that it will be deleted and sent an expiration notice at the set expiration time . actually , It is also common that the expiration notification is several minutes later than the set expiration time .
In addition, the key space notification is sent and forgotten (fire and forget) Strategy , Delivery is not guaranteed like message queuing . When a client subscribes to events, it will lose all the events distributed to it during disconnection .
This is a more “LOW” Solutions for , Please do not use .
Another big guy did the test Don't rely too much on Redis Expired monitoring for [2], If you are interested in it, you can check it by yourself .
rabbitmq Dead letter
Dead letter (Dead Letter) yes rabbitmq A mechanism provided . When a message meets one of the following conditions, it will become dead letter :
Message denied confirmation ( Such as
channel.basicNack) And at this point requeue Property is set to false.The message's lifetime in the queue exceeds the set TTL Time
The number of messages in the message queue has exceeded the maximum queue length
If dead letter queue is configured , Dead letter will be rabbitmq Put it in the dead letter queue .
stay rabbitmq The process of creating a dead letter queue in the :
Create a switch as a dead letter switch
Configure in the business queue
x-dead-letter-exchangeandx-dead-letter-routing-key, Set the switch in the first step as the dead letter switch of the service queueCreate a queue on the dead letter switch , And listen to this queue
Dead letter queue is designed to store messages that are not normally consumed , Easy to check and re deliver . The dead letter queue also does not guarantee the delivery time , Before the first message becomes a dead letter , The following messages will not be delivered as dead letters even if they are expired .
To solve this problem ,rabbit The official launch of the delayed delivery plug-in rabbitmq-delayed-message-exchange , It is recommended to use the official plug-in for delay messages .
Here's a digression , Use redis Overdue monitoring or rabbitmq The dead letter queue uses Middleware in a way unexpected to the designer , There are some hidden dangers in this unexpected behavior , Such as lack of consistency and reliability assurance , Low throughput 、 Resource leakage, etc . A famous example is that many people use redis Of list As message queue , So that the last author can't read and write disque And finally evolved into
redis stream. Try not to abuse middleware at work , Do professional things with professional components
Time wheel
Time wheel is an excellent data structure for timed tasks , However, the vast majority of time wheel implementations are pure memory without persistence . After the process running the time wheel crashes, all the tasks in it will disappear , So I advise you to use it carefully .
redisson delayqueue
redisson delayqueue It's based on redis zset Implementation of delay queue based on .delayqueue One of them is called timeoutSetName Ordered set of , Of the elements score Is the delivery timestamp .delayqueue Can use regularly zrangebyscore Scan messages that have reached the delivery time , Then move them to the ready message list .
delayqueue Guarantee redis Messages are not lost without crashing , Try it when you don't have a better solution .
When the database index is well designed , The overhead of regularly scanning the database for outstanding orders is not as large as expected . In the use of redisson delayqueue The method of scanning the database can be used as the compensation mechanism when waiting for timed task middleware , Avoid task loss caused by middleware failure .
Conclusion
First of all, it is recommended to use
rocketmq、pulsarAnd other message queues with scheduled delivery function .When it is not convenient to obtain a professional message queue, you can consider using
redisson delayqueueBased on redis Delay queue scheme , But for redis Design compensation protection mechanism in case of crash .When you can't use
redisson delayqueueYou can consider using the time wheel . Because the time wheel restart is far better than redis Restart frequently , Protection mechanisms such as regular library scanning are more important .Never use redis Overdue monitoring implements scheduled tasks .
Reference resources :
https://juejin.cn/post/6987233263660040206
https://juejin.cn/post/6844904158227595271
source :cnblogs.com/Finley/p/16395466.html
recommend
Technical involution group , Learn together !!

PS: Because the official account platform changed the push rules. , If you don't want to miss the content , Remember to click after reading “ Looking at ”, Add one “ Star standard ”, In this way, each new article push will appear in your subscription list for the first time . spot “ Looking at ” Support us !
边栏推荐
- Kotlin Compose 监听软键盘 点击enter提交事件
- 领导:谁再用 Redis 过期监听实现关闭订单,立马滚蛋!
- 【无标题】
- 哪个编程语言实现hello world最烦琐?
- Cannot import name 'escape' from 'jinja2' [solved successfully]
- GBASE 8s存储过程语法结构
- jsz中的join()
- CTF_ Web: how to recognize and evaluate a regular expression
- Le chemin de l'apprentissage immutable - - Adieu à la copie traditionnelle
- 为什么TCP握手刚刚好是3次呢?
猜你喜欢

为什么SQL语句命中索引比不命中索引要快?

Record small knowledge points

Vscode 设置clang-format

Record the problem of C # print size once

Php7.2 add JPEG extension

简单的恶意样本行文分析-入门篇

GBASE 8s 总体架构

CTF_ Web: Learn flask template injection (SSTI) from 0

"Daily practice, happy water" 1108 IP address invalidation

Gbase 8s overall architecture
随机推荐
PostgreSQL database Wal - RM_ HEAP_ ID logging action
jsz中的join()
Cascading deletion of gbase 8s
GBase 8s的封锁技术的基本介绍
Classification of gbase 8s locks
哪个编程语言实现hello world最烦琐?
Gbase 8s stored procedure flow control
Unity Quad culls shaders with back faces and transparent parts
515. find the maximum value / Sword finger offer II 095 in each tree row Longest common subsequence
成功解决:selenium.common.exceptions.TimeoutException: Message: timeout: Timed out receiving message from
GBASE 8S内存管理
【Flink】RocksDB增量模式checkpoint大小持续增长的问题及解决
计算学生成绩等级(虚函数和多态)
After the newly assigned variable of the applet is modified, the original variable will also be modified
Gbase 8s parallel operation problem scenario description
"Daily practice, happy water" 1108 IP address invalidation
第九章 APP项目测试(2) 测试工具
Kotlin Compose 监听软键盘 点击enter提交事件
CTF_ Web:php weak type bypass and MD5 collision
多睡觉,能减肥,芝加哥大学最新研究:每天多睡1小时,等于少吃一根炸鸡腿...