Erlang系统中的可扩展性、进程管理与应用机制
1. 可扩展性与短生命周期进程
在典型的Erlang设计中,系统里每个真正并发的活动都会创建一个进程。比如,若系统是数据库,那么每个查询、插入或删除操作都会生成一个进程。不过,不能盲目这么做,并发模型要依据系统资源来定。实际中,可能只有一个数据库连接,这就成了瓶颈,会让请求串行化。此时,给现有进程发送消息或许比创建新进程更简单。
要是系统是即时通讯服务器,每个入站和出站消息、状态更新,以及登录和注销操作都需要一个进程。这里涉及到成千上万的短生命周期进程,它们都由同一个监管者管理。目前,若监管者有大量动态子进程在短时间内频繁启动和终止,系统扩展性会变差,因为监管者成了瓶颈。
简单一对一(simple_one_for_one)策略的实现扩展性更好,因为它使用字典键值库模块,而不像其他监管者类型那样将子进程规范存储在列表中。但即便如此,它也有局限性。很难给出动态子进程启动和终止速率的经验法则,因为这取决于底层硬件、操作系统、核心数量,以及进程自身的行为(包括创建进程时需要复制的数据量)。
当监管者消息队列中的消息数量增长到数千条时,就说明遇到问题了。解决这个问题有两种方法:
- 创建监管者池 :创建一组监管者,确保每个监管者处理的子进程数量在其能力范围内。若子进程需要与其他进程交互且生命周期较长,这是个推荐的策略。左边的进程是调度器,负责管理监管者之间的协调,必要时启动新的监管者。可以使用适合需求的算法(如轮询、一致性哈希或随机算法)从池中选择监管者。
- 使用工作进程 :很多人采用的第二种方法是使用工作进程(通常是通用服
超级会员免费看
订阅专栏 解锁全文
53

被折叠的 条评论
为什么被折叠?



