13

我正在构建一个 erlang 服务器。用户向服务器发送 http 请求以更新其状态。服务器上的 http 请求进程将用户状态消息保存在内存中。服务器每分钟将所有消息发送到远程服务器并清除内存。如果用户在一分钟内多次更新他的状态,最后一条消息将覆盖前一条消息。重要的是,在读取所有消息和清除它们之间,没有其他进程能够写入状态消息。

实施它的最佳方法是什么?

  1. 带有字典的 gen_server。密钥将是用户 ID。dict:store/3 将更新或创建状态。gen_server 解决了“事务”问题。

  2. 带有 ram_copies 的 mnesia 表。处理事务,我不需要实现 gen_server。这个解决方案有太多开销吗?

  3. ETS 表更轻量并且有一个 gen_server。是否可以在 ETS 中进行交易?在读取所有消息和清除它们之间锁定表?

谢谢

4

1 回答 1

19

由于您手动进行同步,因此 mnesia 太多了。你显然不需要网络的东西,这是 ets 和 mnesia 之间的主要区别。

据我所知,Ets 只是一个围绕 dict/bag/... 的 otp 兼容进程,并且由于您有多个进程访问您的数据,因此您应该使用 ets。

我为自己想出了以下逻辑:

Multiple processes on multiple VMs -> mnesia
Multiple processes on one VM -> ets/dets
One process -> bag/dict/...
于 2010-01-29T17:24:53.407 回答