Erlang:对数组进行分布式工作

Med*_*her 4 arrays erlang distributed-computing

我正在开发一个项目,我们有一个原子数组作为哈希.每当用户连接到服务器时,都会对某个值进行哈希处理,并将该哈希值用作查找数组中元素的索引,并返回该元素."外部力量"(由长时间运行的gen_server处理)能够更改此数组,因此我不能简单地对其进行硬编码.我的问题是如何"托管"这个数组.

我的第一个实现是一个简单的gen_server,它保存了一个数组的副本并将其发送给任何要求它的人.然后,请求它的过程可以遍历它并获得他们想要的索引.这个实现有大量的内存被使用,我归结为这个相同的数组有很多副本浮动.

我当前的实现有一个中央gen_server来处理这个数组的状态,以及处理实际请求的子节点.当状态改变时,中央gen_server更新子节点.当进程想要找到它的哈希结果时,它会将其索引号发送到中央gen_server,后者将请求转发给其中一个子进程.子进程遍历其"本地"列表,并将生成的原子发送回原始进程.

当前实施的问题在于它在高流量时陷入困境.我已经尝试过越来越多的孩子,但我很确定中央gen_server是瓶颈.

有没有人对我的问题有更好的解决方案?

编辑:%s/array/list/g

Muz*_*hua 6

我建议你使用ETS Tables.我认为Array方法效率不高.使用ETS Table,在应用程序后端中创建为public,任何进程都可以在需要时立即查找项目.ETS Tables在当前较新版本的erlang中具有并发访问的能力.

%% Lets create a record structure 
%% where by the key will be a value
%% in the array.
%% For now, i do not know what to 
%% put in the field: 'other'
-record(element,{key,other}).
create_table(TableName)-> Options = [ named_table,set, public, {keypos,2}, %% coz we are using record NOT tuple {write_concurrency,true} ], case ets:new(TableName,Options) of TableName -> {success,true}; Error -> {error,Error} end.
lookup_by_hash(TableName,HashValue)-> try ets:lookup(TableName,HashValue) of Value -> {value,Value}; catch X:Y -> {error,{X,Y}} end.
通过这种安排,您将避免A Single Point of Failure因单个gen_server保存数据而产生.许多过程都需要这些数据,因此不应由单个过程保存.只要需要查看,任何进程都可以随时访问该表.

数组中的值应转换为表单的记录,element然后插入到ETS Tables.

这种方法的优点

1.我们可以创建许多ETS Tables尽可能
2.一种ETS表可以处理许多比数据结构以上的元素,例如列表或具有低得多的可比存储器消耗的数组.
3. ETS Tables可以通过触手可及的任何过程中并发访问,因此你不需要一个中央处理或服务器处理数据
4.单个进程或gen_server保存这些数据的,也就是说,如果它的损害(下降是由于一个完整的邮箱),它将不可用,因此需要该阵列的进程将不得不等待这一台服务器重启或我不知道....
5.通过发送请求消息访问阵列数据加上制作相同阵列的副本每个需要它的过程都不是"Erlangic"设计.
6.最后,ETS Tables所有权可以从一个过程转移到另一个过程.当拥有进程崩溃时(只有gen_servers可以检测到它们正在死亡[注意到这一点]),它可以将其转移ETS Table到另一个进程来接管.点击这里:ETS放弃

这是我的想法.