最近有点疲于奔命的感觉,孤军作战不是好事阿。

以前学分布式计算原理与应用,一直对老师和教材有不满。教材虽然写的中规中矩,可是对 java 的偏向性无疑是一个败笔。书中的 Java 代码起个 helloworld 的作用还可以,真要用起来总觉得生涩无比,整天就在流里面转来转去。实验方面,socket 的相关代码没有 c 的清晰,要不是 string 类封装了一些应手的函数,真不知道有什么优点。RMI 看上去很美好,只是这种美好是建立在实验的基础上的。要真的应用起来,单单异常处理就会要命,网络的不确定性太多了,不是随便架起一层就能抹平的。

最讨厌的是老师整天在吹嘘 servlet 的高性能,喋喋不休简直是 Java 活脱脱的营销人员。servlet 相对于 cgi 的优点,在于两点:一是持续运行,可以轻松维护 session 信息;二是可以拥有线程池,启动快速,不需频繁启动关闭进程,减少系统消耗。

有时候真的很难理解他的思维,多个 cgi 进程就需要加载多份程序?Linux 早就实现了多个副本共享一个代码段了。没有线程池方便?可以用进程池啊。而多进程抗崩溃的能力不是多线程能够轻易赶上的。fastcgi 的出现,也使得 cgi 的持续运行成为了可能,维护 session 不再遥不可及。

最重要的一点是,cgi 模型非常清晰易懂。前端的服务器做一个 dispatch 的作用,将请求分发到不同程序,并可以应付一定的 IO 请求。cgi 程序自身从环境变量读取请求信息(get)或从标准输入流读入(post 方法),最后将结果输出到标准输出流,服务器轻松地将 cgi 的标准输出流重定向到自己身上,再返回给 Browser 端。 而 fastcgi 则采取了一种更为激进一点的方式,fastcgi 具有 daemon 进程,服务器端与 fastcgi 端通过 socket 进行通讯。

ajax 的出现,使程序的行为变得更加灵活。原来的动态网页,流程一般是从 Browser 发起请求,服务器端接受请求转发给 cgi,cgi 程序与数据库交互,返回动态构造的网页,服务器再转发给 Browser。而 ajax 则可以通过在 Browser 端运行的 js,直接在客户端动态构建网页,切实减轻了服务器端的负载。