读《谈分布式网络程序设计》,思Erlang

163的zhousen写了几篇文章,《谈分布式网络程序设计》
[url]http://q.163.com/dirgroup/blog/zhousen.zju/1802920067811231290/#1802920067811231290[/url]
[url]http://q.163.com/dirgroup/blog/zhousen.zju/1802920067123113984/#1802920067123113984[/url]
[url]http://q.163.com/dirgroup/blog/zhousen.zju/18029200672093930660/#18029200672093930660[/url]

简单谈谈感想。

1.网络数据的收发的设计方式
文中说:
[quote]使用select,一个线程专门负责所有的连接的接受和发送[/quote]
[quote]通常在高性能的服务器程序则使用的是第二种方式,占系统资源少,而且性能也很好。此外,流水线技术是目前cpu中最基本的技术之一,若将此用于网络程序设计,也可以大幅提高性能。它在网络程序中的表现实际上就是使用队列,若请求的处理过程分好几步,那么在每一步都设置一个队列,性能比将大大提升。cpu的流水线技术的原因在于各个部件都处于繁忙状态,所以cpu单位时间内处理性能提高。而网络程序采用流水线技术(队列)则能尽量促使各个节点处于繁忙状态,从而提高程序的性能[/quote]

这种做法,目前我从事的项目也在使用,将逻辑转换为大量的Task,然后放在多个线程中以流水线方式执行,以此充分利用CPU。但是这种方法存在问题,就是将对于每个连接,本应按照同步进行处理的逻辑,拆成了异步执行,在调错方面存在难度,而且程序也复杂了难于理解。如果使用Erlang,大可以一个Process对应于一个连接,由于Erlang的进程调度都是在用户态完成,因此能够最大化使用CPU,而且调试等也是很方便。

作者说了三个问题,超时,锁,网络发送瓶颈。在我的项目中,也碰到了超时和锁的问题。如果使用Erlang,锁和网络发送瓶颈的问题,都很好解决。消息通讯机制,不再需要锁;发送瓶颈,Erlang中可以一个Process对应于一个Socket。对于超时,可以在Process中监测一个Task处理的时间,汇总后计算。


2.网络协议
无论使用什么语言开发分布式网络程序,协议这方面都需要下功夫,只是Erlang在通讯的层面提供了很大的便利,可以省不少功夫。

3.字符编码
Erlang在字符编码这方面的支持是比较薄弱的。文中提的是Java和C++通讯,如果换成Java和Erlang通讯,在这方面需要谨慎处理。
举个想到的例子,比如Java端要发送一个含中文字符串的数据包到Erlang端,使用 Length + Body 的格式发送,那么Java代码就需要计算出正确的Length,使用 getBytes("UTF-8") 来获得字符串长度,Erlang代码要使用 iconv 来将二进制流编码为正确的UTF8串。

4.字节序
“通过网络字节序进行传输”这个确实是最好的办法。

5.单元测试
Erlang也有单元测试的,可以看看 wiki.trapexit.org 上面的 Test Driven Development 一文。

6.集成测试
啥系统都要做的,避免不了的,不多说了。

7.内存测试
有VM的语言就胜在这方面,但是糟糕的程序也一样会造成内存溢出。Erlang就要注意Atom表的问题,此外一些set,dict也要注意容量别太大了,超过系统内存,会抛出一个错误的,我碰过这个。另外Erlang的内存模型是私有堆,理论上回收效率,延时等方面,可以比Java这样的命令式语言的VM做的更好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值