arrays - Erlang:阵列上的分布式工作

标签 arrays erlang distributed-computing

我正在做一个项目,在这个项目中,我们有一组原子作为散列。每当用户连接到服务器时,都会对某个值进行散列,并将该散列用作索引以查找数组中的元素,并返回该元素。 “外部力量”(由长期运行的 gen_server 处理)能够改变这个数组,所以我不能简单地对其进行硬编码。我的问题是如何“托管”这个数组。

我的第一个实现是一个简单的 gen_server,它保留了数组的副本并将其发送给任何需要它的人。请求它的过程然后可以遍历它并获得他们想要的索引。这个实现使用了过多的内存,我认为这是因为有很多相同数组的副本四处 float 。

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

当前实现的问题在于它在高流量时陷入困境。我尝试使用越来越多的 child ,但我很确定中央 gen_server 是瓶颈。

有没有人对我的问题的更好解决方案有任何想法?

编辑:%s/array/list/g

最佳答案

我建议你使用 ETS Tables .我认为Array方法不够高效。与 ETS Table ,在应用程序后端创建为 public,任何进程都可以在需要时立即查找项目。 ETS Tables在当前较新版本的 erlang 中具有并发访问的能力。%% 让我们创建一个记录结构
%% 键将是一个值
%% 在数组中。
%% 目前,我不知道该怎么办
%% 输入字段:'其他'
-记录(元素,{键,其他})。
create_table(TableName)->
选项 = [
命名表,集,
民众,
{keypos,2}, %% 因为我们使用的是记录不是元组
{write_concurrency,true}
],
case ets:new(TableName,Options) of
表名 -> {成功,真};
错误 -> {错误,错误}
结尾。
lookup_by_hash(TableName,HashValue)->
尝试 ets:lookup(TableName,HashValue) 的
值(value) -> {值(value),值(value)};
捕获
X:Y -> {error,{X,Y}}
结尾。

通过这种安排,您将避免A Single Point of Failure由单个 gen_server 保存数据引起。许多进程都需要此数据,因此不应由单个进程持有。这就是任何进程在需要查找时都可以随时访问表的地方。数组中的值应转换为形式为 element 的记录。然后插入ETS Tables .这种方法的优点1。我们可以创建尽可能多的ETS Tables尽可能2。 ETS 表可以处理比数据结构(例如列表或数组)多得多的元素,并且具有更低的可比内存消耗。3。 ETS Tables可以被任何接近的进程同时访问,因此您不需要中央进程或服务器来处理数据
4. 单个进程或 gen_server 持有此数据,意味着如果它受到威胁(由于邮箱已满而关闭),它将不可用,因此需要阵列的进程将不得不等待这台服务器重新启动或者我不知道....5。通过向需要它的每个进程发送请求消息并制作相同数组的副本来访问数组数据不是“Erlangic”design.6。最后,ETS Tables所有权可以从流程转移到流程。当拥有进程崩溃时(只有 gen_servers 可以检测到它们正在死亡 [注意这一点]),它可以转移 ETS Table到另一个进程来接管。在这里查看:ETS Give Away这就是我的想法。

关于arrays - Erlang:阵列上的分布式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9104447/

相关文章:

java - 字符串过滤..任何一个..仅包含所选字符之一或两者

javascript - 从 GeoJson 集合中提取属性和唯一值

c - 从内存中的特定地址开始初始化数组 - C编程

erlang - 牛仔中的cowboy_http_handler 发生了什么?

erlang - ets `public` `named`表和 `local`和 `ram_copy` mnesia表有什么区别

scala - 名称值/表达式保存在函数程序中的什么位置?

c# - 分布式窗口服务

distributed-computing - 矩阵时钟能解决什么问题,而矢量时钟却不能?

c++ - 测试分布式文件系统

c++ - 我如何使用 cin 读取一行用户输入,用空格分割该行,并将这些标记存储到一个字符串数组中?