不要重复发明*:C++重用的5重境界(5)——消息通信(完结篇)

 

第五重境界:消息通信

话说当年明教教主在连乾坤大挪移的时候,实际上并没有所谓的第7重,这第7重只是创始人凭借着自己的聪明才智想出来的,根本无法证实是否正确,幸好张无忌没有练才躲过一劫。

其实我们这里的所谓第5重也是我凭空想出来的:)大家接下来也可以看到,这一重境界其实和C++或者DLL完全没有关系,但这一重境界绝对不是凭空乱想,而且也绝对不是无法证实的,这一重境界是每个IT人都知道的,也许是每个人进入IT界接触的第一个重用方法——消息通信

aha,是不是觉得很简单、很普通、很傻很天真?!!

但是仔细想想,这确实是最高的重用境界,我们将这种方法与DLL方法来比较一下:

1)消息通信和编译无关,DLL和编译相关;

2)消息通信支持分布式部署,DLL不支持分布式部署;

3)消息通信和具体语言无关,C++的程序可以和Java的程序通信;

4)消息通信可以和操作系统无关,DLL和操作系统绑定的;

看起来消息通信这种方式几乎完美了,那我们还要DLL干嘛呢?前面讲了那么多,那不是浪费口水和时间?

当然不是了,消息通信也存在缺点的:

1)要通过某种方式来收发消息,例如TCPSCTPTDM链路;

2)要制定协议来规定收发消息规则和行为规则;

3)要对发送消息和接受消息进行编解码;

 

总结起来就是消息通信是重量级的,DLL是轻量级的。

 

废话说了这么多,我们举一个简单的样例,由于消息通信实现比较复杂,这里就不写代码了,简单的描述一下。

例如系统有ABCD 4个模块,都需要访问数据库,对数据库进行操作,由于对数据库的操作基本上建立连接、执行操作、释放连接,这些操作基本上都是一样的。

如果是DLL实现方式,那么就把建立连接、执行操作、释放连接做成DLL,然后由每个模块去调用DLL的对应函数。

如果是消息通信,按照如下机制实现一个消息通信:

1)新建一个模块E,这个模块完成建立连接、执行操作、释放操作的功能;

2)规定ABCD通过TCP/IPE通信;

3)规定消息格式,例如采用TLV编码,或者二进制编码等

4)规定消息内容,例如:发1标识建立连接、100表示建立连接结果,2表示释放连接,200表示释放连接的结果,等等

 

例子到这里就结束了,是不是觉得很简单,或者意犹未尽?

是的,一旦采用消息通信方式,你可以发挥的余地就很大了,还是上面那个例子,我们可以做很多的优化,例如:

1ABCD不再需要关注建立连接和释放连接了,只需要关注数据操作就ok了;

2E模块可以采用连接池、多线程等技术来提高性能;

3)如果底层数据库修改了,只需要修改E就可以了,ABCD完全不需要任何修改,其实ABCD都不知道底层数据库是Oracle还是DB2.

4E可以用任何编程语言编写,也可以运行在任何操作系统上;

5E进程可以实现双机主备等机制来保证可靠性或者性能;

……………………………………………………

 

总结

好不容易把这个东东讲完了,也算是自己总结归纳了一下,当然,由于才疏学浅,难免出现遗漏和错误,还请大家纠正。

由于篇幅有限,每一篇都写得比较简单,基本上就是把设计思想介绍了一下,实际中应用肯定还有很多问题和细节需要大家去解决,在这里就不一一细讲了(例如第4重境界需要解决多线程的同步问题、第5重境界需要设计好消息格式和消息内容等)。

上一篇:【工具】CodeSmith Generator 7.0.2激活步骤


下一篇:SharpDX之Direct2D教程II——加载位图文件和保存位图文件