读写均衡的阻塞队列实现方法及装置制造方法
【专利摘要】本发明公开了一种读写均衡的阻塞队列实现方法及装置,涉及计算机软件编程领域,该方法包括以下步骤:向队列中添加N条数据,尝试获取队列的同步锁;确定同步的阻塞队列是否能增加N条数据,若增加N条数据后,队列超出最大设置范围,则继续等待,直到队列允许添加N条记录;若N超过队列最大长度,则队列抛出异常;将N条数据添加到同步的阻塞队列后,添加数据步骤完成,释放队列的同步锁;继续增加或放弃增加,完成添加步骤;放弃继续添加,添加流程结束。本发明能有效缓解突发性、非连续性、非定量性大批量数据处理压力,简化数据队列调用逻辑,去除通用多线程轮询数据的风险,提高应用程序处理突发性大数据量的稳定性。
【专利说明】读写均衡的阻塞队列实现方法及装置
【技术领域】
[0001]本发明涉及计算机软件编程领域,具体是涉及一种读写均衡的阻塞队列实现方法及装置。
【背景技术】
[0002]随着软件行业的发展,越来越多的大数据量、高并发的软件系统产生,随着数据量的增加,越来越多的性能压力逼近,怎么才能在有限的硬件资源情况下,来更高效率的、更平滑的处理软件系统数据呢?
[0003]目前行业中最常用的方法是通过增加服务器,分布式集群部署来缓解服务软件处理压力,这样从硬件层面上解决了问题,但是对软件的经济费用投入就有大幅度增加,且增加集群后数据的同步安全性压力也相对增加。怎么在有限的资源下,尽可能处理更多的事情,并保证系统的稳定性不因数据量的增加而下降,这是一个亟待解决的问题。
【发明内容】
[0004]本发明的目的是为了克服上述【背景技术】的不足,提供一种读写均衡的阻塞队列实现方法及装置,能够有效缓解突发性、非连续性、非定量性大批量数据处理压力,简化数据队列调用逻辑,去除通用多线程轮询数据的风险,显著提高应用程序处理突发性大数据量的稳定性。
[0005]本发明提供一种读写均衡的阻塞队列实现方法,包括以下步骤:
[0006]A、向同步的阻塞队列添加数据:
[0007]步骤IO1、程序向同步的阻塞队列中添加N条数据,N为正整数;
[0008]步骤102、在多线程情况下,尝试获取队列的同步锁;
[0009]步骤103、获取队列的同步锁后,在向同步的阻塞队列添加数据之前,确定同步的阻塞队列是否能增加N条数据,如果增加N条数据后,队列超出最大设置范围,则继续等待,直到队列允许添加N条记录;如果N超过队列最大长度,则队列抛出异常;
[0010]步骤104、将N条数据添加到同步的阻塞队列后,添加数据步骤完成,释放队列的同步锁,保证该队列能被其他线程调用;
[0011]步骤105、程序继续增加、循环添加;或者放弃增加,完成添加步骤;
[0012]步骤106、程序放弃继续添加,添加流程结束;
[0013]B、从同步的阻塞队列读取数据:
[0014]步骤201、程序向同步的阻塞队列读取数据;
[0015]步骤202、在多线程情况下,尝试获取队列的同步锁;
[0016]步骤203、获取队列的同步锁后,如果同步的阻塞队列中的数据为空,那么表示没有数据,继续等待以获取数据入口,直到同步的阻塞队列中依照步骤A添加数据;
[0017]步骤204、在同步的阻塞队列有数据的情况下,从该队列中一次性获取“最大数目”条数据,所述“最大数目”是队列定义的参数:一次性批量获取的最大数据条目数;如果队列中数据少于“最大数目”条,则返回队列所有的数据,锁条件等待最小粒度时间“最小时间间隔”毫秒,再释放队列的同步锁;所述“最小时间间隔”是队列定义的参数:在队列非堵塞的情况下,两次获取数据之间的最小时间间隔;如果超过“最大数目”条数据,则返回“最大数目”条数据,锁条件等待“平均时间间隔”,再释放队列的同步锁;所述“平均时间间隔”是队列定义的参数:在队列数据拥堵的情况下,两次获取数据之间的平均时间间隔;
[0018]步骤205、程序继续读取数据,或者放弃读取,完成读取步骤;
[0019]步骤206、程序放弃继续读取,读取流程结束;
[0020]步骤A在步骤B之前或者之后。
[0021]本发明还提供一种应用上述方法的读写均衡的阻塞队列实现装置,包括添加单元和读取单元,其中:
[0022]所述添加单元,用于:向同步的阻塞队列添加数据:
[0023]向同步的阻塞队列中添加N条数据,N为正整数;在多线程情况下,尝试获取队列的同步锁;获取队列的同步锁后,在向同步的阻塞队列添加数据之前,确定同步的阻塞队列是否能增加N条数据,如果增加N条数据后,队列超出最大设置范围,则继续等待,直到队列允许添加N条记录;如果N超过队列最大长度,则队列抛出异常;
[0024]将N条数据添加到同步的阻塞队列后,添加数据步骤完成,释放队列的同步锁,保证该队列能被其他线程调用;程序继续增加、循环添加,或者放弃增加,完成添加;程序放弃继续添加,添加结束;
[0025]所述读取单元,用于:从同步的阻塞队列读取数据:
[0026]向同步的阻塞队列读取数据;在多线程情况下,尝试获取队列的同步锁;获取队列的同步锁后,如果同步的阻塞队列中的数据为空,那么表示没有数据,继续等待以获取数据入口,直到同步的阻塞队列中依照添加单元添加数据;
[0027]在同步的阻塞队列有数据的情况下,从该队列中一次性获取“最大数目”条数据,所述“最大数目”是队列定义的参数:一次性批量获取的最大数据条目数;如果队列中数据少于“最大数目”条,则返回队列所有的数据,锁条件等待最小粒度时间“最小时间间隔”毫秒,再释放队列的同步锁;所述“最小时间间隔”是队列定义的参数:在队列非堵塞的情况下,两次获取数据之间的最小时间间隔;如果超过“最大数目”条数据,则返回“最大数目”条数据,锁条件等待“平均时间间隔”,再释放队列的同步锁,所述“平均时间间隔”是队列定义的参数:在队列数据拥堵的情况下,两次获取数据之间的平均时间间隔;继续读取数据;或者放弃读取,完成读取;放弃继续读取,读取结束。
[0028]与现有技术相比,本发明的优点如下:
[0029](I)本发明通过异步消息队列排队处理,降低大数据量的突然来临所带来的压力,能够有效缓解突发性、非连续性、非定量性大批量数据处理压力。
[0030](2)本发明通过批量的添加、读取数据入口,来满足数据量多的情况下分拆处理,数据量小的情况下汇总处理,有效增加数据处理的平滑度。
[0031](3)本发明通过同步锁和锁条件,来替代通用的轮询、线程等待等实现方案,能够有效节约程序资源。
[0032](4)本发明能够简化数据队列调用逻辑,去除通用多线程轮询数据的风险,显著提高应用程序处理突发性大数据量的稳定性。【专利附图】
【附图说明】
[0033]图1是本发明实施例中向队列添加数据的流程图。
[0034]图2是本发明实施例中从队列读取数据的流程图。
【具体实施方式】
[0035]下面结合附图及具体实施例对本发明作进一步的详细描述。
[0036]本发明实施例提供一种读写均衡的阻塞队列实现方法,包括以下步骤:
[0037]A、参见图1所示,向同步的阻塞队列添加数据:
[0038]步骤IO1、程序向同步的阻塞队列中添加N条数据,N为正整数;
[0039]步骤102、在多线程情况下,为了保证数据的完整性和正确性,尝试获取队列的同步锁;
[0040]步骤103、获取队列的同步锁后,在向同步的阻塞队列添加数据之前需要确定同步的阻塞队列是否能增加N条数据,如果增加N条数据后,队列超出最大设置范围,则程序会运行异常,所以需要继续等待,直到队列允许添加N条记录;如果N超过队列最大长度,则永远无法添加到队列当中,队列会抛出异常;
[0041]步骤104、将N条数据添加到同步的阻塞队列后,添加数据步骤完成,释放队列的同步锁,保证该队列能被其他线程调用;
[0042]步骤105、程序可以继续增加,循环添加;也可以放弃增加,完成添加步骤;
[0043]步骤106、程序放弃继续添加,添加流程结束。
[0044]B、参见图2所示,从同步的阻塞队列读取数据:
[0045]步骤201、程序向同步的阻塞队列读取数据;
[0046]步骤202、在多线程情况下,为了保证数据的完整性和正确性,尝试获取队列的同步锁;
[0047]步骤203、获取队列的同步锁后,如果同步的阻塞队列中的数据为空,那么表示没有数据,继续等待以获取数据入口,直到同步的阻塞队列中依照步骤A添加数据;
[0048]步骤204、在同步的阻塞队列有数据的情况下,从该队列中一次性获取“最大数目”(队列定义的参数:一次性批量获取的最大数据条目数)条数据,如果队列中数据少于“最大数目”条,则返回队列所有的数据,锁条件等待最小粒度时间“最小时间间隔”(队列定义的参数:在队列非堵塞的情况下,两次获取数据之间的最小时间间隔)毫秒,再释放队列的同步锁;如果超过“最大数目”条数据,则返回“最大数目”条数据,锁条件等待“平均时间间隔”(队列定义的参数:在队列数据拥堵的情况下,两次获取数据之间的平均时间间隔),再释放队列的同步锁。
[0049]步骤205、程序可以继续读取数据;也可以放弃读取,完成读取步骤;
[0050]步骤206、程序放弃继续读取,读取流程结束。
[0051]阻塞队列不区分添加和获取步骤的先后,即步骤A在前或在后都可以。
[0052]本发明实施例还提供一种应用上述方法的读写均衡的阻塞队列实现装置,包括添加单元和读取单元,其中:
[0053]添加单元,用于:向同步的阻塞队列添加数据:[0054]向同步的阻塞队列中添加N条数据,N为正整数;在多线程情况下,为了保证数据的完整性和正确性,尝试获取队列的同步锁;
[0055]获取队列的同步锁后,在向同步的阻塞队列添加数据之前需要确定同步的阻塞队列是否能增加N条数据,如果增加N条数据后,队列超出最大设置范围,则程序会运行异常,所以需要继续等待,直到队列允许添加N条记录;如果N超过队列最大长度,则永远无法添加到队列当中,队列会抛出异常;
[0056]将N条数据添加到同步的阻塞队列后,添加数据步骤完成,释放队列的同步锁,保证该队列能被其他线程调用;程序可以继续增加,循环添加;也可以放弃增加,完成添加;程序放弃继续添加,添加结束。
[0057]读取单元,用于:从同步的阻塞队列读取数据:
[0058]向同步的阻塞队列读取数据;在多线程情况下,为了保证数据的完整性和正确性,尝试获取队列的同步锁;获取队列的同步锁后,如果同步的阻塞队列中的数据为空,那么表示没有数据,获取数据入口需要继续等待,直到同步的阻塞队列中依照添加单元添加数据;
[0059]在同步的阻塞队列有数据的情况下,从该队列中一次性获取“最大数目”(队列定义的参数:一次性批量获取的最大数据条目数)条数据,如果队列中数据少于“最大数目”条,则返回队列所有的数据,锁条件等待最小粒度时间“最小时间间隔”(队列定义的参数:在队列非堵塞的情况下,两次获取数据之间的最小时间间隔)毫秒,再释放队列的同步锁;如果超过“最大数目”条数据,则返回“最大数目”条数据,锁条件等待“平均时间间隔”(队列定义的参数:在队列数据拥堵的情况下,两次获取数据之间的平均时间间隔),再释放队列的同步锁;可以继续读取数据;也可以放弃读取,完成读取;放弃继续读取,读取结束。
[0060]本发明实施例的原理详细阐述如下:
[0061]本发明实施例中涉及到一个同步的阻塞队列,一个全局同步对象锁和保证锁的三个预置条件,其中:
[0062]同步的阻塞队列,用来存储数据和读取数据;
[0063]一个全局同步对象锁,用来保证沙漏队列的添加、删除、获取的线程安全性;
[0064]三个预置条件分别为:数据为非空预置条件、数据为未满预置条件和锁延迟预置条件,只有在三个预置条件都满足的情况下,锁才会释放。
[0065]本发明实施例中读写均衡的阻塞队列的具体实现过程为:
[0066]将队列独立封装成一个对象类,其属性包含了一个队列、一个同步锁、三个锁条件,在类中定义添加方法和获取移除方法,分别表示添加数据入口和获取数据入口。
[0067]增加数据入口过程为:数据进入方法之前,先进行数据合法校验,数据异常则提示异常信息,数据合法则开始获取队列的同步锁;待获取到队列的同步锁以后,如果数据的长度超出了队列的最大长度限制,直接提示异常,如果没有,继续检测队列是否有足够的空间进行数据添加,如果没有足够的空间,则等待队列的同步锁的“未满预置条件”,并继续判断,直到可添加的时候进行添加为止;最后等到可以添加数据的条件满足,即添加数据,将队列的同步锁的“非空预置条件”置为可用,并释放队列的同步锁。
[0068]读取数据入口过程为:进入读取数据方法之前,首先获取队列的同步锁;待获取队列的同步锁后,查看队列里是否有数据,如果队列数据为空则继续等待,开启“非空预置条件”为不可用,直到“非空预置条件”可用为止,开始从队列中获取数据,获取数据之前,首先辨别队列的剩余数据结构,如果超出预定义的每次获取最大条目数,则分批进行,一次获取最大条目数,然后设定间隔时间等待;如果在预定义的最大条目数以内,则直接返回当前队列中的数据;获取数据完的同时,从队列中移除已读取的数据,开启“未满预置条件”,并释放锁,允许其他进程进行添加或获取移除操作。原则上沙漏队列是一个阻塞队列,常驻内存中,用户决定退出的时候需要调用队列销毁方法,来达到资源销毁目的。
[0069]本发明实施例的队列中数据的保存遵循最大容量限制,在最大容量范围许可内,可由多个线程进行添加数据操作。队列中数据获取遵循:(I)没有数据的时候,队列阻塞等待;(2)有数据即快速处理,不进行拖延;(3)突发性大数据量的情况下,队列按照既定时间间隔有序的批量处理。
[0070]本发明实施例的原理类似于沙漏滴沙,当沙漏里面的沙子充足时,沙子会受控于沙漏细小出口这个瓶颈,沙子必须依次有序的流下;当沙子比较少的时候,能立即从沙漏中通过,这样对于沙漏的出口来说,其流出的沙子永远是在瓶颈的可控范围内。
[0071]在通用大型软件系统中,当数据量比较大时,具有突发性、阶段性等情况,往往服务器无法承载处理压力,导致系统崩溃,业界通用方案有两类:添加处理能力或排队,沙漏队列正是一种排队的线性优化解决方案,其遵循:当数据拥堵的情况下,添加数据的线程在队列上阻塞等待,消费数据的线程在可控压力范围内有序消费;在数据量正常的情况下,有数据即消费;在数据不存在的情况下,队列阻塞,减少线程压力。
[0072]本发明能够有效缓解突发性、非连续性、非定量性大批量数据处理压力,简化数据队列调用逻辑,去除通用多线程轮询数据的风险,显著提高应用程序处理突发性大数据量的稳定性。
[0073]本领域的技术人员可以对本发明实施例进行各种修改和变型,倘若这些修改和变型在本发明权利要求及其等同技术的范围之内,则这些修改和变型也在本发明的保护范围之内。
[0074]说明书中未详细描述的内容为本领域技术人员公知的现有技术。
【权利要求】
1.一种读写均衡的阻塞队列实现方法,其特征在于,包括以下步骤: A、向同步的阻塞队列添加数据: 步骤101、程序向同步的阻塞队列中添加N条数据,N为正整数; 步骤102、在多线程情况下,尝试获取队列的同步锁; 步骤103、获取队列的同步锁后,在向同步的阻塞队列添加数据之前,确定同步的阻塞队列是否能增加N条数据,如果增加N条数据后,队列超出最大设置范围,则继续等待,直到队列允许添加N条记录;如果N超过队列最大长度,则队列抛出异常; 步骤104、将N条数据添加到同步的阻塞队列后,添加数据步骤完成,释放队列的同步锁,保证该队列能被其他线程调用; 步骤105、程序继续增加、循环添加;或者放弃增加,完成添加步骤; 步骤106、程序放弃继续添加,添加流程结束; B、从同步的阻塞队列读取数据: 步骤201、程序向同步的阻塞队列读取数据; 步骤202、在多线程情况下,尝试获取队列的同步锁; 步骤203、获取队列的同步锁后,如果同步的阻塞队列中的数据为空,那么表示没有数据,继续等待以获取数据入口,直到同步的阻塞队列中依照步骤A添加数据; 步骤204、在同步的阻塞队列有数据的情况下,从该队列中一次性获取“最大数目”条数据,所述“最大数目”是队列定义的参数:一次性批量获取的最大数据条目数;如果队列中数据少于“最大数目”条,则返回队列所有的数据,锁条件等待最小粒度时间“最小时间间隔”毫秒,再释放队列的同步锁;所述“最小时间间隔”是队列定义的参数:在队列非堵塞的情况下,两次获取数据之间的最小时间间隔;如果超过“最大数目”条数据,则返回“最大数目”条数据,锁条件等待“平均时间间隔”,再释放队列的同步锁;所述“平均时间间隔”是队列定义的参数:在队列数据拥堵的情况下,两次获取数据之间的平均时间间隔; 步骤205、程序继续读取数据,或者放弃读取,完成读取步骤; 步骤206、程序放弃继续读取,读取流程结束; 步骤A在步骤B之前或者之后。
2.一种应用权利要求1所述方法的读写均衡的阻塞队列实现装置,其特征在于:包括添加单元和读取单元,其中: 所述添加单元,用于:向同步的阻塞队列添加数据: 向同步的阻塞队列中添加N条数据,N为正整数;在多线程情况下,尝试获取队列的同步锁;获取队列的同步锁后,在向同步的阻塞队列添加数据之前,确定同步的阻塞队列是否能增加N条数据,如果增加N条数据后,队列超出最大设置范围,则继续等待,直到队列允许添加N条记录;如果N超过队列最大长度,则队列抛出异常; 将N条数据添加到同步的阻塞队列后,添加数据步骤完成,释放队列的同步锁,保证该队列能被其他线程调用;程序继续增加、循环添加,或者放弃增加,完成添加;程序放弃继续添加,添加结束; 所述读取单元,用于:从同步的阻塞队列读取数据: 向同步的阻塞队列读取数据;在多线程情况下,尝试获取队列的同步锁;获取队列的同步锁后,如果同步的阻塞队列中的数据为空,那么表示没有数据,继续等待以获取数据入口,直到同步的阻塞队列中依照添加单元添加数据; 在同步的阻塞队列有数据的情况下,从该队列中一次性获取“最大数目”条数据,所述“最大数目”是队列定义的参数:一次性批量获取的最大数据条目数;如果队列中数据少于“最大数目”条,则返回队列所有的数据,锁条件等待最小粒度时间“最小时间间隔”毫秒,再释放队列的同步锁;所述“最小时间间隔”是队列定义的参数:在队列非堵塞的情况下,两次获取数据之间的最小时间间隔;如果超过“最大数目”条数据,则返回“最大数目”条数据,锁条件等待“平均时间间隔”,再释放队列的同步锁,所述“平均时间间隔”是队列定义的参数:在队列数据拥堵 的情况下,两次获取数据之间的平均时间间隔;继续读取数据;或者放弃读取,完成读取;放弃继续读取,读取结束。
【文档编号】G06F9/46GK103970597SQ201410168357
【公开日】2014年8月6日 申请日期:2014年4月24日 优先权日:2014年4月24日
【发明者】刘言军 申请人:烽火通信科技股份有限公司