PmHub集成Redis分布式锁保障流程状态更新(👍必看)
你好呀,我是苍何!
欢迎来到面试系列!这篇文章将会手把手教你如何用redis分布式锁保障PmHub项目中的流程状态更新,以下描述你可以直接写进简历,也可以根据你的理解进行优化。注意这是重点必须掌握的知识点!
- 使用 Redis 分布式锁,确保流程状态更新按顺序执行且不被其他操作干扰,保护流程状态的更新过程。
什么是锁?本地锁的问题
程序系统中所说的锁和现实中的锁其实概念差不多,都是用来锁住资源,以防止别人乱访问。
在说分布式锁之前,我们先看看看本地所的问题,以此来引申出分布式锁。
假设流程服务部署了 4 份,他们分别位于不同的服务器下面,前端请求进来到 Nginx 和网关后会被转发到不同的实例,假设前端接收 10w 个请求,每个实例服务接收 2.5w 个请求。
在每一个服务实例下,假设缓存失效,对其访问数据库操作加锁,通过锁(synchronzied 或 lock)来锁住自己的线程资源,从而防止缓存击穿。
synchronized锁是Java提供的一种内置锁,在单个JVM进程中提供线程之间的锁定机制,控制多线程并发。只适用于单机环境下的并发控制。
但是在分布式系统中,如果想要锁定多个节点服务,synchronized就不适用于了,会带来数据不一致的问题:比如服务 A 获取数据后,更新缓存 key = 100,服务 B 不受服务 A 的锁限制,并发去更新缓存 key = 99,最后的结果可能是 99 或 100,但这是一种未知的状态,与期望结果不一致。
本教程大纲:
:
什么是分布式锁
基于上面本地锁的问题,我们需要一种支持分布式集群环境下的锁:查询 DB 时,只有一个线程能访问,其他线程都需要等待第一个线程释放锁资源后,才能继续执行。
想要在多个节点中提供锁定,在分布式系统并发控制共享资源,确保同一时刻只有一个访问可以调用,避免多个调用者竞争调用和数据不一致问题,保证数据的一致性,就可以利用分布式锁。
分布式锁就是控制分布式系统不同进程访问共享资源的一种锁的机制。不同进程之间调用需要保持互斥性,任意时刻,只有一个客户端能持有锁。
从单体锁到分布式锁,只不过是将锁的对象从一个进程的多个线程,转成多个进程。如图所示: