在大系统应用中,系统会拆分为多个子系统来实现,尤其是分布式应用。在具体实现过程中,子系统间的通讯尤为重要。目前主要有两种典型的方法:
一、基于消息实现
系统之间通讯时,向外发送消息形式可以是字节流、字节数组、甚至是对象;系统接收到相关的消息后进行相应的业务处理。
消息通信基于网络协议实现,常用的协议有TCP/IP、UDP/IP。
TCP/IP是一种可靠的网络数据传输协议,其是有连接传输,具有可靠性,包括数据的可达、和顺序,但因为其保证连接和数据传输的可靠,性能会有降低。
UDP/IP是一种无连接的数据传输协议,其是将数据发送至网络上进行传递,不需要建立连接,可靠性差,但性能相对较强。
在系统完成数据传输后,需要对数据进行处理(读写操作):
按照POSIX分为异步IO、和同步IO,其中同步IO常用BIO、NIO;
BIO是当发起IO操作时,线程阻塞,直到程序将流读到或写完成,释放资源;
NIO是基于事件驱动思想的,当发起IO操作时,线程非阻塞,当Socket有留可读或写时,操作系统会通知相应的应用处理,将流读或写入缓冲区或操作系统。
AIO则是异步IO,其也是基于事件驱动,当当发起IO操作时,操作系统会将流读或写入read和write缓冲区中,然后通知应用,使用时只需调用API-read、write即可,等于流的读写由操作系统代替。
优点是:
1、简化程序的编写;
2、省去了NIO中对通知队列的遍历;
二、基于远程调用
系统通过调用本地java方法接口,透明的远程实现。实现通常基于RMI、WeService。
基于java自身包实现消息通讯TCP/IP+BIO、TCP/IP+NIO、UDP/IP+BIO、UDP/IP+BIO简述
TCP/IP+BIO:
基于Socket、ServerSocket、实现,在多请求、多响应情况下,
客户端常用连接池维护scoket,优点:
1、限制了Socket个数
2、避免了重复建立Socket引起的性能问题
缺点:
1、造成请求竞争和等待
注:超时设置
服务器端通常采用一连接一线程,accept接收到socket后,将其放入线程中处理。易导致服务器资源不足。
TCP/IP+NIO:
在多请求、多响应情况下,
客户端与BIO一致,但其为非阻塞,当服务器响应带上请求标识,客户端可采用连接复用;
服务器端采用一个线程监听连接,一个或多个监听网络IO,当存在实际IO时,将Socket放入线程。
UDP/IP:
因为是无连接,无法进行双向通信,两端都为UDP Server。
因为其无连接,无连接竞争问题,只需读写同步。
服务器端每接收一个packet就放入线程处理。
基于UDP/IP的多播协议:(数据网络传播)
商业需求-确保可靠实现多播的方式:SRM,在UDP/IP多播的基础上增加了确认机制。