Haskell进入生产(Hasura.io)

Hasura.io使用haskell作为核心编程语言建立微服务平台,并分享了一些实践经验,如默认同步异步使用GHC等。

详见:From Zero to HIPster (Haskell In Production)

该开发团队背景是:大部分开发人员具有主流语言C, Java, Python, C++, C#, Javascript等开发经验,他们着手建立一个PaaS/Baas,起初他们评估了各种语言看看是否适合构建核心平台。

虽然Haskell的纯函数语言,健壮 内置高并发和并行语言非常吸引人,但是陡峭的学习曲线也是风险,还有范畴理论导致其更加神秘。

他们对几种语言进行了比较,从编程难易与意愿 内存消耗和并发几个指标衡量:
1.Java: 编程难易与意愿是None,内存消耗高,并发成熟。
2.Node.js: 编程难易与意愿是ok,但是回调函数嵌套循环,内存消耗一般,并发相当成熟。
3.Hashell: 编程难易与意愿是yes,缺省是同步编程,使用GHC处理异步,内存消耗低,并发成熟。
4.Python: 编程难易与意愿是yes,内存消耗高,并发不容易。

起初他们进行了一些评估编程,使用Haskell编写一些微服务,包括ZeroMQ的broker,自动生成类型安全的CRUD和查询数据库表的API,一个redis缓存层。

真实一个案例:开发一个Http服务器,JSON分析和Postgres数据库接口。

经过几种语言挑选,选中了Haskell,实现案例需要Haskell相应框架库包:

1.Warp是http服务器
2.Aeson是JSON分析框架
3.Hasql是Postgres 连接驱动库包

经过这个案例项目以后,他们总结Haskell优点如下:
1. 纯函数:能够让整个程序变得可推理,有条理,代码直接精确反映了我们的(逻辑)推理。
2.精确代码:立即写代码,马上就能重构,更少的代码让你重构更容易。
3.健壮代码:静态语言 类型推断和智能的编译器。
4.测试:类型系统大大降低了大型类的单元测试,快速检查是另外一类测试风格,能通过自动生成你的函数的断言测试用例;当然手动测试还是最重要,包括IO相关故障。
5.IO高并发:GHC的线程抽象和IO管理器,易于从并发执行计算角度考虑,并能得到基于事件的异步运行框架如Node.js的所有优点。其次,GHC有一个类似Node.js的非堵塞IO,支持实时多线程和自然地多核(Node.js需要cluster库包支持多核),可以像Node那样使用事件编程,这真的不是一场公平竞争。
6.丰富库包:Haskell库包非常易于集成。
7.部署:私有云部署Haskell非常容易,因为所有依赖的库包都是静态链接,能够一步到位进行版本控制和部署。

一些问题:
1Type error类型错误让初学者感觉奇怪,分析语法错误根本没有用。
2.文档:简单时类型就是文档,但是一些库包,类型签名没有提供文档,这种情况下使用这些库包需要努力一点。
3.语言拓展:当你在haskell中寻找库包时,你会看到GHC的语言拓展,有些很直观((OverloadedStrings, ScopedTypeVariables)),有些不是 (RankNTypes),难于从源码中进行学习。


[该贴被banq于2015-02-16 10:40修改过]