Comet连接的维护方法及装置制造方法

文档序号:7996125阅读:151来源:国知局
Comet连接的维护方法及装置制造方法
【专利摘要】本申请公开了Comet连接的维护方法及装置,所述方法包括:系统启动时,创建长度为L的数组,L为整数,等于第一时间长度与第二时间长度的比值,第一时间长度为每个Comet连接维持的时间长度,第二时间长度为检查需要断开的Comet连接的时间间隔;从数组的第0位开始,每隔第二时间长度向前移动一位,并在所述数组的每一位中记录最近第二时间长度内建立的Comet连接;当所述数组移动到第L-1位后,再从数组的第0位开始,每隔第二时间长度向前移动一位,其中,移动到每一位时,将该位中记录的Comet连接断开,并在该位中重新记录最近第二时间长度内建立的Comet连接;循环执行该步骤。通过本申请,能够降低在查找需要断开的Comet连接过程对系统资源的占用。
【专利说明】Comet连接的维护方法及装置
【技术领域】
[0001]本申请涉及长连接【技术领域】,特别是涉及Comet连接的维护方法及装置。
【背景技术】
[0002]传统模式的Web系统以客户端发出请求、服务器端响应的方式工作。这种方式并不能满足很多现实应用的需求,例如,Web网页版的即时通信系统中,当用户甲登录向用户乙发送信息时,就需要服务器能将更新的信息推送给用户乙,而无须用户乙向服务器发出请求。
[0003]“服务器推”是一种很早就存在的技术,以前在实现上主要是通过客户端的套接口,或是服务器端的远程调用。因为浏览器技术的发展比较缓慢,没有为“服务器推”的实现提供很好的支持,在纯浏览器的应用中很难有一个完善的方案去实现“服务器推”并用于商业程序。最近几年,由于 AJAX (Asynchronous JavaScr ipt and XML,异步 JavaScript和XML)技术的普及,以及把IFrame嵌在“htmlfile”的Act iveX组件中可以解决浏览器的加载显示问题,同时“服务器推”在现实应用中确实存在很多需求,基于纯浏览器的“服务器推”技术开始受到较多关注。这种基于HTTP (Hypertext transfer protocol,超文本传输协议)长连接、无须在浏览器端安装插件的“服务器推”技术为“Comet”。目前已经出现了一些成熟的Comet应用以及各种开源框架。
[0004]Comet主要是利用页面向服务器发出请求时,服务器发回响应内容,并利用JavaScript建立一个长时间链接的“长连接”,这个连接在没有接收到服务器或者没有到达连接时间限制时,会一直等待服务器的消息,如果服务器有消息传来,立即显示最新信息。一个长连接每隔一段时间(例如30S)会断开一次,页面在收到断开消息之后,重新向服务器发出连接请求,重新建立Comet连接,不断循环往复。
[0005]在一些大型的应用中,服务器端可能会支撑大量的Comet连接,例如,可能达到20万个,假设每个Comet连接维持的时间为30s,为了将连接断开及建立均匀分配,需要定期(例如每I秒)检查一次有哪些Comet连接的维持时间已经达到30S,并将这些连接断开,然后再根据页面的请求建立新的Comet连接。也就是说,在服务器中会不断的有Comet连接被建立、断开、再建立、再断开,并且每次可能会断开一批Comet连接。
[0006]但是,在现有技术中,一般是采用Map的方式对Comet连接的建立及断开进行管理。所谓Map方式就是指用key-value对的方式,即以用户id作为Map的key,以连接作为Map的value,在页面发起请求的时候,系统将记录用户的id和此连接,用于后续消息推送。而每次在检查有哪些Comet连接需要断开时,都需要遍历整个Map,这将浪费大量的系统资源。

【发明内容】

