spring-integration

The Redefine Team Lv5

Spring Integration

Spring Integration 是用于对企业应用进行支持的一整套方案,主要通过消息和channel 来做链接

Custom Distributed Lock

业务实践中,实现了自定义的 Distributed Lock

在具体实现中,分别使用了通过stringRedisTemplete 的方式,通过redis lua 实现的lock

而另一个实现中,使用redis 推荐的redisson组件封装Distributed Lock

用户对lock 的使用,都是基于注解的方式,并没有提供java.util.concurrent.locks.Lock 语义

Spring Integration Distributed Lock

LockRegistry 就定义obtain 方法,传入一个lockKey 参数,返回一个Lock 对象

而spring integration 提供的LockRegistry 在接口定义上就实现为返回一个Lock 对象

LockRegistry 是一个functionalInterface ,而ExpirableLockRegistry 继承了LockRegistry 接口

并添加了expireUnusedOlderThan 方法,该方法描述为支持删除当前未锁定的旧锁

而具体的实现目前有JdbcLockRegistry, RedisLockRegistry, ZookeeperLockRegistry

为了支持expireUnusedOlderThan, 所以在实现上都通过map 的方式将lockKey 和具体的Lock 进行关联

这样在expireUnusedOlderThan方法中就可以通过迭代map的value , 得到Lock , 然后通过判断lock 的过期时间来做到对lock 的删除

  1. JdbcLockRegistry 通过在数据库创建lock 表,通过对表记录加锁的方式实现对资源的锁定
  2. RedisLockRegistry 也是通过redis lua 的方式对资源进行加锁
  3. ZookeeperLockRegistry 最终通过curator 的InterProcessMutex 对znode 进行创建和监听

Custom Distributed Lock vs Spring Integration Lock

自定义的实现主要是通过redis lua 机制实现的,不管是通过自定义lua 实现,或者是通过redisson 实现

所以对标的Spring Integration Lock 的实现是RedisLockRegistry

在方法上并没有存在大的差异,所以说删除自定义的lock 实现, 而改用Spring Integration Lock 实现理由并不充分

因为通过Lock 的语义和通过提供用户友好的注解使用并不冲突,通过注解的方式可以降低业务的使用难度,但在设计上又涉及到如何处理异常和加锁不成功导致的错误处理

按照how to do distributed locking 中对distributed locking 所面对的问题,是否应该在添加一个对Zookeeper Lock 的支持,这才是值得思考的

而对Zookeeper Lock 的支持,完全可以通过将ZookeeperLockRegistry 进行封装,形成zookeeper-lock-spring-boot-starter

最终用户还是对提供的Lock 注解进行方法级别的配置, 而丧失掉对业务子逻辑的自定义加锁的能力

Ref

spring cloud the real case of spring global lock usage

how to do distributed locking

– cmonkey 2019年7月10日15:27:22 于深圳南山

  • 标题: spring-integration
  • 作者: The Redefine Team
  • 创建于 : 2019-07-10 14:26:28
  • 更新于 : 2023-05-23 18:52:03
  • 链接: https://redefine.ohevan.com/2019/07/10/spring-integration/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论