前阵子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时, 调用的轻量级进程被阻塞,整个进程不...
由于Erlang进程是独立的,当一个进程崩溃时,它不会影响其他进程。OTP的错误处理机制允许系统优雅地处理错误,恢复到稳定状态。Supervisors可以配置为简单的一次重启、有限次数的重启或停止整个子树,从而避免无限...
Worker Pool 是一个Erlang进程池,其中的工作进程是Erlang的gen server模式进程。Worker Pool的目标是非常简单: 提供以透明的方式管理一批工作进程并且对分配到池中的任务尽最大努力实现负载均衡。一个 Echo 服务器...
Erlang 是一种高效、并发、面向进程的编程语言,常用于构建分布式系统。在 Erlang 中,Port Driver 是一种机制,允许 Erlang 进程与外部 C 库或者其他语言编写的程序进行通信。Port Driver 提供了一种方式,使得 ...
Erlang中的链接(Linking)和监控(Monitoring)机制允许进程间建立关系,以便在另一进程崩溃时得到通知。链接用于追踪相关进程的状态,而监控则可以观察进程的生存状态。 ### 5. 消息传递 Erlang的进程间通信主要...
在Erlang编程语言中,进程是其核心特性之一,它们是并发执行的实体,类似于其他语言中的线程。在Erlang中,进程间通信(IPC)是通过消息传递来实现的,而`link`机制是这个通信模型中非常重要的一部分。本教程将通过...
2. **并发与并行**:Erlang的轻量级进程(称为Erlang进程)使得并发编程变得简单。每个进程有自己的堆栈和消息队列,通过消息传递进行通信,降低了资源消耗,增强了系统的健壮性。 3. **热代码更新**:Erlang支持...
Erlang中的每个定时器都是一个单独的进程,当设置定时器时,实际上是创建了一个新的进程,并将其加入到时间表中。这个时间表由Erlang虚拟机(VM)维护,负责监控所有已激活的定时器。 定时器进程的工作原理如下: 1...
Erlang以其强大的错误恢复能力和轻量级进程(称为Erlang进程)而闻名,这些进程具有内置的并发性和容错性。 在安装Erlang 24.3.4.4之前,首先需要了解你的操作系统是否支持。Erlang支持多种平台,包括Windows、...
Erlang作为一种专为构建可扩展、并发和分布式系统而设计的编程语言,其在进程间通信(IPC)领域的应用尤为广泛。Erlang脚本,即以.erl为扩展名的文件,允许用户编写和执行一系列Erlang命令,以实现进程间的通信和...
Erlang Supervisor是Erlang四大Behaviour之一,主要负责管理监控树(supervision tree)中的子进程,确保系统的稳定运行。在Erlang并发模型中,通过Supervisor可以实现进程间的容错机制,即当某个进程出现故障时,...
1. **并发处理**:Erlang 的核心特性之一是其内置的并发模型。它使用轻量级进程(Lightweight Processes, LWP)实现并发,每个进程占用资源少,易于创建和通信,使得处理大量并发任务变得高效。 2. **错误恢复与...
4. **分布式编程**:Erlang进程可以分布在多个节点上,实现分布式系统的构建。书可能讲解了如何进行节点间通信、分布式数据管理和负载均衡。 5. **模式匹配**:Erlang的函数定义允许模式匹配,使得代码更加简洁和可...
CNode的主要功能包括创建Erlang进程,发送和接收消息,以及调用Erlang的函数。 **Erlang_CNode用户指南** Erlang_CNode用户指南通常会涵盖以下几个核心主题: 1. **安装和配置**:指导用户如何在系统上安装Erlang...
**外部接口**:Erlang进程与外部世界的交互也依赖于消息传递,这保持了一致性,简化了系统的复杂性。 **Fail-fast原则**:Erlang倾向于快速暴露错误,以便开发者能尽早发现问题并修复。 **面向并发的编程**:...
Erlang的并发模型是基于轻量级进程(也称为Erlang进程)的,它们之间的通信通过消息传递完成。这种方式降低了同步开销,提高了系统的并行性。每个进程都有自己的内存空间,减少了数据竞争的风险。当一个进程崩溃时,...
然而,在达到32767个连接数时,Erlang进程挂了。 后来,我们使用strace和stap工具来查找性能瓶颈,发现Erlang在Linux上使用传统的poll模型,而不是epoll模型。通过修改configure文件,打开epoll支持,提高了网络...
多处理,即在多核处理器上同时运行多个Erlang进程,是Erlang提供的又一并发编程模型。 Erlang的OTP框架是一组用于处理常见任务的库和中间件,它包括了用于应用管理和并发控制的工具。 事件处理机制使得Erlang应用...