[0007]本申请提供了 Comet连接的维护方法及装置,能够降低在查找需要断开的Comet连接过程对系统资源的占用。[0008]本申请提供了如下方案:
[0009]一种Comet连接的维护方法,包括:
[0010]系统启动时,创建长度为L的数组,其中,L为整数,等于第一时间长度与第二时间长度的比值,第一时间长度为每个Comet连接维持的时间长度,第二时间长度为检查需要断开的Comet连接并执行断开操作的时间间隔;
[0011]从所述数组的第O位开始,每隔第二时间长度向前移动一位,并在所述数组的每一位中记录最近第二时间长度内建立的Comet连接;
[0012]当所述数组移动到第L-1位后,隔第二时间长度后移动到所述数组的第O位,再从所述数组的第O位开始,每隔第二时间长度向前移动一位,其中,移动到每一位时,将该位中记录的Comet连接断开,并在该位中重新记录最近第二时间长度内建立的Comet连接;循环执行该步骤。
[0013]一种Comet连接的维护装置,包括:
[0014]数组创建单元,用于系统启动时,创建长度为L的数组,其中,L为整数,等于第一时间长度与第二时间长度的比值,第一时间长度为每个Comet连接维持的时间长度,第二时间长度为检查需要断开的Comet连接并执行断开操作的时间间隔;
[0015]数组移动单元,用于从所述数组的第O位开始,每隔第二时间长度向前移动一位,并在所述数组的每一位中记录最近第二时间长度内建立的Comet连接;
[0016]循环单元,用于当所述数组移动到第L-1位后,隔第二时间长度后移动到所述数组的第O位,再从所述数组的第O位开始,每隔第二时间长度向前移动一位,其中,移动到每一位时,将该位中记录的Comet连接断开,并在该位中重新记录最近第二时间长度内建立的Comet连接;循环执行该步骤。
[0017]根据本申请提供的具体实施例,本申请公开了以下技术效果:
[0018]通过本申请,可以在系统启动时创建一个数组,数组的长度由Comet连接持续的时间长度Tl以及每次执行断开操作的时间间隔T2之间的比值来决定,然后就可以从数组的第O位开始,每隔T2移动到数组的下一位,并在每一位中记录最近T2时间段内建立的Comet连接,移动到数组的最后一位之后,再回到第O位,以此循环往复,这样,每移动到数组的一位时,该位中记录的上一状态的数据就是当前时刻需要断开的Comet连接,因此,直接进行断开操作即可。这样,在每次执行断开操作时,就不需要以遍历Map的方式去查找有哪些Comet到期需要断开,因此,大大降低了查找需要断开的Comet连接过程对系统资源的占用。
[0019]针对有消息需要推送时的Comet连接查找需求,可以通过全局的Map来进行查找。
[0020]另外,可以在系统启动时,通过对系统参数的配置,实现垃圾回收调优。
[0021]当然,实施本申请的任一产品并不一定需要同时达到以上所述的所有优点。
【专利附图】

