早上大家
我是erlang的新手,但我正在努力设计我在erlang上的第一个项目尽我所能。 这里我需要一些关于erlang内存缓存系统的建议。
在我看来,第一个选择是mnesia,但我对它没有任何偏见。 它符合我的要求吗? 我的表现如何?
另一个选项是memcached - 但我担心性能低于mnesia,因为执行了额外的序列化/反序列化,因为memcached守护进程来自另一个OS进程。
任何建议都有帮助:)
答案 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有多好)。
另一件事是,你应该做一些阅读和写很多节目,直到你对它感到满意为止。