Erlang和Web

本文译自:

http://ninenines.eu/docs/en/cowboy/1.0/guide/erlang_web/

Web是并发的

当你访问一个网站,很少有并发。几个连接打开,请求通过这些连接发送,然后网页显示在你的屏幕上。你的浏览器一般会打开4到8个连接到服务器,和设置有关,确实不多。

但是想象一下,在同一时间,你不是唯一访问这个站点服务器的人。可能有几百,上千或上百万的并发连接。

甚至今天,很多系统都没有解决C10K问题(1万个并发连接)。更不要说C100K。Erlang同时处理100万个连接没有问题。当前,Erlang可以在单个内存和CPU都不富余的服务器上同时处理超过200万连接。Web是并发的,Erlanger是一门并发的语言,正好相配。

当然,各种平台需要超过几百万的连接,因此需要Erlanger内建的分布式机制。如果一个服务器不过用,增加更多的服务器。Erlanger允许用户使用相同的代码与本地的或集群中其他的进程通信,这意味着用户可以非常快地扩展系统。

Web有巨大的用户群,Erlang平台设计为分布式,因此完美匹配。

得了吧,我们可以用我们喜欢的语言找到解决更多并发问题的方法。可是,这些方法将在未来几年中崩溃。为毛线?首先因为服务器不会一直强大下去,给你更多的内存和CPU。Erlang在这个领域已经领先了几光年。其次,今天你的手机和PC在线,明天你的手表,眼镜,自行车,汽车,冰箱等等成吨的设备都将连接到互联网上。

只要Erlang已经为将要发生的一切做好了准备。

Web是软实时的

什么是软实时?也许你要问。它意味着操作必须尽可能地快。对于Web程序,数据必须快速传递。与此类似的是硬实时,它要求操作在几毫秒内完成否则系统彻底失败。

Web程序的用户没那么挑剔。他们允许一些合理延时,注册登录时额可以等几秒也没问题。但是再长一点他们就会焦虑。

Web的软实时还因为操作超时会降低服务质量。、

Erlang是软实时系统。它一直合理运行多进程,一次一点,然后切换到其他进程。不会导致一个进程独占资源。因此,Erlanger能保证稳定和低延时。满足Web软实时的需求。

Web是异步的

很早之前,Web是同步的,因为HTTP是同步的。用户发起请求,然后等待响应。后来是XmlHttpRequest开启了异步调用时代。

Websocket 的出现解决了客户端和服务器之间互相异步发送数据。数据在帧中保持,不必等待响应。

Erlang进程的工作类似,它们互相发送数据,不需要等待,继续运行,不需要响应。进程多数时间是不活动的,只是等待消息,然后一有消息到来,Erlang虚拟机会激活进程。

很容易想象出Erlang非常擅长接收Websocket 帧,这些帧不知什么时间到来,然后传递到等待处理消息的响应进程,执行操作仅仅激活要求的进程。

更近的Web技术,Websocket,还有SPDY和HTTP/2.0,都是全异步的协议。当然请求和响应的概念仍然不变,只是任何数据都可以在客户端和服务器之间传递和接收,与次序无关。

Erlang天生异步,非常优秀,这样感谢多年打磨的虚拟机。生来就是异步的,尤其使它适合异步Web。

Web 无所不在(omnipresent)

Web组成了我们生活的重要部分。我们都连接在网,无论电话,PC,平板,无论在洗澡间,吃饭。每个家中的设备将来都要在线。

全部设备都连接上网,可供选择的太多,用户不会容忍出现问题,如果一直有问题,用户就会流失。

不算上面的原因,开发人员选择开发Web程序只关心是否足够快,他们到处查看性能指标测试,找出几百个并发连接的情况下发送“HelloWorld”最快的一个。Web性能指标测试不可能完全和现实一致,随着时间过去,性能会严重漂移。

当开发者真心自问,是否我能服务所有用户不出问题。他们会发现2种抉择。要么傻了吧唧装没事,要么使用Erlang。

Erlang是容错的。 用其他语言写代码,你不得不检查返回值,正确处理,避免不可预期的错误。如果幸运,你会处理大多数重要情形。当使用Erlang编程,你只要检查是否成功,忽略所有错误。当错误发生,Erlang 进程自动崩溃,然后被一个称为督程的特定进程重启。

因此,Erlang开发者不必担心未处理的错误,只需要处理正确的逻辑错误代码,给用户以反馈,剩下的让系统去处理。这样的好处是代码写得少,晚上休息好。

Erlang的面向容错的设计是使它成为无所不在的,一直可用的Web的开发的第一优选。

第二个优选是Erlang内建的分布式。分布式是建立容错系统的关键,因为可以处理更大范围的错误,比如一个服务器宕机或一个数据中心不可用。

容错和分布式特性今天看来是重要的,对于将来的Web更是至关重要。Erlang已经准备好了,你呢?

