前阵子erlang-china关于erlang该不该具有静态特性讨论的如火如荼,期间抛出了一个在erlang开发中迟早会遇到的问题:在一个拥有成千上万并发process的系统中,某些process具有举足轻重的位置,如其记录log信息,提供某个核心查询功能,这样的情况下,无数的进程访问一个进程,导致这个核心进程消息队列异常增大,相应速度下降,timeout接踵而来,最后导致系统当掉。
这样的情况,在其他语言的开发中也会遇到,只是在erlang的世界中,其似乎更加明显,更加值得“批评”。
因为erlang号称是适应“高并发,分布式,大规模系统”,这个小小的应用场景erlang就出了乱子,能不批评么?
Erlang虚拟机调度器中,追求的哲学是每个进程都有均等的拥有资源的能力。
让我们从虚拟机跳到现实社会中来。有一些老大,疯狂的掳夺占有资源,他们认为自己可以利用这些资源做出最有意义的事情。
这样下去可能会导致几个问题:
1)他们真的对了么?
2)小人物没有得到任何资源,难道就要饿死么?
3)老大挂掉了怎么办?资源还能有效的回收么?会不会很麻烦?
这个现实世界的问题,可以简单的映射到erlang的世界,需不需要有特权进程!
现实的世界证明,这个老大是靠不住的,众生皆追求平等自由,所以目标就是让每个人都有各种各样的权力。erlang也是如此。
我曾经跟帖说出三个解决方案:
1,将这个核心进程,复制几份,作为一个整体获取更多的执行机会,更多的io
2,提升进程的优先级别(process_flag(priority, max)),或者降低其他非关键进程的执行机会(yield)
3,将核心进程放入一个独立的node,让它自由的运转
采用了方案1
,因为其简单,不需要伤筋动骨,不需要系统大的改动,只是封装出一个behaviour,根据scheduler的数目N,拷贝出N个进程,调用的时候,根据当前scheduler id选择对应的进程。
方案1的确是一个简陋的方案,但不是一个值得推崇的方案。
我们应该选择方案3,其符合架构上的拓展(功能分割),可以平滑的走向分布式。采用这种方法,web前端(erlang)的目的就是接受用户请求,可以同时处理上万的连接,这些进程是同类型的均等的。连接需要的处理操作,通过各种服务器节点(erlang)来处理。
这样我们的web server可以有1M个进程,而服务器节点可以只有100个进程,每个部分都充分利用机器性能,不会因为数量问题产生不快。
以后记住当某个进程“吃不消”的时候,首先考虑是你的架构上出问题了么?如果没有,那么就认真的分析分析各部分的处理能力,让最“累”的工作有更多的人分担。
随着系统不断进行,你也更加的熟悉你的系统,这添一砖那加一瓦,让他更好的提供服务。
Erlang进程真的没错,简单才是美.
分享到:
相关推荐
Erlang进程模型特点 一个进程可以创建数以万计的轻量级进程 每个轻量级进程仅仅完成单一功能 一个复杂的功能可以由多个轻量级进程协同完成 当遇到file或socket等阻塞的io时, 调用的轻量级进程被阻塞,整个进程不...
Worker Pool 是一个Erlang进程池,其中的工作进程是Erlang的gen server模式进程。Worker Pool的目标是非常简单: 提供以透明的方式管理一批工作进程并且对分配到池中的任务尽最大努力实现负载均衡。一个 Echo 服务器...
关于erlang并发开发的一些例子,便于学习supersivor
●外部接口-Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。 ●Fail-fast(中文译为速错),即尽可能快的暴露程序中的错误。 ●面向并发的编程(COP concurrency-oriented programming) ...
使用Erlang编写出的应用运行时通常由成千上万个轻量级进程组成,并通过消息传递相互通讯。进程间上下文切换对于Erlang来说仅仅 只是一两个环节,比起C程序的线程切换要高效得多得多了。 使用Erlang来编写分布式应用...
●外部接口-Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。 ●Fail-fast(中文译为速错),即尽可能快的暴露程序中的错误。 ●面向并发的编程(COP concurrency-oriented programming) ...
●外部接口-Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。 ●Fail-fast(中文译为速错),即尽可能快的暴露程序中的错误。 ●面向并发的编程(COP concurrency-oriented ...
Erlang入门:构建application练习4(进程link的作用),实例演示进程link的作用及效果
在 Erlang VM 中将 Linux VM 作为 Erlang 进程生成。 evum 使 Linux 虚拟机成为 Erlang actor。 虽然 Linux VM 像任何其他进程(内存、系统进程、磁盘)一样拥有自己的状态,但与外部世界的所有 I/O 都是通过 ...
gproc, Erlang的扩展进程注册表 gproc应用程序作者: 超级用户,约瑟夫 Wayne 。扩展进程字典 注释Gproc有两个依赖项:gen_leader 和 edown 。 由于大多数人都不积极使用,所以默认情况下它们不再被获取。要启用 gen...
Erlang是一个结构化,动态类型...使用Erlang编写出的应用运行时通常由成千上万个轻量级进程组成,并通过消息传递相互通讯。进程间上下文切换对于Erlang来说仅仅 只是一两个环节,比起C程序的线程切换要高效得多得多了。
Erlpool是用于Erlang进程的循环负载均衡器,主要用于与数据库连接之类的事情。 与和相比, erlpool非常简单且很小(〜100 LOC),并且没有关于工人的假设。 每次您请求pid时,库都会通过ETS进行一次counter_update...
erlang整理的一些心得和lunix查看cpu和内存信息的方法
varpool:Erlang进程池作为局部变量
个人学习Erlang对于Erlang处理数据的各种方式的总结,讲述编程语言Erlang的ets,dets,mnesia,mysql,dict,和进程字典的用法,希望能帮助读者在这个总结里学到一些东西.
主要介绍了Erlang中的注册进程使用实例,本文给出正常进程通信实例和使用使用注册进程通信实例,需要的朋友可以参考下
分片 - 一致的工人一个 Erlang 库,用于一致地将工作分配给工作进程,默认实现使用 riak 核心的 chash 散列模块将密钥散列到工作进程。用法您可以通过调用创建一个哈希: {ok, Shard} = shard:start_link([{rscbag_...
1.完成makefile,直接运行/script目录中的makefile.cmd就能编译文件 2.完成启动多节点的脚本,运行/script目录中的run.cmd可以启动3个节点, 节点的配置在/config目录config.txt中 3.完成跨节点函数的调用,记录...
java/c程序员开发erlang的资料
erdis_smart_sub eredis_smart... 为每个 Erlang 进程打开一个连接感觉不是很干净,是吗? 在 eredis 之上写一个层,其中一个进程将接收所有消息并将它们发送回正在侦听相应通道的进程。 eredis_smart_sub 实现了第二种