原文地址:avindev.javaeye.com
原文作者:AvinDev
163的zhousen写了几篇文章,《谈分布式网络程序设计》
第一篇,第二篇,第三篇
简单谈谈感想。
1.网络数据的收发的设计方式
文中说:
使用select,一个线程专门负责所有的连接的接受和发送
通常在高性能的服务器程序 则使用的是第二种方式,占系统资源少,而且性能也很好。此外,流水线技术是目前cpu中最基本的技术之一,若将此用于网络程序设计,也可以大幅提高性能。 它在网络程序中的表现实际上就是使用队列,若请求的处理过程分好几步,那么在每一步都设置一个队列,性能比将大大提升。cpu的流水线技术的原因在于各个 部件都处于繁忙状态,所以cpu单位时间内处理性能提高。而网络程序采用流水线技术(队列)则能尽量促使各个节点处于繁忙状态,从而提高程序的性能
这种做法,目前我从事的项目也在使用,将逻辑转换为大量的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做的更好。