这更像是一个设计问题。
背景
我正在开发一个通过postgresql db提供的“小型”spring boot Web应用程序,它将增强我的团队为特定应用程序测试新补丁的能力。每个补丁将生成一系列需要在特定服务器上执行的测试。这些服务器分布在少数几个地理区域,这些区域有单独的团队,这些团队需要执行这些测试,以便签署补丁稳定。这些团队由少数团队成员组成。
问题
这个想法是当一个团队成员开始一个特定的测试时,会在该对象上创建一个“锁”,例如15分钟,当其他用户试图发布测试时,他们会收到一个通知->用户xyz已经在执行此测试。为了防止不必要的工作,还需要双重测试数据输入,以免相互冲突。
我正在修补一个定制的机制,该机制将有一个单独的表,其中包含有关对象、创建锁的用户和锁过期时间的信息。因此,当用户选择一个测试并提供一个Web表单来填写详细信息时,会发生两件事:
锁定表中的条目是为该对象创建的
用户浏览器本地存储中设置了一个cookie,javascript函数每n秒检查一次,然后弹出一条警告,指出对象的租约即将到期->是否要延长租约?是/否。
还有手动释放锁和扩展锁的问题(我想执行这些操作的rest api端点足够简单),但我想这会产生很大一部分逻辑,需要在服务器端非常手动地驱动,这是我想要避免的。
这里的问题是,我可以解决这个问题,让它工作,但我不想重新发明车轮,也许已经有一个更标准的方式来做这件事。还有一个问题是完全定制的东西的维护,我很肯定这会很快成为一个巨大的怪物。
我在谷歌上搜索了很长一段时间,但似乎我没有使用正确的关键字。所有的结果都指向SpringJPA锁定机制,但我很确定这不会让我达到我想要的目的。
欢迎提供所有信息和评论。我不是在寻找一个完整的解决方案,更像是朝着正确的方向轻推。
1条答案
按热度按时间4xy9mtcn1#
我建议你看一看https://github.com/lukas-krecan/shedlock 我们使用它来确保两个计划的进程不会同时运行,但是您可以使用其中的一部分,或者从中获得灵感来编写自己的进程。
它基本上是在db表中添加一个条目(您可以选择不同的持久性机制),并防止其他线程或服务器同时获得相同的锁。它还有一个最短锁定时间和最长锁定时间的概念,这两个概念很重要,如果您自己做的话,您需要实现它们。