我是Elixir的新手,在分布式系统上工作。此系统共享多个全局表。写入此表的频率很高,因此它们应该非常快。现在,我有时必须处理整个表并从中生成一些 JSON,但我需要按照此表中的记录插入数据库的顺序处理它们。(我不需要任何硬性保证。不常见的错误,例如两个交换的记录,甚至单个丢弃的记录都是可以容忍的。
不幸的是,mnesia afaik 没有像 SQL 的auto_increment
那样的东西,现在我很难自己实现这个功能。
我能想到的解决方案:
-
存储 unix 时间戳(或某种其他类型的时间戳(作为记录的键。但是对我来说,程序的正确性取决于时间之类的东西,这对我来说是错误的。两台计算机上的时间不同步的情况对于调试来说会很糟糕。而且检索时间很慢(在某处阅读,如果我错了,请纠正我(Unix 时间戳的单位是一秒,这太大了。 - 在记录键入时存储全局计数器。可能比时间戳更慢,我不确定弄乱 mnesia 计数器是否是一个好主意,因为它们不适合分布式系统(再次,如果我错了,请纠正我(
- 找到一种神奇的方法,如何保持记录的插入顺序。这是我最喜欢的;)
如果你想自己实现它,那么正如@Aleksei提到的,dirty_update_counter/3
是要走的路。
但是,如果您可以使用外部库,则Memento
和Amnesia
都支持自动增量的自定义实现。这是它在Memento中的样子:
defmodule MyTable do
use Memento.Table,
attributes: [:id, :title, :content, :status, :author],
type: :ordered_set,
autoincrement: true
end
此外,Mnesia 有一个最终一致性模型,因此尽管它非常快,但它并不能保证即时一致性。无论您为自动增量选择哪种实现,它肯定会对性能产生影响。
完全披露:我是《备忘录》的作者