【问题标题】:Mnesia asynchronous transactionMnesia 异步事务
【发布时间】:2010-12-26 04:34:53
【问题描述】:

我想有一个 Erlang 节点的主从设置,读取和写入操作只发生在主节点上。从节点仅保留为热备用。

据我了解,Mnesia 的默认行为是在执行写入操作之前在所有节点上同步获取锁。这将导致高延迟,尤其是对于地理分布的节点。

我的问题是:Mnesia 是否支持异步事务,即只在主节点上获取锁,然后将写入操作传播到从节点?

【问题讨论】:

    标签: erlang mnesia


    【解决方案1】:

    如果您使用消息队列系统(也许是rabbitmq)构建此异地复制,我认为您会更高兴自己从消息队列提要更新复制的数据库。 WAN 链接更有可能变得拥塞或出现故障,而消息队列协议有办法处理这种情况。 Erlang 分发就放弃了,您必须将更新溢出到一个文件中,直到副本出现并可以使用它。

    为了获得最佳对称性,将发布到消息队列作为更新数据库的主要方法。因此,即使是 master 也会通过从消息队列中消费来更新。如果需要响应,当前主节点可以将消息发送回消息的发出者。

    Mnesia 确实有几种不同类型的 mnesia transaction contexts,但没有什么能真正符合您的需求。

    【讨论】:

    • 自从看到这个问题后,我也调查了一下:Christian的建议听起来很明智。
    【解决方案2】:

    也许您的应用程序可以使用粘滞锁受益。我想它非常接近您的需求,但...不是您想要的http://www.erlang.org/documentation/doc-5.8.3/lib/mnesia-4.4.17/doc/html/Mnesia_chap4.html#id70700

    【讨论】:

      【解决方案3】:

      有趣的 Q 和同样有趣的 A!

      克里斯蒂安,基本上,您的建议是,例如拥有一个 gen_server - 序列化对数据库的访问。 我第一次这样做,然后我意识到:坚持下去! Mnesia 是事务性的,因此首先对访问进行序列化,然后通过事务更新数据库来再次执行此操作听起来有点奇怪。

      然而,我仍然有点困惑,鉴于 mnesia 强制执行事务语义,我倾向于将其视为您不应该自己序列化访问的暗示,特别是因为 mnesia 的实现者可能比我更了解系统;)

      我知道这不是您问题的直接答案,但是,我会说使用 mnesia + memorynodes + disknodes。用于快速接管的内存节点和用于在崩溃/备份后恢复的磁盘节点。

      HTH, 哈哈

      【讨论】:

        猜你喜欢
        • 2013-10-16
        • 1970-01-01
        • 1970-01-01
        • 2018-09-13
        • 2012-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-28
        相关资源
        最近更新 更多