【附图说明】
[0022]为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。[0023]图1是本申请实施例提供的方法的流程图;
[0024]图2是垃圾分代收集中的区域示意图;
[0025]图3是本申请实施例提供的装置的示意图。
【具体实施方式】
[0026]下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本申请保护的范围。
[0027]在本申请实施例中,为了避免在大量Comet连接的情况下,每次查找需要断开的Comet连接时占用过大的系统资源,提供一种新型的Comet连接维护方法,在该方法中,采用timewheeK时间轮)方式,每隔一定时间长度(例如一秒)建立一批连接,同时断开一批连接。在每个Comet连接的持续时间为30秒,每一秒查找进行一次连接的建立与断开的情况下,整个时间轮的刻度可以分为30格,每一秒向逆时针方向移动一格,一直不定地走动。每走到一格时,就将之前在该格处建立的Comet连接确定为此时需要断开的Comet连接,然后进行断开操作,同时,将最近一秒建立的Comet连接记录在该格处,以此循环往复。这样,在每次查找需要断开的Comet连接时,就不需要再遍历整个Map,可以大大节省对系统资源的占用。
[0028]当然,所谓的时间轮的方式是一种形象的说法,下面就对这种方式的具体实现过程进行详细地介绍。
[0029]参见图1,本申请实施例首先提供了一种Comet连接的维护方法,该方法可以包括以下步骤:
[0030]SlOl:系统启动时,创建长度为L的数组,其中,L为整数,等于第一时间长度与第二时间长度的比值,第一时间长度为每个Comet连接维持的时间长度,第二时间长度为检查需要断开的Comet连接并执行断开操作的时间间隔;
[0031]为了实现上述时间轮的方式,在系统启动时,可以创建一个数组,该数组的长度L是由两个时间长度之间的比值来决定的,其中一个时间长度为每个Comet连接持续的时间长度(Tl),例如,Tl = 30秒,另一个时间就是每隔多长时间(T2)查找一次需要断开的Comet连接,例如,T2 = I秒,于是,L = T1/T2 = 30/1 = 30,也就是说,在系统启动时,就可以创建一个长度为30的数组。当然,在Tl及T2为其他的数值时,L的值也会随之变化,并且,由于Tl通常会是T2的整数倍,因此,也可以保证L的值是一个整数。
[0032]需要说明的是,关于Tl及T2的取值,在系统设计阶段就可以设定,因此,在启动系统过程中,就可以根据系统中设定好的Tl及T2的取值,来确定L的取值,进而创建相应长度的数组即可。
[0033]S102:从所述数组的初始位开始,每隔第二时间长度向前移动一位,并在所述数组的每一位中记录最近第二时间长度内建立的Comet连接;
[0034]在系统启动完成之后,就可以从数组的初始位(通常为第O位)开始,每隔第二时间长度将所述数组向前移动一位,并在所述数组的每一位中记录最近第二时间长度内建立的Comet连接。需要说明的是,在数组刚刚创建完成之后的初始状态下,各个位均为空,之后,就可以从数组的第O位Array[0]开始写入数据,由于Array [O]的上一状态是初始状态,因此,可以直接写入数据,写入的数据就是,从O到T2时刻这段时间内建立了哪些Comet连接;经过时间长度T2之后,就可以移动到数组的第I位Array[l],这个时候Array[l]也为空,因此,同样不需要执行断开连接的操作,直接将从T2到2XT2这段时间内创建的Comet连接记录在该位中即可,以此类推。其中,每一位上记录的Comet连接数目可能有很多,因此,在每一位上都可以列表(li s t)的形式记录各个Comet连接。
[0035]S103:当所述数组移动到第L-1位后,隔第二时间长度后移动到所述数组的初始位,再从所述数组的初始位开始,每隔第二时间长度向前移动一位,其中,移动到每一位时,将该位中记录的Comet连接断开,并在该位中重新记录最近第二时间长度内建立的Comet连接;循环执行该步骤。
[0036]按照步骤S102的方式到了数组的第L-1位Array [L_l]之后,再过时间长度T2之后,就又可以回到数组的第O位Array [O],但此时,由于Array [O]的上一状态不再是初始状态,其中可能已经记录了从O到T2时刻创建的Comet连接,并且再次回到第O位时,恰好经历了 T2XL = Tl的时间,也即,该位上记录的上一状态下建立的各个Comet连接恰好就是已经持续了时间长度Tl的Comet连接,也即当前需要断开的连接,因此,直接将该位上记录的各个Comet连接取出,然后执行断开操作,并向相应的页面发出断开消息;与此同时,还可以将最近T2时间段内建立的Comet连接记录在该第O位。然后,经历时间长度T2之后,再移动到数组的第I位,同样,该第I位中记录的上一状态的数据恰好到了需要断开的时候,因此,直接将该位上记录的的各个Comet连接取出,然后执行断开操作,并向相应的页面发出断开消息,以此类推,移动到数组的第L-1位之后,再重新回到数组的第O位,在每一位上都执行相同的操作,以此循环往复。
[0037]可见,在上述实现方式中,可以在系统启动时创建一个数组,数组的长度由Comet连接持续的时间长度Tl以及每次执行断开操作的时间间隔T2之间的比值来决定,然后就可以从数组的第O位开始,每隔T2移动到数组的下一位,并在每一位中记录最近T2时间段内建立的Comet连接,移动到数组的最后一位之后,再回到第O位,以此循环往复,这样,每移动到数组的一位时,该位中记录的上一状态的数据就是当前时刻需要断开的Comet连接,因此,直接进行断开操作即可。这样,在每次执行断开操作时,就不需要以遍历Map的方式去查找有哪些Comet到期需要断开,因此,大大降低了查找Comet连接的过程对系统资源的占用。
[0038]需要说明的是,具体实现时,对Comet连接的维护过程中,除了 Comet连接的建立与断开之外,还包括在需要向指定用户ID的用户推送消息时,对该用户ID对应的Comet连接的查找,以便通过该Comet连接将消息推动到该指定用户ID对应的用户。在本申请实施例中,为了实现这种Comet连接的查找过程,可以采用建立全局的Map的方式,也即,用key-value对的方式记录建立的各个Comet连接,具体的,可以以用户ID作为Map的key,以连接作为Map的value,在页面发起建立Comet连接请求的时候,系统将用户的ID和此连接记录在Map中;这样,当服务器接收到需要发送给某用户ID的消息时,就可以在Map中查找到该用户ID对应的Comet连接,然后通过该Comet连接将该消息推送给用户ID对应的用户。也就是说,在本申请实施例中,仍然可以根据建立的各个Comet连接建立全局的Map,只不过在执行连接的断开操作是,不再依赖于对Map的遍历,而是基于前文所述数组,因此,在该Map中,可以不再保存各个Comet连接建立的时间信息。
[0039]以上所述对本申请实施例提供的“时间轮”的方式实现对Comet连接的维护方法进行了介绍,在实际应用中,由于长连接是一个长期占用内存的一种应用,直到连接中断才会被释放,因此,在支撑大量Comet连接的情况下,还经常会面临另一个问题,就是内存的GC (Garbage Collection,垃圾回收)。每个Comet连接大概消耗5K的内存,20万个Comet连接需要IG的内存,这些内存在Comet连接断开前都是被占用的。这样导致的结果就是Full GC很频繁,且可能会暂停时间很长。为了便于理解,下面首先对GC的相关知识进行简单地介绍。
[0040]Java和C++的区别主要是,Java不需要像c++那样,由程序员主动的释放内存,而是由JVM里的GC在适当的时候来释放内存。JVM GC调整优化的内部工作,即JVM GC的算法有很多种,如:标记清除收集器,压缩收集器,分代收集器等等。现在比较常用的是分代收集,即将内存分为几个区域,将不同生命周期的对象放在不同区域里=Youngarea(年轻代)和Tenuredarea(年老代)。参见图2,所有新生成的对象首先都是放在年轻代的。年轻代一般而言分为三个区,包括一个Eden区和两个Survivor区。大部分对象在Eden区中生成,Survivor的两个区是对称的,没先后关系,所以同一个Survivor区中可能同时存在从Eden复制过来的对象,和从前一个Survivor复制过来的对象,而复制到年老区中的只有从前一个Survivor复制过来的对象,而不包括从Eden复制过来的对象。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。
[0041]新的对象会先生成在年轻代,在几次GC以后,如过没有收集到,就会逐渐升级到年老代。换言之,在年轻代中经历了 N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
[0042]在JVM GC收集的时候,会频繁收集生命周期短的区域,也即年轻代,因为这个区域内的对象生命周期比较短,GC效率也会比较高。而比较少的收集生命周期比较长的区域,也即年老代。
[0043]当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor (from space)区满时,此区的存活对象将被复制到另外一个Survivor区(tospace),当这个 Survivor 区(to space)也满了 的时候,从第一个 Survivor 区(from space)复制过来的并且此时还存活的对象,将被复制年老代,所以年轻代对象到达年老代规则:
[0044](I)经历多次Minor GC仍存活的对象,可通过MaxTenuringThreshold =〈N〉参数来控制;
[0045](2)对象在to space区放不下,就会直接放入年老代。
[0046]—般而言,将年轻代中的垃圾收集称为Minor GC,而年老代中的垃圾收集称为Full GC。因为两者的收集算法不同,所以使用的时间也会不同,在进行GC调优的过程中,需要尽量减少Full GC的次数,同时,期望垃圾回收频率减少,回收中断时间减少,总的开销(overhead)减少。
[0047]另外,GC的执行模式分为串行、并行及并发三种,每种模式具有各自适应的环境。其中,串行方式适用于单CPU、年轻代空间较小及对暂停时间要求不是非常高的应用上,也是客户端级别(CPU核数小于2或物理内存小于2GB)或32位Windows机器上默认采用的GC方式。并行方式适用于多CPU、对暂停时间要求较短的应用上。并行回收GC是服务器级别(CPU核数超过2且物理内存超过2GB)的机器(32位Windows机器除外)上常采用的GC方式。另外,在进行年老代GC时,有些过程是并发进行的。
[0048]综上可见,为了更好的进行GC调优,可以从几方面考虑:为了减少FullGC的次数,需要尽量保证连接内存都在年轻代中能消耗,使其不进入年老代,为此,一方面可以通过扩大年轻代所占比例的大小来实现,另一方面可以扩大MaxTenuringThreshold参数值的大小来实现。另外,还可以选择恰当的GC模式。
[0049]为此,本申请实施例可以在系统启动时,对系统配置参数进行以下配置:配置Java虚拟机的总内存大小,并分配Young区与Tenured区所占的比例,其中,Young区所占的比例大于Tenured区所占的比例,Young区中包括一个Eden区以及两个Survivor区,Eden区、第一 Survivor区(sO)以及第二 Survivor (si)区所占的比例相等。例如,JVM设置了 4G,其中,Tenured区1G,Young区为3G,其中Eden、sO、si各为1G。同时,还可以将Young区大小的类型配置为固定,也即配置好之后不再变化,以确保上述状态的稳定。另外,还可以将MaxTenuringThreshold参数配置为最大值(一般为15),将GC的执行模式配置为并行。
[0050]需要说明的是,Java提供了多种参数,可以通过对对应参数的赋值来实现上述配置的过程。例如,JVM总内存大小定义的参数包括:
[0051 ] -Xmx (最大堆大小)
[0052]-Xms (最小堆大小)
[0053]年轻代大小定义参数:
[0054]-Xmn (年轻代大小)
[0055]-XX =NewRaito (设置年轻代和年老代的比例值)
[0056]-XX:SurvivorRaito (设置年轻代中Eden区与Survivor区的比值,如,此值为4,则Eden为4/6,两个Survivor分别为1/6)
[0057]年轻代的固定类型可以通过-XX:_UseAdaptiveSizePolicy来指定。而并行模式则可以通过-XX:+UseparallelGC或-XX:+UseparalIelOldGC来强制指定,并行的线程数cpucore < = 8 ? cpucore: 3+(cpucore*5)/8 或通过-XX:ParallelGCThreads =〈N〉来强制指定。
[0058]因此,如果需要达到以下目的JVM设置4G的内存,其中,年老区1G,年轻区为3G,其中eden, sO, si各为1G,固定年轻代的大小,MaxTenuringThreshold位最大值,米用并行模式,则可以通过以下方式来配置:
[0059]java -server _Xms4096m _Xmx4096m -Xmn3072m_XX:MaxTenuringThreshold = 15 -XX:SurvivorRat i o = 1-XX:+UseparallelGC-XX:-UseAdapt iveSizePolicy
[0060]与本申请实施例提供的Comet连接的维护方法相对应,本申请实施例还提供了一种Comet连接的维护装置,参见图3,该装置可以包括:
[0061]数组创建单元301,用于系统启动时,创建长度为L的数组,其中,L为整数,等于第一时间长度与第二时间长度的比值,第一时间长度为每个Comet连接维持的时间长度,第二时间长度为检查需要断开的Comet连接并执行断开操作的时间间隔;[0062]数组移动单元302,用于从所述数组的第O位开始,每隔第二时间长度向前移动一位,并在所述数组的每一位中记录最近第二时间长度内建立的Comet连接;
[0063]循环单元303,用于当所述数组移动到第L-1位后,隔第二时间长度后移动到所述数组的第O位,再从所述数组的第O位开始,每隔第二时间长度向前移动一位,其中,移动到每一位时,将该位中记录的Comet连接断开,并在该位中重新记录最近第二时间长度内建立的Comet连接;循环执行该步骤。
[0064]其中,为了在需要进行消息推送时,进行Comet连接的查找,该装置还可以包括:
[0065]Map建立单元,用于根据建立的各个Comet连接建立全局的Map ;
[0066]连接查找单元,用于当有消息需要向指定用户ID的用户推送时,从所述Map中根据所述用户ID查找到相应的Comet连接,并基于该Comet连接进行消息的推送。
[0067]为了进行GC调优,该装置还可以包括:
[0068]参数配置单元,用于在系统启动时,对系统启动参数进行配置,以实现对垃圾回收GC的优化。
[0069]其中,具体实现时,该参数配置单元具体可以用于配置Java虚拟机的总内存大小,并分配Young区与Tenured区所占的比例,其中,Young区所占的比例大于Tenured区所占的比例,Young区中包括一个Eden区以及两个Survivor区,Eden区、第一 Survivor区以及第二 Survivor区所占的比例相等。
[0070]此外,该参数配置单元具体还可以用于将所述Young区大小的类型配置为固定,和/或,将MaxTenuringThreshold参数配置为最大值。最终达到减少Full GC的次数的目的,同时,期望垃圾回收频率减少,回收中断时间减少,overhead减少。
[0071]总之,在本申请实施例中提供的上述装置中,可以在系统启动时创建一个数组,数组的长度由Comet连接持续的时间长度Tl以及每次执行断开操作的时间间隔T2之间的比值来决定,然后就可以从数组的第O位开始,每隔T2移动到数组的下一位,并在每一位中记录最近T2时间段内建立的Comet连接,移动到数组的最后一位之后,再回到第O位,以此循环往复,这样,每移动到数组的一位时,该位中记录的上一状态的数据就是当前时刻需要断开的Comet连接,因此,直接进行断开操作即可。这样,在每次执行断开操作时,就不需要以遍历Map的方式去查找有哪些Comet到期需要断开,因此,大大降低了查找Comet连接的过程对系统资源的占用。
[0072]通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如R0M/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
[0073]本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的系统及系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
[0074]以上对本申请所提供的Comet连接的维护方法及装置,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在【具体实施方式】及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本申请的限制。
【权利要求】
1.一种Comet连接的维护方法,其特征在于,包括: 系统启动时,创建长度为L的数组,其中,L为整数,等于第一时间长度与第二时间长度的比值,第一时间长度为每个Comet连接维持的时间长度,第二时间长度为检查需要断开的Comet连接并执行断开操作的时间间隔; 从所述数组的初始位开始,每隔第二时间长度向前移动一位,并在所述数组的每一位中记录最近第二时间长度内建立的Comet连接; 当所述数组移动到第L-1位后,隔第二时间长度后移动到所述数组的初始位,再从所述数组的初始位开始,每隔第二时间长度向前移动一位,其中,移动到每一位时,将该位中记录的Comet连接断开,并在该位中重新记录最近第二时间长度内建立的Comet连接;循环执行该步骤。
2.根据权利要求1所述的方法,其特征在于,还包括: 根据建立的各个Comet连接建立全局的Map ; 当有消息需要向指定用户ID的用户推送时,从所述Map中根据所述用户ID查找到相应的Comet连接,并基于该Comet连接进行消息的推送。
3.根据权利要求1或2所述的方法,其特征在于,还包括: 在系统启动时,对系统启动参数进行配置,以实现对垃圾回收GC的优化。
4.根据权利要求3所述的方法,其特征在于,所述对系统启动参数进行配置包括: 配置Java虚拟机的总内存大小,并分配Young区与Tenured区所占的比例,其中,Young区所占的比例大于Tenured区所占的比例,Young区中包括一个Eden区以及两个Survivor区,Eden区、第一 Survivor区以及第二 Survivor区所占的比例相等。
5.根据权利要求4所述的方法,其特征在于,所述对系统启动参数进行配置还包括: 将所述Young区大小的类型配置为固定。
6.根据权利要求4或5所述的方法,其特征在于,所述对系统启动参数进行配置还包括: 将MaxTenuringThreshold参数配置为最大值。
7.根据权利要求4、5或6所述的方法,其特征在于,所述对系统启动参数进行配置还包括: 将GC的执行模式配置为并行。
8.一种Comet连接的维护装置,其特征在于,包括: 数组创建单元,用于系统启动时,创建长度为L的数组,其中,L为整数,等于第一时间长度与第二时间长度的比值,第一时间长度为每个Comet连接维持的时间长度,第二时间长度为检查需要断开的Comet连接并执行断开操作的时间间隔; 数组移动单元,用于从所述数组的第O位开始,每隔第二时间长度向前移动一位,并在所述数组的每一位中记录最近第二时间长度内建立的Comet连接; 循环单元,用于当所述数组移动到第L-1位后,隔第二时间长度后移动到所述数组的第O位,再从所述数组的第O位开始,每隔第二时间长度向前移动一位,其中,移动到每一位时,将该位中记录的Comet连接断开,并在该位中重新记录最近第二时间长度内建立的Comet连接;循环执行该步骤。
9.根据权利要求8所述的装置,其特征在于,还包括:Map建立单元,用于根据建立的各个Comet连接建立全局的Map ; 连接查找单元,用于当有消息需要向指定用户ID的用户推送时,从所述Map中根据所述用户ID查找到相应的Comet连接,并基于该Comet连接进行消息的推送。
10.根据权利要求8或9所述的装置,其特征在于,还包括: 参数配置单元,用于在系统启动时,对系统启动参数进行配置,以实现对垃圾回收GC的优化。
【文档编号】H04L12/24GK103973469SQ201310036458
【公开日】2014年8月6日 申请日期:2013年1月30日 优先权日:2013年1月30日
【发明者】张乐伟 申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1