【问题标题】:Retrieve data from mnesia in order of insertion按插入顺序从 mnesia 中检索数据
【发布时间】:2019-03-29 07:20:58
【问题描述】:

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

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

我能想到的解决方案:

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

【问题讨论】:

  • :mnesia.dirty_update_counter/3 不能满足您的需求吗?它速度极快,完全符合您的需求。
  • @AlekseiMatiushkin 有几篇文章和讨论(例如herehere)指出在分布式系统中使用mnesia 计数器不是一个好主意。尽管它们可能足以满足我的计划......我可能必须自己测试它。

标签: elixir mnesia distributed-database


【解决方案1】:

如果你想自己实现它,那么正如@Aleksei 所说,dirty_update_counter/3 是要走的路。

但是,如果您可以使用外部库,MementoAmnesia 都支持自动增量的自定义实现。这是 Memento 中的样子:

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

end

另外,Mnesia 有一个最终一致性模型,所以虽然它非常快,但它不能保证即时一致性。无论您为自动增量选择何种实现,它肯定会对性能产生影响。

全面披露:我是 Memento 的作者

【讨论】:

  • 没想到失忆症也没见过Memento,谢谢,我去看看。 :)
猜你喜欢
  • 2011-02-12
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 2016-12-01
相关资源
最近更新 更多