天天看點

redis分布式鎖小試

  項目A監聽mq中的其他項目的部署消息(包括push_seq, status, environment,timestamp等),然後将部署消息同步到資料庫中(項目X在對應環境[environment]上部署的push_seq[項目X的版本])。那麼問題來了,mq中加入包含了兩個部署消息 dm1 和 dm2,dm2的push_seq > dm1的push_seq,在分布式的情況下,dm1 和 dm2可能會分别被消費(也就是并行),那麼在同步資料庫的時候可能會發生 dm1 的資料儲存 後于 dm2的資料儲存,導緻儲存項目的部署資訊發生異常。

  将mq消息的并行消費變成串行消費,這裡借助redis分布式鎖來完成。同一個服務在分布式的狀态下,監聽到mq消息後,觸發方法的執行,執行之前(通過spring aop around來做的)首先獲得redis的一個分布式鎖,擷取鎖成功之後才能執行相關的邏輯以及資料庫的儲存,最後釋放鎖。

  

redis分布式鎖小試

  開始是将鎖加到deploy的方法上的,但是一直aop一直沒有作用,換到consumeStargateDeployMessage方法上就可以了。考慮了一下是因為 @Transactional的原因。這裡注意下。

  隻要脫離了Spring容器管理的所有對象,對于SpringAOP的注解都會失效,因為他們不是Spring容器的代理類,SpringAOP,就切入不了。也就是說是 @Transactional注解方法的代理對象并不是spring代理對象。

redis分布式鎖小試