在Erlang中需要高性能共享状态时,您会怎么做?

在Erlang中需要高性能共享状态时,您会怎么做?,erlang,Erlang,Erlang非常擅长通过没有共享状态来清理问题。但当您确实想要共享状态时会发生什么?例如:配置选项、统计信息收集、事件/回调服务器。使用一些记录作为状态或使用流程字典生成新流程是实现共享状态的一种方法。您将反复循环该过程,并回复任何消息。多个进程将只使用本质上不纯净的getter和setter函数来查询该进程,这些函数围绕着消息传递,但在这里,我们只是将Erlang变成了一个比java对象慢的不纯净对象,因为还原系统轮流执行比在每个全局状态周围使用内存互斥锁慢。如果我们不小心,它甚至有可能出现邮

Erlang非常擅长通过没有共享状态来清理问题。但当您确实想要共享状态时会发生什么?例如:配置选项、统计信息收集、事件/回调服务器。使用一些记录作为状态或使用流程字典生成新流程是实现共享状态的一种方法。您将反复循环该过程,并回复任何消息。多个进程将只使用本质上不纯净的getter和setter函数来查询该进程,这些函数围绕着消息传递,但在这里,我们只是将Erlang变成了一个比java对象慢的不纯净对象,因为还原系统轮流执行比在每个全局状态周围使用内存互斥锁慢。如果我们不小心,它甚至有可能出现邮箱溢出


那么,如果您想要快速共享状态,您会怎么做?Reddis,一个数据库,mnesia,产生循环状态?如何使集中式状态在erlang中更纯粹地发挥作用?

使用使用
命名表
选项创建的公共状态(任何人都可以读写)或受保护状态(一个写入程序,多个读取程序)。每个需要访问表中共享状态的进程都可以通过其名称访问该表。

对不起,为什么在这个问题上加上“elixir”的标签?因为它是同一个VMR,这对您的问题有什么影响?添加joxa标记是否合适?口齿不清口味的二郎怎么样?如果您的问题是关于Erlang的,那么它是唯一应该在上面的标签。如果您在大型系统中使用ETS,那么启用
write\u concurrency
和/或
read\u concurrency
选项进行测试和基准测试也会很有趣,取决于用例。您认为这比使用流程字典作为状态的gen_服务器更可取吗?我知道ETS背后有一些C代码,不像mnesia那样是纯Erlang。@BreezyChick89,使用进程字典作为状态的
gen_服务器
的问题是,任何想要访问状态的进程都必须调用
gen_服务器
进程才能获得它,而
gen_服务器
可能成为瓶颈。我在2011年写过一篇文章,探讨了类似的问题。使用
gen_服务器的一个好处是,它可以为数据提供一个事务类型接口,而这在使用ETS时几乎是不可能的。通过让所有人都可以读取表,但只有一个进程可以写入表,您可以走到一半,但它只支持简单的事务。感谢大家的洞察力!有这么多专家评论真是太棒了!