我们有一个架构设置,我们在服务器中运行客户端应用程序,我们希望有一个微服务负责提供分布式锁/映射/缓存功能。这个微服务内部使用 Redisson,这是一个基于 Java 的客户端,可以与 Redis 通信。现在我们想提供客户端应用程序可以使用的微服务的 api 锁定、解锁、获取、放置。对于应用程序到微服务的通信,我们将使用 gRPC 协议。
从微服务向客户端提供锁定/解锁 API 的正确方法是什么?目前,我们使用基于 RedissonMap RMap.getLock(..)) 的 Redisson 的 Semap,它遵循 java Lock 规范,因此获取分布式锁的线程只能解锁。一个问题是由于锁定是由微服务处理的,因此客户端必须发出单独的锁定和解锁请求,这些请求可能由同一节点(微服务)和同一线程提供服务,也可能不提供。这可以通过使用信号量(有 1 个许可证)来解决。所以,本质上我们使用redisson的Rsemaphore来服务互斥的用例
我更感兴趣的是找出当我们提出获取/释放的 API 规范时需要考虑的因素,比如在微服务上对获取/释放许可的调用应该是同步的还是异步的。