最好的erlang内存缓存系统跨网络节点= mnesia?

时间:2013-05-24 02:28:58

标签: erlang ets

早上大家

我是erlang的新手,但我正在努力设计我在erlang上的第一个项目尽我所能。 这里我需要一些关于erlang内存缓存系统的建议。

  1. 缓存项是基于键值的存储。 key通常是ASCII字符串;值是erlang的类型包括number / list / tuple / etc.
  2. 可以通过任何节点设置缓存项目。
  3. 任何节点都可以获取缓存项目。
  4. 即使在不同的服务器上,也可以跨所有节点共享缓存项
  5. 允许脏读,我不希望任何锁或事务降低性能。
  6. 完全分发,没有集中的机器或服务。
  7. 表现良好
  8. 易于安装&部署和配置&维护
  9. 在我看来,第一个选择是mnesia,但我对它没有任何偏见。 它符合我的要求吗? 我的表现如何?

    另一个选项是memcached - 但我担心性能低于mnesia,因为执行了额外的序列化/反序列化,因为memcached守护进程来自另一个OS进程。

    任何建议都有帮助:)

1 个答案:

答案 0 :(得分:10)

是。 Mnesia符合您的要求。但是,就像你说的那样,使用它的工具可以深入理解它。我们在distributed authentication system上使用了mnesia,到目前为止我们没有遇到任何问题。当mnesia用作缓存时,它比memcached更好,原因之一是“Memcached不能保证你写的东西,你可以随时读取,因为内存交换问题和内容”(关注here) 。

但是,这意味着您的分布式系统将构建在Erlang之上。事实上,你的案例中的mnesia胜过大多数NoSQL缓存解决方案,因为它们的系统是Eventually consistent。只要可以在整个群集中确保网络可用性,Mnesia就是一致的。对于分布式缓存系统,您不希望出现从不同节点读取相同密钥的不同值的情况,因此mnesia的一致性在这里派上用场了。

你应该考虑的事情是,它,它可以为分布式系统提供集中式内存缓存。其工作方式如下:您有RABBITMQ个服务器正在运行,并且每个群集节点上的AMQP客户端都可以访问它。系统通过AMQP接口进行交互。因为缓存是集中式的,所以负责从缓存写入和读取的进程/系统确保了一致性。其他系统只是将一个密钥请求放到AMQP message bus上,负责缓存的系统收到此消息并用值回复它。

我们已将Message bus Architecture using RABBITMQ用于最近的系统,该系统涉及与银行系统,ERP系统和公共在线服务的集成。我们建立的是负责将所有这些融合在一起,我们很高兴我们使用了RABBITMQ。细节很多,但我们所做的是提出一种消息格式和一种系统识别机制。所有系统都必须具有RABBITMQ客户端,用于从消息总线进行写入和读取。然后,您将为每个系统创建一个读取Queue,以便其他系统将其请求写入该队列,其名称在RABBITMQ内,与拥有它的系统相同。然后,您必须加密通过总线传递的消息。最后,您将系统绑定在大距离/跨越状态,但是通过高效的网络,您不会相信RABBITMQ对这些系统的绑定速度有多快。无论如何,RABBITMQ也可以聚集,我应该告诉你它是Mnesia为RABBITMQ提供动力(告诉你mnesia有多好)。

另一件事是,你应该做一些阅读和写很多节目,直到你对它感到满意为止。