当前位置:网站首页>How to encapsulate distributed locks more elegantly
How to encapsulate distributed locks more elegantly
2020-11-06 01:19:00 【Yin Jihuan】
Distributed locks usually have many choices , be based on Redis Of , be based on Zookeeper Of , Based on database and so on .
Redis For caching data , It's used in projects , So use Redis There will be a little more distributed locks .
If you use Redis To make a lock , You can use open source solutions directly , such as redisson.
The most common uses are as follows :
RLock lock = redisson.getLock("anyLock");
lock.lock();
run();
lock.unlock();
Get lock object , call lock() Lock , Execute business logic , call unlock() Release the lock .
Although the framework provides a very simple way to use it , But we still need to do a layer of packaging for the lock . The purpose of packaging is to improve scalability and ease of use .
Abstract interface
If we use it directly redisson The native API Make locks , So many places will appear RLock Related code , And then one day , For some reason , The lock needs to be replaced , At this time, the scope of change is relatively large . Each uses RLock Everything has to be changed .
Here's the picture : quite a lot Service Are used to RLock.lock() Method , When we need to replace locks , All the classes and methods involved have to be modified , The change points are shown in the red section .
So we need to do a layer of abstraction , You can define a DistributedLock Interface to provide lock related capabilities , Provides multiple implementations , This makes it easy to replace and expand .
Here's the picture : Every Service It's all for DistributedLock Interface to lock , When we need to replace the lock implementation , It doesn't need to be changed , Just replace DistributedLock The realization of .
Automatic release
Automatic release refers to after locking , After the execution of business logic, the lock needs to be closed automatically . In front of Redisson We need to manually call unlock() To release the lock held .
Of course Redisson It also provides the function of timeout release , Under normal circumstances, the lock must be released after the completion of business execution , The next request for the same lock can continue to be processed .
The most common problem with manually releasing resources is forgetting to release , So in JDK7 Introduced in try-with-resources To release resources automatically , I believe everyone is familiar with .
So when we encapsulate , Try not to let the user release it manually , Reduce the probability of error . For those with results, we can use Supplier To deliver your logic , For those that do not return results, you can use Runnable To deliver your logic .
/**
* Lock
* @param key lock Key
* @param waitTime Try to lock , Waiting time (ms)
* @param leaseTime Failure time after locking (ms)
* @param success The logic of successful lock execution
* @param fail Logic of lock failure execution
* @return
*/
<T> T lock(String key, int waitTime, int leaseTime, Supplier<T> success, Supplier<T> fail);
Use :
String result = distributedLock.lock("1001", 1000, () -> {
System.out.println(" Came in ....");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "success";
}, () -> {
System.out.println(" Locking failed ....");
return "fail";
});
Disaster recovery
Another issue to note is the availability of locks , In case the corresponding Redis Something is wrong. , This time to lock is bound to fail , If nothing is done , It will affect normal business operations , Make the business unavailable .
In addition to realizing Redis Outside the lock of , Other locks can be implemented , Like database locks . When Redis When a lock is not available, it is demoted to a database lock , Although performance has an impact , But it doesn't affect the business .
If the database lock is not available ( Digression : It's very unlikely that everything will be available ), It's better to let business operations fail . Because we use the lock scene , It must be to prevent problems caused by concurrent scenarios , If the lock is not available , You're going to spend abnormally , Let business operations continue , There may be business problems without locking .
Of course, monitoring is also very necessary ,Redis, Database monitoring . When something goes wrong , There's a timely intervention .
Monitoring system
Redis, database ,Zookeeper The monitoring of these middleware supporting distributed implementation is definitely necessary . Another monitoring is the fine-grained monitoring of the lock action .
For example, the time to lock , Time to release lock , Time to execute business in a lock , Lock concurrency , Number of executions , The number of lock failures .
These data indicators are very important , It can help you find problems in time . such as 10 Hundreds of lock failures per second , All demoted to database locks , This is when you get an alert , It's easy to see Redis Something is wrong. , Timely solution .
The way of monitoring is just as casual , Every company is different , You can expose data to Prometheus Grab , You can also integrate Cat Do a good job , As long as you can monitor , Just give an alarm .
About author : Yin Jihuan , Simple technology enthusiasts ,《Spring Cloud Microservices - Full stack technology and case analysis 》, 《Spring Cloud Microservices introduction Actual combat and advanced 》 author , official account Ape world Originator .
I have compiled a complete set of learning materials , Those who are interested can search through wechat 「 Ape world 」, Reply key 「 Learning materials 」 Get what I've sorted out Spring Cloud,Spring Cloud Alibaba,Sharding-JDBC Sub database and sub table , Task scheduling framework XXL-JOB,MongoDB, Reptiles and other related information .
版权声明
本文为[Yin Jihuan]所创,转载请带上原文链接,感谢
边栏推荐
- WeihanLi.Npoi 1.11.0/1.12.0 Release Notes
- DRF JWT authentication module and self customization
- Network security engineer Demo: the original * * is to get your computer administrator rights! 【***】
- Nodejs crawler captures ancient books and records, a total of 16000 pages, experience summary and project sharing
- Asp.Net Core learning notes: Introduction
- Subordination judgment in structured data
- 【效能優化】納尼?記憶體又溢位了?!是時候總結一波了!!
- 使用 Iceberg on Kubernetes 打造新一代云原生数据湖
- It's so embarrassing, fans broke ten thousand, used for a year!
- [performance optimization] Nani? Memory overflow again?! It's time to sum up the wave!!
猜你喜欢
事半功倍:在没有机柜的情况下实现自动化
TRON智能钱包PHP开发包【零TRX归集】
使用 Iceberg on Kubernetes 打造新一代云原生数据湖
阿里云Q2营收破纪录背后,云的打开方式正在重塑
制造和新的自动化技术是什么?
至联云分享:IPFS/Filecoin值不值得投资?
业内首发车道级导航背后——详解高精定位技术演进与场景应用
Don't go! Here is a note: picture and text to explain AQS, let's have a look at the source code of AQS (long text)
Thoughts on interview of Ali CCO project team
Filecoin最新动态 完成重大升级 已实现四大项目进展!
随机推荐
Subordination judgment in structured data
有关PDF417条码码制的结构介绍
制造和新的自动化技术是什么?
Skywalking series blog 1 - install stand-alone skywalking
Arrangement of basic knowledge points
PHPSHE 短信插件说明
網路程式設計NIO:BIO和NIO
《Google軟體測試之道》 第一章google軟體測試介紹
Python crawler actual combat details: crawling home of pictures
全球疫情加速互联网企业转型,区块链会是解药吗?
你的财务报告该换个高级的套路了——财务分析驾驶舱
Network security engineer Demo: the original * * is to get your computer administrator rights! 【***】
H5 makes its own video player (JS Part 2)
速看!互联网、电商离线大数据分析最佳实践!(附网盘链接)
The difference between Es5 class and ES6 class
Network programming NiO: Bio and NiO
Filecoin最新动态 完成重大升级 已实现四大项目进展!
TRON智能钱包PHP开发包【零TRX归集】
Let the front-end siege division develop independently from the back-end: Mock.js
Technical director, to just graduated programmers a word - do a good job in small things, can achieve great things