当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- 前端都应懂的入门基础-github基础
- 基於MVC的RESTFul風格API實戰
- Network security engineer Demo: the original * * is to get your computer administrator rights! 【***】
- Using consult to realize service discovery: instance ID customization
- 带你学习ES5中新增的方法
- ES6学习笔记(五):轻松了解ES6的内置扩展对象
- Using Es5 to realize the class of ES6
- Let the front-end siege division develop independently from the back-end: Mock.js
- Skywalking series blog 1 - install stand-alone skywalking
- Analysis of ThreadLocal principle
猜你喜欢
条码生成软件如何隐藏部分条码文字
It's so embarrassing, fans broke ten thousand, used for a year!
ipfs正舵者Filecoin落地正当时 FIL币价格破千来了
做外包真的很难,身为外包的我也无奈叹息。
Use of vuepress
Just now, I popularized two unique skills of login to Xuemei
如何玩转sortablejs-vuedraggable实现表单嵌套拖拽功能
Can't be asked again! Reentrantlock source code, drawing a look together!
数据产品不就是报表吗?大错特错!这分类里有大学问
直播预告 | 微服务架构学习系列直播第三期
随机推荐
EOS创始人BM: UE,UBI,URI有什么区别?
03_ Detailed explanation and test of installation and configuration of Ubuntu Samba
從小公司進入大廠,我都做對了哪些事?
Every day we say we need to do performance optimization. What are we optimizing?
After reading this article, I understand a lot of webpack scaffolding
Dapr實現分散式有狀態服務的細節
The practice of the architecture of Internet public opinion system
Jmeter——ForEach Controller&Loop Controller
Network security engineer Demo: the original * * is to get your computer administrator rights! 【***】
Flink on paasta: yelp's new stream processing platform running on kubernetes
CCR炒币机器人:“比特币”数字货币的大佬,你不得不了解的知识
做外包真的很难,身为外包的我也无奈叹息。
制造和新的自动化技术是什么?
Skywalking series blog 1 - install stand-alone skywalking
速看!互联网、电商离线大数据分析最佳实践!(附网盘链接)
Existence judgment in structured data
WeihanLi.Npoi 1.11.0/1.12.0 Release Notes
After brushing leetcode's linked list topic, I found a secret!
3分钟读懂Wi-Fi 6于Wi-Fi 5的优势
Let the front-end siege division develop independently from the back-end: Mock.js