Erlang 和 Web

Erlang是编写Web应用程序的理想平台。它的特性完全符合现代Web应用程序的需求。

Web是并发的

当你只访问一个网站时是几乎没有并发性的。打开几个连接,并通过这些连接发送请求。然后web页面就会显示在您的屏幕上。您的浏览器将只打开4或8个连接到服务器,取决于您的设置。

这不是很多。但是想想看。您不是同时访问服务器的唯一用户。在同一时间,可能有成百上千甚至数百万的连接连接到同一台服务器。

即使在今天,生产中使用的许多系统都没有解决C10K问题(1万个并发连接)。而那些成功的人正在努力进入下一个阶段,C100K,而且离它还很远。

同时,Erlang处理数百万个连接是没有问题的。在编写本文时,有一些用Erlang编写的应用服务器,在实际生产应用程序中,在一台服务器上可以处理超过200万个连接,而且还有空闲的内存和CPU!

Web是并发的,而Erlang是一种专为并发而设计的语言,因此它与之完美匹配。

当然,各种平台的规模需要超过几百万个连接。这就是Erlang内置分发机制的作用所在。如果一个服务器不够,可以添加更多的服务器!Erlang允许您使用相同的代码与本地进程或集群其他部分的进程通信,这意味着您可以在需要时快速扩展。

Web拥有庞大的用户基础,而Erlang平台被设计成可以在分布式环境下工作,因此它是一个完美的匹配。

或者是吗?当然,你可以用你最喜欢的语言找到解决方案来处理这么多并发连接……但所有这些解决方案都将在未来几年解体。为什么?首先,因为服务器并没有变得更强大,而是获得了更多的内核和内存。只有当您的应用程序能够正确地使用它们时,这才有用,而Erlang与这一领域中的任何东西都相差甚远。其次,今天你的电脑和手机都在线,明天你的手表、护目镜、自行车、汽车、冰箱和其他大量的设备也将连接到互联网上的各种应用程序。

只有Erlang准备好应对即将到来的问题。

Web是软实时的

硬实时系统有一个刚性的、不可改变的时间限制,它不允许任何超出时限的错误。超时错误会带来损害甚至导致系统失败、或者导致系统不能实现它的预期目标。软实时系统的时限是一个柔性灵活的,它可以容忍偶然的超时错误。失败造成的后果并不严重,仅仅是轻微的降低了系统的吞吐量。

Web是软实时的,因为花更长的时间执行一个操作会被视为服务质量差。

Erlang是一个软实时系统。它总是公平地运行进程,一次运行一点,一段时间后切换到另一个进程,防止单个进程从所有其他进程窃取资源。这意味着Erlang可以保证稳定的低延迟操作。

Erlang提供了软实时Web所需要的保证。

Web是异步的

很久以前,Web是同步的,因为HTTP是同步的。您启动了一个请求,然后等待响应。不了。这一切都始于开始使用XmlHttpRequest。它允许客户机对服务器执行异步调用。

然后Websocket出现了,它允许服务器和客户端完全异步地向另一个端点发送数据。数据包含在帧中,不需要响应。

Erlang进程的工作原理相同。它们相互发送消息中包含的数据,然后在不需要响应的情况下继续运行。它们的大部分时间都处于不活跃状态,等待新消息,当收到消息时,Erlang VM将愉快地激活它们。

因此,很容易想象Erlang擅长接收Websocket帧,这些帧可能会在不可预测的时间进入,将数据传递给始终准备好等待新消息的负责进程,并通过激活系统所需的部分来执行所需的操作。

最近的Web技术,比如Websocket,还有HTTP/2.0,都是完全异步的协议。请求和响应的概念当然是保留的,但是客户机或浏览器可以在两者之间发送任何东西,响应也可以以完全不同的顺序接收。

Erlang本质上是异步的,而且由于多年来在VM中完成的伟大工程,Erlang在这方面非常出色。它很自然地擅长处理异步Web。

Web无处不在

网络已经成为我们生活中非常重要的一部分。我们每时每刻都是联系在一起的,用手机、用电脑、在卫生间用平板电脑打发时间……这不会慢下来,家里或我们身上的每一个设备都会连接上。

所有这些设备总是连接在一起的。而且,有这么多的选择可以让你访问你所寻找的内容,当问题出现时,用户往往不会逗留在那里。今天的用户希望他们的应用程序总是可用的,如果有太多的问题,他们就继续前进。

尽管如此,当开发人员选择一个用于构建web应用程序的产品时,他们唯一关心的似乎是“它快吗?”,他们四处寻找合成基准,以显示在只有少量并发连接的情况下,哪一个发送“Hello world”最快。在很长一段时间内,Web基准测试并不能代表现实,而且随着时间的推移,它正在变得越来越遥不可及。

开发者真正应该问自己的是“我能在不受干扰的情况下为所有用户提供服务吗?”他们可以抱最好的希望,也可以使用Erlang。

Erlang是为容错而构建的。当用任何其他语言编写代码时,您必须检查所有的返回值并相应地采取行动,以避免任何不可预见的问题。如果你幸运的话,你不会错过任何重要的事情。在编写Erlang代码时,您可以只检查成功条件并忽略所有错误。如果发生错误,Erlang进程就会崩溃,然后由一个名为supervisor的特殊进程重新启动。

因此,Erlang开发人员不必担心未处理的错误,而可以专注于处理应该给用户一些反馈的错误,让系统来处理其余的事情。这也有一个好处,即允许他们编写更少的代码,并让他们可以在晚上睡觉。

Erlang面向容错的设计是使它成为无处不在、始终可用的Web的最佳选择的第一步。

