Base64编码导致服务器崩溃

来源:互联网 发布:vb elseif 用法 编辑:程序博客网 时间:2024/05/14 04:11

Base64编码导致服务器崩溃


  我之前提到:“使用了文本来替代二进制的协议,其中就用了base64对文本进行编码。在《一个更加的KISS设计》一文中谈到。

  结果,这个base64编码的代码在Redhat平台上测试正常,服务器正式上线的时候却崩溃了。很是郁闷~,,大家都抱怨我所谓KISS的设计。先写这么多,清醒点,再写这个话题,

  续....,在我的设计中使用文本协议来取代二进制协议,并将敏感信息进行Base64编码,尽量将协议的结构扁平化,则无疑是最符合

KISS的设计原则的。服务器崩溃的原因是,我们使用了一套不标准的手工打造的Base64加解码函,而手工打造的加解码函数虽然在windows,Redhat Linux平台下测试成功。但是却没有在Solarix平台下测试过。

  根据我们的跟踪崩溃代码函数

int CBase64::Base64Encode(char * base64code, const char * src, int src_len)

  中发现,崩溃的地方定位到char类型到unsigned long*类型的强转和位移操作,估计是Sun的CPU和Intel的CPU的高端序和低端序CPU字节转换的问题导致崩溃。之后我们再也没有继续跟踪下去。

  我上网找了一份标准的Base64编码函数取代了Base64Encode从而解决了问题。既然问题出现了。那么该总结一下问题出现的原因来杜绝以后发生类似的问题。如果我们的服务器老是崩溃,那么谁还会使用我们的服务呢?

  首先,从技术层面来说,我的设计是没有任何问题的,这是一个相当简洁而干净的设计。从软件工程上看来,是由于我们的测试没有做到位。换句话也不是我们的测试没有做到位,而是我们没有条件去做测试(我们的测试和开发机器是Linux,我们没有Solarix的测试环境,而我们的服务器上线的环境是Solarix)。

  由于没有这种环境,所以,同事都倾向于使用一些,目前已经运行良好的设计,比如之前的二进制协议。虽然它设计得很复杂,很难维护,至少它工作得很好。从某种它也符合KISS的设计原则。KISS中有一条原则:“不要优化一个正在工作的系统”。


  对比,同样是UNIX之父Ken设计的两个操作系统:UNIX和Plan9,UNIX取得了巨大的成功,UNIX系统为Ken赢得了计算机中的诺贝尔奖——图灵奖。但是Plan9系统确就显得默默无闻了。但从设计来说,Plan9比UNIX更加UNIX,设计更为KISS和优雅。Plan9的特性和能力纷纷被UNIX和UNIX的各种分支,Linux,FreeBSD模仿。那为什么Plan9没有取得成功?

  《Unix编程艺术》已经给出了答案:

  当软件设计师雄心勃勃的想要设计一个更加强大和优秀的项目的时候:不要忘了,市场会偏好目前已经运行良好的系统,虽然它嘎嘎作响。

  所以,总的来说,并不是因为我遵守KISS而导致服务器崩溃。也许导致服务器崩溃的原因并不是我遵守了KISS,恰恰相反,也许原因是我做得还不够KISS!



图片


原创粉丝点击