第五重境界:消息通信
话说当年明教教主在连乾坤大挪移的时候,实际上并没有所谓的第7重,这第7重只是创始人凭借着自己的聪明才智想出来的,根本无法证实是否正确,幸好张无忌没有练才躲过一劫。
其实我们这里的所谓第5重也是我凭空想出来的:)大家接下来也可以看到,这一重境界其实和C++或者DLL完全没有关系,但这一重境界绝对不是凭空乱想,而且也绝对不是无法证实的,这一重境界是每个IT人都知道的,也许是每个人进入IT界接触的第一个重用方法——消息通信。
aha,是不是觉得很简单、很普通、很傻很天真?!!
但是仔细想想,这确实是最高的重用境界,我们将这种方法与DLL方法来比较一下:
1)消息通信和编译无关,DLL和编译相关;
2)消息通信支持分布式部署,DLL不支持分布式部署;
3)消息通信和具体语言无关,C++的程序可以和Java的程序通信;
4)消息通信可以和操作系统无关,DLL和操作系统绑定的;
看起来消息通信这种方式几乎完美了,那我们还要DLL干嘛呢?前面讲了那么多,那不是浪费口水和时间?
当然不是了,消息通信也存在缺点的:
1)要通过某种方式来收发消息,例如TCP、SCTP、TDM链路;
2)要制定协议来规定收发消息规则和行为规则;
3)要对发送消息和接受消息进行编解码;
总结起来就是消息通信是重量级的,DLL是轻量级的。
废话说了这么多,我们举一个简单的样例,由于消息通信实现比较复杂,这里就不写代码了,简单的描述一下。
例如系统有A、B、C、D 4个模块,都需要访问数据库,对数据库进行操作,由于对数据库的操作基本上建立连接、执行操作、释放连接,这些操作基本上都是一样的。
如果是DLL实现方式,那么就把建立连接、执行操作、释放连接做成DLL,然后由每个模块去调用DLL的对应函数。
如果是消息通信,按照如下机制实现一个消息通信:
1)新建一个模块E,这个模块完成建立连接、执行操作、释放操作的功能;
2)规定A、B、C、D通过TCP/IP与E通信;
3)规定消息格式,例如采用TLV编码,或者二进制编码等
4)规定消息内容,例如:发1标识建立连接、100表示建立连接结果,2表示释放连接,200表示释放连接的结果,等等
例子到这里就结束了,是不是觉得很简单,或者意犹未尽?
是的,一旦采用消息通信方式,你可以发挥的余地就很大了,还是上面那个例子,我们可以做很多的优化,例如:
1)A、B、C、D不再需要关注建立连接和释放连接了,只需要关注数据操作就ok了;
2)E模块可以采用连接池、多线程等技术来提高性能;
3)如果底层数据库修改了,只需要修改E就可以了,A、B、C、D完全不需要任何修改,其实ABCD都不知道底层数据库是Oracle还是DB2.
4)E可以用任何编程语言编写,也可以运行在任何操作系统上;
5)E进程可以实现双机主备等机制来保证可靠性或者性能;
……………………………………………………
总结
好不容易把这个东东讲完了,也算是自己总结归纳了一下,当然,由于才疏学浅,难免出现遗漏和错误,还请大家纠正。
由于篇幅有限,每一篇都写得比较简单,基本上就是把设计思想介绍了一下,实际中应用肯定还有很多问题和细节需要大家去解决,在这里就不一一细讲了(例如第4重境界需要解决多线程的同步问题、第5重境界需要设计好消息格式和消息内容等)。