2

我正在用 Erlang/OTP 编写一个应用程序,并希望在版本记录系统上使用顺序计数器。

我首先用

mnesia:dirty_update_counter
但是使用它的经验排除了这些硬性要求:

计数器必须具有以下属性:

  • 严格按顺序排列 - 1 后跟 2 后跟 3 依此类推,依此类推,该序列在一组分布式系统中共享,如果我将您视为“3”而您进入“5”,我需要知道我们已经输了一些通讯,应该重新同步

  • 使用分布式数据库安全

mnesia:dirty_update_counter
都不符合这些要求。

如何实现顺序数据库计数器?

4

4 回答 4

1

我将建议一个为您提供数字的 erlang 进程。由于 erlang 按顺序处理消息,因此您可以保证按顺序获取它们。以某种方式坚持它们是必要的。上面的 RabbitMQ 建议是一种方法,但如果您觉得它有点过头了,那么只需定期将进程存储到文件中就足够了。一个 gen_server 应该足以满足您的目的。

于 2009-04-01T03:57:39.607 回答
1

您是否考虑过消息代理?您可以通过加载RabbitMQ并设置持久队列和持久消息将其保存在 Erlang 中。构建一个消费者,将消息正文中的数字加 1,然后在新消息中将该新数字发布回队列,因为它确认原始数字。

不确定它是否适合您,但似乎一旦您手动发布正文中带有 1 的第一条消息,您就会关闭并运行。

于 2009-03-27T03:47:55.287 回答
1

Perhaps the simplest answer is what you are looking for, simply by getting a write lock (for replicated syncing) and making a transactional function that gets the current value of the counter, increments it and saves it back to the DB. Certainly you will get increased overhead as the system scales, but I would recommend writing a server that does this for you and run that on a subset of the nodes, so the lock contention is not directly linked with the cluster size.

于 2009-04-12T22:38:31.003 回答
1

好吧,由于 Mnesia 数据不能保证以原子方式复制,因此您必须以某种方式手动锁定。我看到了三种选择(两种有锁定,一种没有):

  • 在请求新版本号时使用表上的读锁。不过,这意味着交易。

  • 使用中央服务器来跟踪版本号并自动增加它们,例如通过在您要求版本号的节点之一上设置一个进程。

  • 将您的服务器与 NTP 同步并使用时间戳。

于 2009-03-25T18:41:15.590 回答