Home > Erlang探索, 源码分析 > cowboy-高性能简洁的erlang版web框架

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

February 27th, 2014 Leave a comment Go to comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: cowboy-高性能简洁的erlang版web框架

大部分的分布式系统只要有业务价值,必须提供如API,监控,管理界面等等,而http是目前事实上的标准,换句话说分布式系统必须提供强大的web框架,编写业务才能容易上手。 Erlang系统第一天就是设计干这个的,自然有很多web框架,出名的如mochiweb, cowboy,chicagoboss, misultin,inets等框架,竞争也是非常激烈。今天我要推荐的是新秀:cowboy,项目在这里

那么Cowboy是什么呢?

Cowboy is a small, fast and modular HTTP server written in Erlang.

其定位非常明确:

Cowboy aims to provide a complete HTTP stack in a small code base. It is optimized for low latency and low memory usage, in part because it uses binary strings.

Cowboy provides routing capabilities, selectively dispatching requests to handlers written in Erlang.

Because it uses Ranch for managing connections, Cowboy can easily be embedded in any other application.

No parameterized module. No process dictionary. Clean Erlang code.

目前还支持websocket和spdy协议(由leofs赞助),是个完整的http协议栈实现,功能强劲。由于是最近才发展起来的,充分考虑了性能,强调代码的整洁,作者在产品层面对erlang的优缺点非常了解,实现的很优雅很高效。 目前多个项目都是用它支撑的,也反过来刺激它走的很稳很快,代码维护也很活跃,比如竞争对手misultin感觉没有超越的希望就放弃了。

Misultin development has been discontinued.

There currently are three main webserver libraries which basically do similar things:
* Mochiweb
* Cowboy
* Misultin
Mochiweb has been around the block for a while and it’s proven solid in production, I can only recommend it for all basic webserver needs you might have. Cowboy has a very interesting approach since it allows to use multiple TCP and UDP protocols on top of a common acceptor pool. It is a very modern approach, is very actively maintained and many projects are starting to be built around it.

在c实现中nginx是做的最好的,但是如果你用nginx写自己的业务代码的时候,你就会把整个系统的性能拖到实现者的水平,总体来讲性能不会太高。而基于cowboy的实现再加上erlang天然的优势,通常一台机器做到几万的QPS的业务,对实现者的要求非常低,可以大大促进生产力,额外的福利还有热升级和稳定可靠。

小结:技术在进步,思想也要放开。

祝玩的开心。

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: Erlang探索, 源码分析 Tags: , ,
  1. Xu Yifeng
    March 14th, 2014 at 09:49 | #1

    因为nginx是事件驱动的multiplex处理方式,如果直接在nginx里面写阻塞的调用或者需要运行比较耗时的代码,会立刻影响行性能,然而你不得不用fastcgi之类的扩展,这样又回到一个连接一个重量级进程的老路上去了。erlang确实可以比较好地解决这类问题,因为线程的开销很小,一个线程处理一个用户连接,代码执行都是线性的,都是传统的方式来思考问题就可以了,而nginx里面写状态机将会是很复杂的事情,不适合复杂的应用。

    [Reply]

  2. Chen Qiuping
    June 8th, 2014 at 23:27 | #2

    用Nitrogen框架做网站,这个开发起来也挺容易的,网页映射到模块。有个问题,我用ErlMySQL这个MySQL的客户端从数据库中取数据放到页面展示,但是页面刷新多次后就没有数据,不知道是什么原因,余大侠能给予指导否?谢谢!

    [Reply]

  3. August 14th, 2014 at 23:14 | #3

    请问余大侠, 实际情况下,是怎么用cowboy做后台程序的?
    是直接把程序封装成应用吗? 可是这样一来就好像每个后台应用都要启动一个独立的cowboy了。
    我之前的做法是把cowboyf用rebar封装成一个应用,console启动, 进入控制台之后, 再在控制台中启动后台程序,可是失败了。
    所以我现在的做法就是先器一个节点, 然后code:add_paths,然后再application:start().
    我知道这样做不好, 可是没办法啊…. 求给指条明路。

    [Reply]

    Yu Feng Reply:

    rebar创建出来的工程就是最佳实践了,xxx start 脚本和配置都给你写好了。

    [Reply]

  1. June 12th, 2014 at 15:38 | #1