Erlang是Web的理想平台

Erlang支持全部Web要求的,包括未来的重要功能。Erlang与Web完美契合,用它来搭建Web程序确有意义。

Erlang和Web的更多相关文章

  1. Erlang的Web库和框架

    ChicagoBoss,Nitrogen ,Zotontic,BeepBeep,ErlyWeb,Erlang Boss. 转自:http://bbs.chinaunix.net/thread-3764 ...

  2. cowboy-高性能简洁的erlang版web框架

    那么Cowboy是什么呢? Cowboy is a small, fast and modular HTTP server written in Erlang. 其定位非常明确: Cowboy aim ...

  3. [Erlang 0105] Erlang Resources 小站 2013年1月~6月资讯合集

    很多事情要做,一件一件来; Erlang Resources 小站 2013年1月~6月资讯合集,方便检索.      小站地址: http://site.douban.com/204209/     ...

  4. 使用Erlang和Yaws开发REST式的服务

    看过那张很出名的“Apache vs. Yaws”图么?是不是在考虑你也应该使用Yaws了?这些图给人的第一印象是,Yaws在可伸缩性上具有难以置信的巨大优势,它可以扩展到80000个并行的连接,而 ...

  5. Erlang 命令行监控工具

    http://www.cnblogs.com/me-sa/archive/2012/11/22/erlang_vm_monitor_text_mode.html 之前介绍过一个Erlang的Web监控 ...

  6. 必须关注的25位知名JavaScript开发者

    必须关注的25位知名JavaScript开发者 发表于2012-08-07 17:30| 16215次阅读| 来源Crossrider Blog| 46 条评论| 作者Crossrider Blog ...

  7. Scala系统学习(一):Scala概述

    Scala是可扩展语言的缩写,是一种混合功能编程语言. 它由Martin Odersky创建. Scala顺利整合面向对象和函数式语言的功能. Scala被编译后在Java虚拟机上运行. 许多现有公司 ...

  8. Spark记录-Scala介绍

    Scala是可扩展语言的缩写,是一种混合功能编程语言. 它由Martin Odersky创建. Scala顺利整合面向对象和函数式语言的功能. Scala被编译后在Java虚拟机上运行. 许多现有公司 ...

  9. Erlang cowboy 入门参考之现代Web的发展历史

    Erlang cowboy 入门参考之现代Web发展史 原文: http://ninenines.eu/docs/en/cowboy/1.0/guide/modern_web/ 让我回顾一下web技术 ...

随机推荐

  1. 详解EBS接口开发之采购订单导入

    采购订单常用标准表简介 1.1   常用标准表 如下表中列出了与采购订单导入相关的表和说明: 表名 说明 其他信息 po.po_headers_all 采购订单头 采购订单号,采购类型,供应商,地点, ...

  2. Android 的 Sqlite基本操作

    在 SQL 数据库中保存数据 使用数据库 将数据保存到数据库对于重复或结构化数据(比如契约信息)而言是理想之选. 本课程假定您基本熟悉 SQL 数据库并且可帮助您开始在 Android 中使用 SQL ...

  3. 阻塞IO服务器模型之单线程服务器模型

    单线程服务器模型是最简单的一个服务器模型,几乎我们所有程序员在刚开始接触网络编程(不管是B/S结构还是C/S结构)都是从这个简单的模型开始.这种模型只提供同时一个客户端访问,多个客户端访问必须要等到前 ...

  4. Spring之Core模块

    Core模块主要的功能是实现了控制反转与依赖注入.Bean配置以及加载.Core模块中有Beans.BeanFactory.BeanDefinitions.ApplicationContext等概念 ...

  5. 使用Java正则表达式去掉Double类型的数据后面多余的0

    方法 /** * 使用java正则表达式去掉多余的.与0 * @param s * @return */ public static String subZeroAndDot(String s){ i ...

  6. 1.使用C++封装一个链表类LinkList

     使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸********** ...

  7. TCP的发送系列 — 发送缓存的管理(二)

    主要内容:从TCP层面判断发送缓存的申请是否合法,进程因缺少发送缓存而进行睡眠等待. 因为有发送缓存可写事件而被唤醒. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zh ...

  8. 用API创建用户

    DECLARE lc_user_name VARCHAR2(100) := 'PRAJ_TEST'; lc_user_password VARCHAR2(100) := 'Oracle123'; ld ...

  9. tomcat中Servlet的工作机制

    在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init.service.destroy等方法 ...

  10. Dynamics CRM 2013 SP1 客户表单界面上联系人subgrid上的添加现有联系人功能缺失

    CRM2013打了SP1的同学会发现一个问题,客户关联联系人的1:N关系,在表单subgrid中添加联系人时,只能新建而无法添加现有联系人,而这个现象在之前的版本中是没有的. 我们通过工具ribbon ...