内存缓存中最好的分布式Erlang是什么?

内存缓存中最好的分布式Erlang是什么?,erlang,ets,Erlang,Ets,我需要一些关于erlang内存缓存系统的建议 缓存项是基于键值的存储。 密钥通常是ASCII字符串;值是erlang的类型,包括number/list/tuple/etc 缓存项可以由任何节点设置 任何节点都可以获取缓存项 缓存项在所有节点上共享,即使在不同的服务器上也是如此 允许脏读,我不希望任何锁或事务降低性能 完全分布式,没有集中的机器或服务 好成绩 易于安装、部署、配置和维护 在我看来,第一选择是,但我没有这方面的经验。 它符合我的要求吗? 我能期待怎样的表现 另一个选项是memcach

我需要一些关于erlang内存缓存系统的建议

  • 缓存项是基于键值的存储。 密钥通常是ASCII字符串;值是erlang的类型,包括number/list/tuple/etc
  • 缓存项可以由任何节点设置
  • 任何节点都可以获取缓存项
  • 缓存项在所有节点上共享,即使在不同的服务器上也是如此
  • 允许脏读,我不希望任何锁或事务降低性能
  • 完全分布式,没有集中的机器或服务
  • 好成绩
  • 易于安装、部署、配置和维护
  • 在我看来,第一选择是,但我没有这方面的经验。 它符合我的要求吗? 我能期待怎样的表现

    另一个选项是
    memcached--

    但我担心性能会低于mnesia,因为memcached守护进程来自另一个操作系统进程时会执行额外的序列化/反序列化。

    是的
    Mnesia
    符合您的要求。然而,正如你所说,当使用工具的人深入理解它时,工具是好的。我们在
    分布式身份验证系统上使用了mnesia,到目前为止,我们没有遇到任何问题。当mnesia被用作缓存时,它比memcached好,原因之一是“memcached不能保证您写的东西,由于内存交换问题和其他原因,您可以随时读取”(如下)。

    然而,这意味着您的分布式系统将在Erlang上构建。事实上,在您的例子中,mnesia优于大多数NoSQL缓存解决方案,因为它们的系统最终是一致的。Mnesia是一致的,只要可以确保整个集群的网络可用性。对于分布式缓存系统,您不希望出现从不同节点读取同一密钥的不同值的情况,因此mnesia的一致性在这里很有用。

    您应该考虑的是,分布式系统可能有一个集中式内存缓存。其工作原理如下:每个集群节点上的服务器都在运行并可由AMQP客户端访问。系统通过AMQP接口进行交互。因为缓存是集中的,所以负责从缓存中写入和读取的进程/系统可以确保一致性。其他系统只是在
    AMQP消息总线上发出一个密钥请求,负责缓存的系统接收该消息并用值回复该消息。

    我们已将使用RABBITMQ的
    消息总线体系结构用于最近的系统,该系统涉及与银行系统、ERP系统和公共在线服务的集成。我们构建的东西负责将所有这些融合在一起,我们很高兴我们使用了
    RABBITMQ
    。细节很多,但我们所做的是提出一种消息格式和一种系统识别机制。所有系统都必须有一个RABBITMQ客户端,用于从消息总线进行写入和读取。然后,您将为每个系统创建一个读
    队列
    ,以便其他系统将其请求写入该队列,该队列在RABBITMQ中的名称与拥有该队列的系统相同。然后,稍后,您必须加密通过总线传递的消息。最后,您可以通过远距离/跨州将系统绑定在一起,但如果有一个高效的网络,您将无法相信RABBITMQ绑定这些系统的速度有多快。无论如何,RABBITMQ也可以集群化,我应该告诉您是
    Mnesia
    为RABBITMQ提供了动力(这告诉您Mnesia有多好)。


    另一件事是,你应该读一些书,写很多程序,直到你觉得舒服为止。

    谢谢你的详细建议。我更喜欢某种本地内存缓存解决方案,而不是集中式缓存系统。集中式缓存系统意味着存在网络通信延迟,以及将对象从存储的二进制或字符串序列化/反序列化到存储的二进制或字符串的额外成本。在我的情况下,我有许多小的缓存项,在一个HTTP请求中,我可以查询多达100个项,但不能批量查询。在这种情况下,集中式缓存系统似乎不适合我。Mnesia是否有某种本地缓存,以防止总是从其他机器请求缓存?是的。如果每个节点都有一个相同数据库的副本,那么一致性将是集群范围的。总是。在任何时候,您从任何集群节点读取的内容都将与其他节点相同。但是,这对网络可用性以及参与分布式系统的所有节点上的mnesia的可用性都有假设。