第二部分是Erlang的内置发行版。分布式是构建容错系统的关键部分,因为它允许您处理更大的故障,如整个服务器故障,甚至整个数据中心故障。

容错和分布式在今天很重要,在未来的Web中也将是至关重要的。Erlang已经准备好了。

学习 Erlang

如果您是Erlang的新手,您可能需要阅读一两本书来开始学习。这就是我作为《Cowboy》作者的建议。

《The Erlanger Playbook》是我目前正在编写的一本电子书,它涵盖了从代码到文档到测试Erlang应用程序的许多不同主题。它还有一个Erlang部分,直接介绍了构建模块和模式,而不是语法等细节。

你很可能作为一个完全的初学者阅读它,但你需要一本伴侣书来充分利用它。从Nine Nines website够买。

《Programming Erlang》

这本书出自Erlang的创始人之一Joe Armstrong之手。它很好地解释了Erlang是什么以及为什么会这样。它是对该语言和平台的很好的介绍。

这本书是关于Erlang编程的,还有一章是关于Cowboy的。

《Learn You Some Erlang for Great Good》

LYSE是一本更完整的书,涵盖了Erlang的许多方面,同时也提供了故事和幽默。请注意:它相当冗长。它有一个免费的在线版本,一个更精致的纸质版和电子书版本。

Cowboy 用户指南 (二) - Erlang and the Web相关推荐

  1. Gradle 2.0 用户指南翻译——第二十二章. 标准的 Gradle 插件

    翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tre ...

  2. Java架构师之旅(二十九 附录《MyBatis3 用户指南》中文版)

    夜光序言: 岁月波光粼粼,赋予爱与生命,唯有生活不能被他人代替,只会有寂寞相随~~ 正文: MyBatis 3 2010.08.01  翻译的一个版本,虽难比较老了,但是有一些基础还是值得学习,毕竟是 ...

  3. (转) ASP.NET 2.0:使用用户控件和定制的Web部件个人化你的门户网站(二)

    Web部件目录 我们已经见过了如何在 WebPartZones 控件中事先放入Web部件.你还可以用另外一种方法完成这个功能,那就是允许用户在运行时添加新的Web部件.通过使用 CatalogZone ...

  4. [ISUX译]iOS 9人机界面指南(二):设计策略

    [ISUX译]iOS 9人机界面指南(二):设计策略 雪糕 2015.11.09 文章索引 2.1 设计原则(Design Principles) 2.1.1 美学完整性(Aesthetic Inte ...

  5. Robot Framework用户指南

    Robot Framework用户指南 版本2.8.6 版权所有©诺基亚解决方案和网络2008-2014 根据知识共享署名3.0 Unported许可授权 目录 1开始 1.1简介 1.2版权和许可 ...

  6. QGIS用户指南(持续更新)——序言

    工作需要使用GIS软件,ArcGIS版权问题及对电脑配置要求,想学习一下QGIS软件应用. 地理信息系统(GIS)软件QGIS的用户指南.QGIS受GNU通用公共许可证的约束.QGIS主页上提供了更多 ...

  7. jBPM3.12用户指南中文翻译----第一章 绪论

    这是Jboss 的jBPM3.12框架的用户指南的中文翻译.其中第一章的译文,是我在网上找到的.其他几章都是我自己做的翻译.我的翻译是中英文对照,只翻译部分我认为重要的,不翻译简单的英文,以免浪费你我 ...

  8. oracle 查二进制字符串,检测二进制文件 - Oracle® Developer Studio 12.5:Discover 和 Uncover 用户指南...

    检测二进制文件 通过检测目标二进制文件,会在关键位置添加代码,以便 discover 可以在二进制文件运行时跟踪内存操作. 注 - 对于 SPARC V8 体系结构上的 32 位二进制文件,disco ...

  9. [转载]Guice 1.0 用户指南

    http://code.google.com/p/google-guice/ 用 Guice 写 Java Guice 1.0 用户指南 (20070326 王咏刚 译自:http://docs.go ...

最新文章

  1. YBTOJ洛谷P2223:软件开发(费用流)
  2. js 中的console.log有什么作用
  3. java面试题8 牛客:在Web应用程序中,( )负责将HTTP请求转换为HttpServletRequest对象
  4. Windows下的FFmpeg 、MEncoder、MPlayer下载地址
  5. 系统性能衡量维度、指标
  6. mysql_crud
  7. python 单链表是否有回路_第5章 第1节 链表
  8. 要想通过面试,MySQL的 Limit 子句底层原理你不可不知
  9. Openstak(M版)控制节点安装
  10. 机器学习实战(三)朴素贝叶斯NB(Naive Bayes)
  11. oracle初级系列教程
  12. TensorFlow基础笔记(6) 图像风格化实验
  13. 「中间件」RocketMQ解决消息顺序和重复性消费问题整理(附测试代码)
  14. python实现动态桌面壁纸(精简)
  15. 计算机xp的解释,xp蓝屏代码解释以及解决办法
  16. 三星s8怎么分屏操作_三星Galaxy Z Fold2帮你应对快节奏生活
  17. Windows上搭建安卓的JAVA开发环境(Ecli...
  18. 第一章 初探Swing
  19. Java简单案例练习
  20. 如何使用Arthas查看类变量值

热门文章

  1. 计算机与艺术联姻阶段,数字媒体艺术概论第二次作业
  2. 华为OD机试真题 Python 实现【快递投放问题】【2023 Q1 | 100分】
  3. 什么是身份证OCR接口
  4. linux下git安装和配置
  5. idea中启动vue项目
  6. 公路平曲线及主点桩号计算
  7. 广告位招租C: City
  8. MySQL 架构与内部模块
  9. mysql之数据库引擎
  10. OpenGL学习十九:纹理过滤