Updating integer atomically over multiple JVMs for every key
我们有一个要求,可以将问题范围缩小为。
- 有多个键,每个键映射到一个整数。
- 当在 JVM 上接收到键时,您需要从共享内存中检索 int 值,将其递增,然后将递增后的值放回共享内存。
因此,当两个 JVM 或两个线程读取相同的值时,其中一个的更新应该始终失败,这样您就不会丢失任何 JVM 上的任何线程所做的任何增量。
一旦更新失败,你就从共享内存中再次读取,增加它然后再次更新,直到更新成功或者你已经用尽了\\'N\\'次重试。
现在我们正在使用带有乐观锁定的 infinispan,但行为并不一致。请找到该主题的链接。
https://developer.jboss.org/message/914490
有没有其他技术可以很好地满足这个要求。
线程之间的同步很容易,但 JVM 之间的同步非常困难,尤其是当您需要支持多个平台时。我建议使用以下方法之一集中更新代码,这两种方法都"外包"数据更新任务:
- 从知道如何执行更新任务的单个进程发布一个简单的 REST API,并序列化请求。
- 使用关系数据库保存计数,并确保客户端代码在事务不成功时正确回滚事务。
可能不是你想听到的,但任何一种方法都行得通。