我正在Erlang / OTP中编写应用程序,并希望在版本记录系统上使用顺序计数器。
我首先用
mnesia:dirty_update_counter实现了它们,但使用它的经验驱逐了这些硬性要求:
计数器必须具有以下属性:
严格按顺序排列 - 然后是1 2乘以3等等 序列在一组分布式系统中共享,如果我 让你失望为'3'而你来了 在'5'我需要知道我们已经输了 一些通信,应该重新同步
使用分布式数据库安全
mnesia:dirty_update_counter不符合这些要求。
我如何实现顺序数据库计数器?
答案 0 :(得分:1)
好吧,由于Mnesia数据无法保证以原子方式复制,因此您必须以某种方式手动锁定。我看到三个选择(两个有锁定,一个没有):
在。上使用读锁定 您请求新版本时的表格 数。这意味着交易 虽然。
使用跟踪的中央服务器 版本号和增量 它们原子地,例如通过 在你的一个节点上有一个进程 您要求提供版本号。
同步您的服务器 使用NTP并使用时间戳。
答案 1 :(得分:1)
你有关于Message Broker的事吗?您可以通过加载RabbitMQ并设置持久队列和持久消息来将其保留在Erlang中。构建一个使消息体中的数字增加1的使用者,然后在新消息中将该新数字发布回队列,因为它会识别原始数据。
不确定它是否会对你有用,但似乎一旦你手动发布了第一条消息,你将要关闭并运行1。
答案 2 :(得分:1)
我打算建议一个为你提供数字的erlang进程。由于erlang按顺序处理消息,因此可以保证按顺序处理消息。坚持他们是必要的。上面的RabbitMQ建议是一种方式,但如果你觉得它太过分,那么只需要将过程存储定期存储到文件就足够了。 gen_server应该足以满足您的目的。
答案 3 :(得分:1)
也许最简单的答案就是你要找的东西,只需获得一个写锁(用于复制同步)并创建一个获取计数器当前值的事务函数,递增它并将其保存回数据库。当然,随着系统扩展,您将获得更多的开销,但我建议您编写一个为您执行此操作并在节点的子集上运行的服务器,因此锁争用不会与群集大小直接关联。