使用 OTP/Erlang 作为 Web 应用程序基于组件的架构的一部分
Posted
技术标签:
【中文标题】使用 OTP/Erlang 作为 Web 应用程序基于组件的架构的一部分【英文标题】:Using OTP/Erlang as a part of the component-based architecture of a web application 【发布时间】:2012-01-25 16:42:41 【问题描述】:我有一个执行一些业务逻辑的 Erlang/OTP 应用程序。它是用 Erlang 编写的,主要是为了容错,因为我可以轻松地重新启动系统崩溃的组件之一(高正常运行时间是最重要的要求)。 它的每个组件都执行某种特定的“并行”计算。
作为一个工作周期的结果,应用程序会生成一个值列表。我们称这个 Erlang/OTP 应用程序为“后端”。
此 Erlang/OTP 应用程序还将使用 PostgreSQL 服务器将结果存储在持久存储中,并存储其计算所需的额外元信息(尚未实现)。
接下来我需要为这个 Erlang/OTP 应用程序添加一个前端 - 一个简单的基于 Web 的解决方案,可以服务于 Web 用户:接受他/她的计算请求,要求后端执行计算并从后端将结果返回给用户。
没有可扩展性要求,我认为每天最大用户数不能超过1000。
所以我现在的任务是为我的后端 Erlang/OTP 应用程序实现一个通用前端(通用意味着我有一个典型的用例:访问站点、注册、登录、使用应用程序、获取结果显示在一个漂亮的 ajax'y 网页上,退出)。
一方面,我知道代码重用可以为我节省大量时间:例如,使用 Ruby on Rails,我可以免费获得用户身份验证、密码存储、ajax 接口和许多其他东西。
另一方面,我对设计一个包含 Erlang/OTP + PostgreSQL 数据库服务器后端和作为前端的 Web 框架(RoR、Django 等)的应用程序一无所知。
我脑海中浮现出很多问题:Erlang/OTP 和 web 框架是否应该使用同一个 PostgreSQL 数据库来共享结果?将计算请求从 Web 框架发送到 Erlang/OTP 应用程序并将其取回的最佳方式是什么?我如何监督 PostgreSQL 服务器 - 它不在 OTP 的容错范围内?
一般来说,我有一些异构软件组件,我想用它们构建一个工作系统(“主要”组件是 Erlang/OTP 应用程序)。
我应该从哪里开始这项任务?您能给我任何建议或提示,可以阅读哪些资源吗?
附:我尝试阅读this 并点击链接,但不太了解。
UPD: 我知道 Chicago Boss 和其他 Erlang 网络框架确实存在,但我怀疑它们中的任何一个都有如此成熟的环境、充满活力的社区以及不同插件和库的巨大变化,例如例如 Ruby on Rails、Django 或任何基于 php 的 MVC 框架。正确的?
UPD2:也许我必须更深入地阐述这一点:我还需要前端尽可能可维护。在 Erlang 中做这意味着我可能会遇到寻找合适的开发人员来维护它的问题;在 RoR、Django 等中做这意味着我可以很容易地找到工作人员来维护和发展前端。
【问题讨论】:
我也编辑了我的答案。请查看答案更新。谢谢 【参考方案1】:首先,这里有一个 Erlang PostGreySQL 客户端:https://github.com/wg/epgsql。另一件事是您可能想查看 ZOTONIC。它是一个用 Erlang 编写的 CMS,但它也是一个 Web 框架。它的一个特点是它很好地集成了 PostGreySQL 数据库,因此 Zotoniuc 背后的所有 Erlang 应用程序都将从中受益。在开发 MVC 或事件驱动的 Web 应用程序时非常好。 此外,您可能还想查看 Nitrogen Web Framework 和 Chicago Boss,它们也是 Erlang Web 应用程序的 Web 框架。我个人使用 Nitrogen、Yaws 和 Mnesia 作为一个完整的套件开发了 Erlang Web 应用程序。一个非常好的优势是您可以在此技术堆栈后面拥有多个 Erlang 应用程序。 Yaws 网络服务器及其 Appmods 和 dynamic Content Serving ability(所以 RESTFUL 我可以向你保证),它为我们的 javascript 提供了支持驱动前端 Web 应用程序具有如此惊人的简单性和美观性,提供来自多个 Erlang 应用程序的服务。
如果您想拥有一个快速的 Web 前端,并具有类似 Ajaxy/html5 的功能,那就快点,快点!并抓住自己的Nitrogen Web Framework。由于您已经是 Erlang 程序员,所以这对您来说太快了。使用模板,您可以编写 HTML4.X / HTML5 模板,或使用 Web page Maker/Studio Software 为您创建模板。稍后,您将向 Nitrogen 展示从何处进入,使用由您的 Erlang 代码生成的动态生成的 JQuery 代码将您的 Erlang 后端绑定到那些漂亮的页面。文档非常简单。 Nitrogen 只是 Erlang Records 的集合,每条记录代表一个 HTML 标签。其他记录用于定义将被 POST 回您的 Erlang 应用程序的效果和事件。在 Nitrogen 中开发漂亮的 Web 界面是如此之快。事实上,通过动态生成的 JQuery 代码,您可以将自己的 JavaScript 编写到模板中以配合整个功能,例如使用另一个 JavaScript 库,例如 EXT JS 或 MooTools 或 prototype js。在模板中,您将指出 Nitrogen 应该在哪里呈现动态生成的 HTML 元素以及将“AJaxically”作用于这些元素的 JQuery。在这种情况下,模板仅表示 HTML 页面。
请记住成为其邮件列表的成员以寻求更多帮助,并继续在 *** 上提出更多问题。欢迎来到 Erlang Web 开发的世界。您可能感兴趣的几个链接(IEEE Paper on Web Development in Erlang、Erlang Web Framework、erlydtl - Erlang Django like Templating Implementation , ErlyWeb Framework) 成功!
编辑 现在,你说的是真的。寻找开发人员来维护它将是一项任务。但是,正如我之前提到的,Zotonic 是一个成熟的(网络)CMS,就像 Joomla 或 Word Press 等一样。有了它,您自己实际上可以管理/维护站点/应用程序。 但是,您也可以使用 Django 或 Ruby on Rails 开发 Web 前端,但使用 JSON 格式的数据从 Web 前端创建安全服务到 Mochiweb。然后,使用 mochiweb 附带的Mochijson2.erl,解析 JSON 并将其转换为 Erlang 后端中的请求或方法和参数。这将在两个方向完成,即您向 Erlang 应用程序发出请求,获取返回的结果并将它们呈现为 JSON 数据。 Mochiweb 是一个强大的工具,可以将任何 Erlang 后端与任何 Web 技术连接起来前端使用Service/RESTFul 模型。它简单而重量轻。它的速度很快,它所需要的只是你将它指向处理 POST、GET、PUT 等 HTTP 请求的方法,它会等待返回结果。 Mochiweb 已在许多 Erlang 系统中使用,例如Couch DB(最先进的 NoSQL DBMS 之一,改变了我们理解 Web 和 SOA 系统的方式)和所有其他系统,例如 Membase Single Server、Big Couch / Cloudant , 等等你可以看到有人在使用 mochiweb here、then here 和 lastly here。 Django、Twisted、PHP 或 Ruby on Rails 框架发出 JSON 请求,并期望来自 Mochiweb 支持的 Erlang 后端的 JSON 响应。 Erlang Web 后端的另一个很棒的 RESTful 接口是 Misultin,它甚至支持 Web Sockets,有时被认为是最快/或响应速度最快的 Erlang HTTP 库:) 根据我的经验,我曾与 PHP 大师、JavaScript 大师等合作过。但是,当我们使用来自两个方向的 JSON 请求和响应将 Web 服务器设置为 yaws 和 Service Oriented Model 时,我们会发现开发成本更低。在这种情况下,我们不会失去 Erlang 的可用性和容错性,顺便说一下,即使它们隐藏在不同的域子网中,您也可以向尽可能多的分布式 Erlang 服务器发出许多请求,使用所有 JavaScript 都支持的JSONP和/或 Front-web 框架。我强烈建议您将 Mochiweb 或 Misultin 放在您的 erlang 后端前面,并拥有您选择使用 JSON 格式(甚至是 XML,您将使用 erlsom 解析)发出请求的 Web 框架,下载它here)。我希望你能得到我的建议。成功!!!
【讨论】:
您的回答编辑得非常好!您能否请我参考一些来源,在那里我可以阅读更多关于“使用 JSON 格式数据到 Mochiweb 的安全服务”的信息?我知道 Mochiweb 是什么,但我从未听说过与 Mochiweb 相关的安全服务。【参考方案2】:您也可以使用任何可用的web framework 在 erlang 中实现您的前端。在单独的 erlang 节点中运行前端和后端,使用 erlang RPC 进行它们之间的通信。
【讨论】:
以上是关于使用 OTP/Erlang 作为 Web 应用程序基于组件的架构的一部分的主要内容,如果未能解决你的问题,请参考以下文章
在 OTP/Erlang 中将 ID 映射到进程的惯用方式是啥?
我如何使用 Web 应用程序作为 C++ 构建的应用程序的接口?
何时使用 Mongrel 作为 Rails 应用程序的 Web 服务器?
使用 AWS Cognito 和 AD FS 作为 Web 应用程序的身份验证