基于nio和io的面向发布订阅系统的传输协议

基于nio和io的面向发布订阅系统的传输协议

ID:19282558

大小:518.00 KB

页数:8页

时间:2018-09-30

基于nio和io的面向发布订阅系统的传输协议_第1页
基于nio和io的面向发布订阅系统的传输协议_第2页
基于nio和io的面向发布订阅系统的传输协议_第3页
基于nio和io的面向发布订阅系统的传输协议_第4页
基于nio和io的面向发布订阅系统的传输协议_第5页
资源描述:

《基于nio和io的面向发布订阅系统的传输协议》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、基于NIO和IO的面向发布/订阅系统的数据传输协议1.技术领域本发明是属于基于NIO和IO的面向发布/订阅系统的数据传输协议。2.背景技术发布/订阅(publish/subscribe,简称pub/sub)系统是一种分布式中间件系统,是随着复杂大规模的网络计算而出现的一种技术,用于为分布式系统中的各参与者提供一种松耦合的通信方式。在大规模、高度动态的分布式系统中,参与者在时间以及空间位置上通常都是动态变化的,比如在出差途中使用掌上电脑等移动设备,频繁的加入和退出网络,因此需要一种松耦合的方式参与消息交互和协同工作。而发布/订阅系统的

2、松耦合的特性,恰能解决这个问题。如图1所示,一个发布/订阅系统中一般由消息生产者(publisher)、消息消费者(subscriber)和事件通知服务组成。在发布/订阅系统中,消息通常被称为“事件”,消息生产者将“事件”发送给事件通知服务;消息消费者则向事件通知服务发出一个“订阅条件”,表示对系统的哪些事件感兴趣;而事件通知服务则保证将发布的事件及时、可靠地送给所有感兴趣的消息消费者。而发布者和消费者在进行消息交互时,都不需要知道对方的存在,使得它们在时间和空间被完全解耦,从而能够满足大规模、动态的分布式系统的需要。而在传统的发布

3、/订阅系统中,事件的生产者和消费者之间的传输多采用基于java的老式IO(输入/输出)方式。在这种方式中,服务端将在开始时建立一个监听socket(套接字),socket是主要用来进行客户端和服务器端通讯的工具,当简历一个监听socket后,就等待客户端请求,客户连接后,产生会话,会话完成后,关闭连接;而客户端通过socket对服务端发出连接请求,一旦连接成功,打开会话,会话完成,关闭socket。在这种传输系统中,系统的瓶颈通常在IO读写方面,在打开一个IO通道后,read()方法将一直等待在端口一边读取字节内容,如果没有内容进来

4、,read()也是一直等待,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的,尤其是在大规模分布式系统中,如果我们要接受大量的客户端的连接,必须要开设大量的线程,而这将是对资源的严重浪费。8而基于java的NIO(newIO)的出现,则改变了这种现状,使网络传输的协议不再集中在IO读写上。NIO最大的特点有两个:一个是块状读写;另外一个是多路复用技术(multiplex)。第一个特点改变了老式IO中,每次读写只有一个字节(stream)或两个字节(reader)的方式,提高了读写的

5、速度;第二个特点改变了原来读写socket时候阻塞的同步状况,使socket的读写具有异步的功能。JavaNIO非阻塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察IO端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的IO读写,不堵塞了。NIO有一个主要的类Selector,这个类就好像一个观察者,只要我们把需要探知的socketchannel(套接字通道)告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我

6、们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,放心,包准能够读到,接着我们可以处理这些数据。在我们使用NIO的时候,cpu时间多会消耗在Selector的select操作上(NIO的多路复用),而select操作主要调用的是poll函数,这个操作是一个轮询socket的同步操作,它的主要功能就是不断地去查询向该选择器注册的socket,看看有没有可做的操作,如有,则返回,没有,继续不断地轮询。也就说,分配的cpu的时间基本上被消耗在poll上了。之所以如此,是因为没有

7、东西可以写入或从socket中读取;那么,就应该给“提供读写数据的线程”更多的cpu时间,使得每一次的poll都有可作的操作,使时间耗费在读写socket之上,而不是poll之上。然而,从实际情况中看来,poll线程显然比“提供读写数据的线程(wr线程)”占用了更多的cpu时间,假设他们的优先级相同,也假设操作系统是公平的分配cpu时间,那么它们得到的cpu时间应该是一样的,此时,造成它们占用cpu时间不同的原因就很可能是这样:在相同的时间内,wr线程提供的数据量根本不够poll线程处理,poll线程处理在相同的时间内处理这些数据绰

8、绰有余,那么,poll线程更多的时间就耗费在轮询上了。到这里,我们假设的是这两个线程分配到了相同的时间,所以,即使poll线程大部分时间是在做poll轮询操作,那么所占用的时间最大值也是有限的,不会超过线程分配得到的时间。但是,如果此

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。