按插入顺序从记忆障碍中检索数据

时间:2018-10-24 19:14:36

标签: elixir mnesia distributed-database

我是Elixir的新手,正在从事分布式系统的开发。该系统共享几个全局表。对该表的写入非常频繁,因此它们应该非常快。现在,有时我必须处理一个完整的表并从中生成一些JSON,但我需要按将它们插入数据库的顺序来处理该表中的记录。 (我不需要不需要任何硬保证。不常见的错误是可以容忍的,例如两个交换记录甚至单个丢弃的记录。)

不幸的是,mnesia afaik没有像SQL的auto_increment之类的东西,现在我很难自己实现此功能。

我能想到的解决方案:

  • 存储unix时间戳(或其他某种时间戳)作为记录的键。但是,对于我来说,程序的正确性取决于时间是不对的。调试两台计算机上的时间不同步的情况将非常可怕。而且时间的检索很慢(请在某个地方阅读,如果我错了,请纠正我) Unix时间戳的单位是秒,这太大了。
  • 存储全局计数器,因为它们是记录的键。可能比时间戳还要慢,而且我不确定弄乱mnesia计数器是否是个好主意,因为它们不适合分布式系统(同样,如果我错了,请纠正我)
  • 找到一种神奇的方式来保持记录的插入顺序。这是我最喜欢的;)

1 个答案:

答案 0 :(得分:0)

如果您想自己实现它,那么就像@Aleksei提到的,​​dirty_update_counter/3是可行的方法。

但是,如果您可以使用外部库,则MementoAmnesia都支持自动递增的自定义实现。这是在《回忆录》中的样子:

defmodule MyTable do
  use Memento.Table,
    attributes: [:id, :title, :content, :status, :author],
    type: :ordered_set,
    autoincrement: true

end

此外,Mnesia有一个最终一致性模型,因此,尽管它非常快,但它并不能立即保证一致性。无论您选择哪种实现自动增量的方法,都肯定会影响性能。

全面披露:我是《纪念品》的作者