我正在开发一个项目,我们有一个原子数组作为哈希.每当用户连接到服务器时,都会对某个值进行哈希处理,并将该哈希值用作查找数组中元素的索引,并返回该元素."外部力量"(由长时间运行的gen_server处理)能够更改此数组,因此我不能简单地对其进行硬编码.我的问题是如何"托管"这个数组.
我的第一个实现是一个简单的gen_server,它保存了一个数组的副本并将其发送给任何要求它的人.然后,请求它的过程可以遍历它并获得他们想要的索引.这个实现有大量的内存被使用,我归结为这个相同的数组有很多副本浮动.
我当前的实现有一个中央gen_server来处理这个数组的状态,以及处理实际请求的子节点.当状态改变时,中央gen_server更新子节点.当进程想要找到它的哈希结果时,它会将其索引号发送到中央gen_server,后者将请求转发给其中一个子进程.子进程遍历其"本地"列表,并将生成的原子发送回原始进程.
当前实施的问题在于它在高流量时陷入困境.我已经尝试过越来越多的孩子,但我很确定中央gen_server是瓶颈.
有没有人对我的问题有更好的解决方案?
编辑:%s/array/list/g
(我几乎没有使用Erlang的经验,只读过一些书)假设我正在使用Erlang构建游戏服务器.
每个用户检查一些东西是非常普遍的(例如,找到最接近的玩家),所以通常会有一个经理类.
在上面的例子中,我们使用互斥锁.
据我所知,Erlang通常会为每个TCP连接(用户会话)创建新的Erlang进程.那么,如何传播用户会话列表?
如果我有这些用户会话的父进程并询问父进程,它可能是一个瓶颈?