Med*_*her 4 arrays erlang distributed-computing
我正在开发一个项目,我们有一个原子数组作为哈希.每当用户连接到服务器时,都会对某个值进行哈希处理,并将该哈希值用作查找数组中元素的索引,并返回该元素."外部力量"(由长时间运行的gen_server处理)能够更改此数组,因此我不能简单地对其进行硬编码.我的问题是如何"托管"这个数组.
我的第一个实现是一个简单的gen_server,它保存了一个数组的副本并将其发送给任何要求它的人.然后,请求它的过程可以遍历它并获得他们想要的索引.这个实现有大量的内存被使用,我归结为这个相同的数组有很多副本浮动.
我当前的实现有一个中央gen_server来处理这个数组的状态,以及处理实际请求的子节点.当状态改变时,中央gen_server更新子节点.当进程想要找到它的哈希结果时,它会将其索引号发送到中央gen_server,后者将请求转发给其中一个子进程.子进程遍历其"本地"列表,并将生成的原子发送回原始进程.
当前实施的问题在于它在高流量时陷入困境.我已经尝试过越来越多的孩子,但我很确定中央gen_server是瓶颈.
有没有人对我的问题有更好的解决方案?
编辑:%s/array/list/g
我建议你使用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.ETS Tables尽可能ETS Tables可以通过触手可及的任何过程中并发访问,因此你不需要一个中央处理或服务器处理数据
ETS Tables所有权可以从一个过程转移到另一个过程.当拥有进程崩溃时(只有gen_servers可以检测到它们正在死亡[注意到这一点]),它可以将其转移ETS Table到另一个进程来接管.点击这里:ETS放弃