本发明涉及计算机技术领域,尤其涉及一种数据限流的方法和装置。
背景技术:
随着信息技术的快速发展,网络用户越来越多,突发流量对网络的冲击也变得越来越严峻。目前互联网上普遍使用限流技术来控制网络接口收发通信数据的速率,以用来优化系统性能,减少延迟和提高带宽等。常用的限流技术大部分是基于令牌桶算法(tokenbucket)和/或漏桶算法(leakybucket)这两种限流算法来实现的。
漏桶算法:它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。
令牌桶算法:它用来控制发送到网络上的数据的数目,并允许突发数据的发送。它的原理是系统会以一个恒定的速度往桶里放入令牌,而如果有数据需要被传输,则需要先从桶里获取令牌,当桶里没有足够的令牌可取时,则拒绝服务。令牌桶算法可以方便的改变数据传输的速率,一旦需要提高速率,则按需提高向桶中放入令牌的速率即可。一般会定时(比如100毫秒)向桶中增加一定数量的令牌,但有些变种算法(如:申请号为03109091.5的专利“采用令牌漏桶进行报文限流的方法”)则可实时的计算应该增加的令牌的数量。该专利提供了一种动态计算可用令牌数的方法,相比其它定时增加令牌的方法,它在收到一个报文后,根据该报文与前一报文的时间间隔计算应向令牌漏桶内注入的令牌数,并判断注入令牌后桶内的令牌数是否满足传送该报文的要求。此专利在一定程度上克服了令牌桶不能实时评估网络软件系统内部的资源利用率的缺陷,但它是基于当前报文与前一段报文的时间间隔来计算向桶中增加的令牌的数量的,故不能准确的反应后续系统的实际处理能力和资源状态。
在实现本发明过程中,发明人发现现有技术中至少存在如下问题:
1、在某些情况下,漏桶算法不能够有效地使用网络资源。因为漏桶的漏出速率是固定的参数,所以,即使网络中不存在资源冲突(没有发生拥塞),漏桶算法也不能使某一个单独的数据流突发到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率;
2、现有的令牌桶算法或者基于令牌桶算法的变种算法等限流方法均是通过外部预测的方法来实现限流,并不能准确反映系统内部的实时处理能力和资源使用状态,故而无法充分利用系统的处理能力以及资源来进行合理限流。
技术实现要素:
有鉴于此,本发明实施例提供一种数据限流的方法和装置,能够根据系统的实时处理能力以及资源使用状态来进行限流,可以更准确地提高或优化系统性能和更合理地进行数据限流,且具有实时、高效、动态等优点。
为实现上述目的,根据本发明实施例的一个方面,提供了一种数据限流的方法。
一种数据限流的方法,包括:将待处理数据保存到环数据结构中,所述环数据结构包括一个用于保存待处理数据的数组,一个指向当前可写入数据的位置的写指针和一个指向当前可读取数据的位置的读指针;分别获取所述写指针与所述读指针的当前位置的逻辑值,并计算所述写指针与所述读指针的当前位置的逻辑差值;根据所述逻辑差值进行数据限流。
可选地,所述数组的大小是根据系统的极限处理能力确定的。
可选地,当向所述环数据结构中写入数据时,将数据写入所述写指针当前指向的位置,然后,将所述写指针指向的位置更新为下一个可写入数据的位置;当从所述环数据结构中读取数据时,根据所述读指针当前指向的位置读取数据,然后,将所述读指针指向的位置更新为下一个可读取数据的位置。
可选地,所述写指针和所述读指针按照相同的方向前进,且所述写指针不指向保存有未读取数据的位置,所述读指针不超越所述写指针。
可选地,根据所述逻辑差值进行数据限流的步骤包括:当所述逻辑差值大于预设的第一阈值时,降低限流速率和/或提高系统业务处理速率;当所述逻辑差值小于预设的第二阈值时,提高限流速率和/或降低系统业务处理速率;其中,所述第一阈值大于所述第二阈值。
根据本发明实施例的另一方面,提供了一种数据限流的装置。
一种数据限流的装置,包括:数据保存模块,用于将待处理数据保存到环数据结构中,所述环数据结构包括一个用于保存待处理数据的数组,一个指向当前可写入数据的位置的写指针和一个指向当前可读取数据的位置的读指针;逻辑运算模块,用于分别获取所述写指针与所述读指针的当前位置的逻辑值,并计算所述写指针与所述读指针的当前位置的逻辑差值;限流调整模块,用于根据所述逻辑差值进行数据限流。
可选地,所述数组的大小是根据系统的极限处理能力确定的。
可选地,当向所述环数据结构中写入数据时,将数据写入所述写指针当前指向的位置,然后,将所述写指针指向的位置更新为下一个可写入数据的位置;当从所述环数据结构中读取数据时,根据所述读指针当前指向的位置读取数据,然后,将所述读指针指向的位置更新为下一个可读取数据的位置。
可选地,所述写指针和所述读指针按照相同的方向前进,且所述写指针不指向保存有未读取数据的位置,所述读指针不超越所述写指针。
可选地,所述限流调整模块还用于:当所述逻辑差值大于预设的第一阈值时,降低限流速率和/或提高系统业务处理速率;当所述逻辑差值小于预设的第二阈值时,提高限流速率和/或降低系统业务处理速率;其中,所述第一阈值大于所述第二阈值。
根据本发明实施例的又一方面,提供了一种数据限流的电子设备。
一种数据限流的电子设备,包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明实施例所提供的数据限流的方法。
根据本发明实施例的再一方面,提供了一种计算机可读介质。
一种计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现本发明实施例所提供的数据限流的方法。
上述发明中的一个实施例具有如下优点或有益效果:通过使用环数据结构来保存数据,并根据写指针和读指针的当前位置的逻辑差值来进行数据限流,由于写指针和读指针的当前位置的逻辑差值实际反映的就是当前系统的流量压力和实时处理能力,因此实现了根据系统的实时处理能力以及资源使用状态来进行合理限流。本发明通过从系统内部实时获取系统当前实际的处理能力参数,并把这个参数反馈给系统线程池等以进行业务优化和/或反馈给外层漏桶或令牌桶机制中以动态调整限流速率,从而实现了更准确地提高或优化系统性能和更合理地进行数据限流,且具有实时、高效、动态等优点。并且,由于本发明采用环数据结构进行数据保存,在进行数据读取时,通过实时关键字volitate来获取读指针的实时位置,因此,无需进行数据加锁即可避免资源争抢或重复获取数据的情况,实现方式简单。
上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。
附图说明
附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
图1是根据本发明实施例的数据限流的方法的主要流程的示意图;
图2是本发明实施例的环数据结构的初始状态示意图;
图3是本发明实施例的向环数据结构中写入数据的状态示意图;
图4是本发明实施例的从环数据结构中读取数据的状态示意图;
图5是本发明一个实施例的数据限流的最佳状态时的环数据结构状态示意图;
图6是本发明一个实施例的需调整限流速率时的环数据结构状态示意图;
图7是本发明另一个实施例的需调整限流速率时的环数据结构状态示意图;
图8是根据本发明实施例的数据限流的装置的主要模块的示意图;
图9是本发明实施例可以应用于其中的示例性系统架构图;
图10是适于用来实现本发明实施例的终端设备或服务器的计算机系统的结构示意图。
具体实施方式
以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
针对现有的漏桶算法、令牌桶算法或者二者交叉混合使用的变种算法不能准确反映系统实时处理能力和资源状态,不能根据系统的实时处理能力和资源状态进行合理的数据限流的缺点,本发明提供了一种数据限流的方法。通过环数据结构(ringbuffer)进行待处理数据的保存,并根据环数据结构的写指针和读指针的当前位置的逻辑差值判断是否需要进行限流调整,其中,写指针和读指针的当前位置的逻辑差值即代表了当前系统的实时处理能力和流量压力,从而实现了一方面根据系统服务器的实时处理能力及时处理数据以使服务器系统处于最佳的处理能力和状态,另一方面又将系统的实时处理能力及时反馈到使用漏桶算法或令牌桶算法进行限流的速率上,通过该数据限流的方法既保障了服务器系统的稳定性和最高处理效率,又提升了服务器性能和对客户端的响应速度。
图1是根据本发明实施例的数据限流的方法的主要流程的示意图。如图1所示,本发明的数据限流的方法主要包括如下的步骤s101至步骤s103。
步骤s101:将待处理数据保存到环数据结构中,环数据结构包括一个用于保存待处理数据的数组,一个指向当前可写入数据的位置的写指针和一个指向当前可读取数据的位置的读指针。
根据本发明实施例的技术方案,为了更好地实现根据系统的实时处理能力和资源状态进行合理的数据限流,环数据结构的数组的大小与系统的极限处理能力相关,具体地,环数据结构的数组的大小是根据系统的极限处理能力确定的。
根据本发明的实施例,可以通过对系统进行压力测试以获取系统的极限处理能力qps(querypersecond,每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准),然后将系统的极限处理能力qps保存到系统的配置文件或数据库中,以便需要时可以直接获取。压力测试,也称为强度测试,通过模拟实际应用的软硬件环境及用户使用过程的系统负荷,长时间或超大负荷地运行测试软件,来测试被测系统的性能、可靠性、稳定性等。压力测试需要确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大的服务级别。
然后,根据压力测试得到的qps值,外层服务(例如是业务系统所在服务器的内存,或者是业务系统所在的分布式服务系统的服务代理层nginx、apache等)设置限流速率完成初步限流,例如可以采用漏桶算法或者令牌桶算法设置漏桶的速率或者令牌放入的速率以完成初步限流。为了保证漏桶足够大或令牌桶中有足够的令牌可用,内层系统(例如是业务系统所在服务器的硬盘,或者是业务系统所在的分布式服务系统中用于执行具体业务的服务中间件tomcat、jboss等)可以随时获取到待处理数据(例如:用户发来的请求报文等数据),且外层服务在承受范围内不崩溃,可以设置限流速率(即:漏桶的速率或者令牌放入的速率)是qps值的1到2倍等,具体地,例如设置限流速率是qps*1.5。
内层系统在获取到待处理数据后,将待处理数据保存到一个首尾相连的环数据结构(记作ringbuffer结构体)中,以便系统的业务逻辑处理流程从环数据结构中读取待处理数据并进行处理。本发明的环数据结构包括一个用于保存待处理数据的数组,一个指向当前可写入数据的位置的写指针和一个指向当前可读取数据的位置的读指针。写指针和读指针例如可以使用java提供的实时关键字volitate修饰变量来实现,以保证获取的写指针和读指针当前指向的位置是实时和准确的。
下面结合附图介绍本发明的环数据结构的具体实现。
图2是本发明实施例的环数据结构的初始状态示意图。如图2所示,构建的环数据结构(ringbuffer结构体)上的位置个数(即数组大小)根据系统的极限处理能力qps进行设置,例如是qps*1.5,以保证系统的业务逻辑处理流程可以随时获取到待处理数据。在本发明的实施例中,以数组大小为1024为例进行介绍。
如图2所示,在初始状态时,写指针和读指针指向同一位置,且将该位置作为环数据结构的头部,将该位置的逻辑值设为1。在本发明的实施例中,写指针和读指针需要按照相同的方向前进,且读指针追随写指针但不超越写指针,如此即可保证读指针刚好能读取到已写入的数据,不会出现读取不到数据的情况。同时,写指针不指向保存有未读取数据的位置,也就是说,在写入数据时,写指针不可指向读指针所指向的位置及其之后已保存有数据的位置。
图3是本发明实施例的向环数据结构中写入数据的状态示意图。如图3所示,在环数据结构初始化完成后,当需要向环数据结构中写入数据时,系统将数据写入写指针当前指向的位置(逻辑值为1),然后,将写指针指向的位置更新为下一个可写入数据的位置(逻辑值为2)。为了便于描述,本发明中的指针每移动一次,指针所指向的位置的逻辑值增加1。
图4是本发明实施例的从环数据结构中读取数据的状态示意图。如图4所示,环数据结构初始化完成,在系统将数据写入逻辑值为2的位置之后,写指针将指向逻辑值为3的位置,此时,当需要从环数据结构中读取数据时,系统将根据读指针当前指向的位置(逻辑值为1)读取数据,然后,将读指针指向的位置更新为下一个可读取数据的位置(逻辑值为2)。
步骤s102:分别获取写指针与读指针的当前位置的逻辑值,并计算写指针与读指针的当前位置的逻辑差值。
由于本发明的实施例中采用环数据结构来保存数据,因此,在获取写指针与读指针的当前位置的逻辑值并进行比较计算时,需要判断两个指针是否在环的同一圈上。本发明的实施例中,通过将写指针或读指针的索引值对环数据结构的数组大小取模的方式,来得到写指针或读指针的当前位置的逻辑值,用于标识写指针或读指针在对应的环数据结构上的位置。其中,指针的索引值随着指针的前进依次递增。系统每向环数据结构中写入一个数据,写指针前进一个位置,写指针的索引值增加1;系统每从环数据结构中读取一个数据,读指针前进一个位置,读指针的索引值增加1。通过指针的索引值可以统计系统写入环数据结构的数据个数,以及系统从环数据结构中读取的数据个数,进而可以对系统的整体性能进行评价。
假设环数据结构的数组大小为cachesize,写指针的索引值为writeindex,读指针的索引值为readindex;那么,写指针的当前位置的逻辑值nextwriteindex为:nextwriteindex=writeindex%cachesize;读指针的当前位置的逻辑值nextreadindex为:nextreadindex=readindex%cachesize。显而易见,当指针(写指针或读指针)位于环数据结构的第一圈时,指针的当前位置的逻辑值与指针的索引值相等。通过对nextwriteindex和nextwriteindex这两个值进行逻辑运算,可以防止数据读越界和写覆盖,即:需满足读指针追随写指针但不可超越,同时,写指针不可指向保存有未读取数据的位置。
在计算写指针与读指针的当前位置的逻辑差值时,首先需判断写指针和读指针是否在环数据结构的同一圈上,若在同一圈上,则写指针与读指针的当前位置的逻辑差值为:写指针的当前位置的逻辑值与读指针的当前位置的逻辑值之差,即:(nextwriteindex-nextreadindex);否则,由于写指针始终位于读指针之前或与读指针重叠,故而写指针与读指针的当前位置的逻辑差值为:写指针的当前位置的逻辑值与环数据结构的数组大小之和,再与读指针的当前位置的逻辑值相减,即:(nextwriteindex+cachesize-nextreadindex)。
为了方便判断写指针和读指针是否在环数据结构的同一圈上,可以设置一个跨环标记,当写指针从环数据结构的尾部(例如图2所示的逻辑值为1024的位置)移动到环数据结构的头部(例如图2所示的逻辑值为1的位置)时,即在写指针上增加跨环标记,以表示写指针和读指针不在环数据结构的同一圈上。当读指针也从环数据结构的尾部移动到环数据结构的头部时,消除写指针上的跨环标记,以表示写指针和读指针在环数据结构的同一圈上。另外,为了判断写指针和读指针是否在环数据结构的同一圈上,还可以为写指针和读指针分别增加“已跨环次数”的属性,当写指针或读指针每次从环数据结构的尾部移动到环数据结构的头部时,该属性值即增加1,如此,即可根据写指针和读指针的“已跨环次数”的属性值来判断写指针和读指针是否在环数据结构的同一圈上。同样地,为了判断写指针和读指针是否在环数据结构的同一圈上,也可以根据写指针的当前位置的逻辑值与读指针的当前位置的逻辑值的大小来进行比较判断,由于当写指针和读指针在同一圈时,写指针的当前位置的逻辑值大于或等于读指针的当前位置的逻辑值;当写指针和读指针不在同一圈时,由于写指针不指向保存有未读取数据的位置,故而,写指针的当前位置的逻辑值应小于读指针的当前位置的逻辑值,因此,可根据写指针的当前位置的逻辑值与读指针的当前位置的逻辑值的大小来判断写指针和读指针是否在环数据结构的同一圈上。根据本发明的实现原理,为了判断写指针和读指针是否在环数据结构的同一圈上,还可以采取其他的方案,本发明中不作限制。
根据本发明的技术方案,环数据结构上写指针的当前位置的逻辑值nextwriteindex和读指针的当前位置的逻辑值nextreadindex可分别用于衡量当前系统将数据写入环数据结构的速率和从环数据结构中读取数据的速率,也可分别用于衡量当前系统外部可接收数据的空闲容量和系统内部的繁忙程度。写指针与读指针的当前位置的逻辑差值实际反映的就是当前系统的流量压力和实时处理能力,根据这个逻辑差值来通知系统进行内部逻辑处理跳转或通知外部限流模块调整限流速率,可以更准确的提高或优化系统性能和控制限流速率。
另外,由于本发明采用环数据结构进行数据保存,在进行数据读取时,通过实时关键字volitate来获取读指针的实时位置,因此,无需进行数据加锁即可避免资源争抢或重复获取数据的情况,实现方式简单。
步骤s103:根据逻辑差值进行数据限流。
其中,步骤s103具体可以包括如下的两种情况:
当逻辑差值大于预设的第一阈值时,降低限流速率和/或提高系统业务处理速率;
当逻辑差值小于预设的第二阈值时,提高限流速率和/或降低系统业务处理速率;
其中,第一阈值大于第二阈值。
图5是本发明一个实施例的数据限流的最佳状态时的环数据结构状态示意图。根据图5可以看出,当写指针和读指针的当前位置的逻辑差值大约是环数据结构的数组大小的一半(在具体实现时,可根据需要设置不同的数值)时,说明系统向环数据结构中写入数据的速率和系统从环数据结构中读取数据的速率大致相同,此时,系统的业务处理速率和限流速率基本持平,系统的稳定性和处理效率均达到最佳状态,无需进行限流调整。
图6是本发明一个实施例的需调整限流速率时的环数据结构状态示意图。如图6所示,当写指针和读指针的当前位置的逻辑差值(1023+1024-1024=1023)大于一个预设的第一阈值(例如:数组大小的4/5,可根据需要进行灵活设定)时,说明系统向环数据结构中写入数据的速率大于系统从环数据结构中读取数据的速率,那么,一段时间后将可能会出现写指针即将追上读指针或者等待读指针读取数据后才可再写入数据的情况。也就是说,系统的处理能力可能已达到极限峰值,系统已处于过负荷状态。此时,需要进行限流调整,可以通过降低外层的限流速率以降低写入数据的速率,从而缓解系统的压力,实现合理限流;也可以通过提高系统的业务处理速率,例如:通过减少线程池中的线程个数,以减少线程之间资源争抢或切换代理服务器的时间和空间开销,从而提高系统的业务处理速率,以便优化系统的处理能力,实现合理限流;还可以通过既降低限流速率又提高系统的业务处理速率,以缓解系统的压力,优化系统的处理能力,从而实现合理限流。在具体实施时,可根据不同的场景需求选择不同的措施以达到合理限流的目的。
图7是本发明另一个实施例的需调整限流速率时的环数据结构状态示意图。如图7所示,当写指针和读指针的当前位置的逻辑差值(1023-1022=1)小于一个预设的第二阈值(例如:数组大小的1/5,可根据需要进行灵活设定)时,说明系统向环数据结构中写入数据的速率小于系统从环数据结构中读取数据的速率,那么,一段时间后将可能会出现读指针即将追上写指针或者等待写指针写入数据后才可再读取数据的情况。也就是说,此时系统的处理能力良好,系统处于不饱和状态,会造成系统资源浪费。此时,需要进行限流调整,可以通过提高外层的限流速率以提高写入数据的速率,从而使系统可以读取足够的数据进行处理,避免系统资源浪费,实现合理限流;也可以通过降低系统的业务处理速率,例如:通过减少该业务系统线程池中的线程个数来降低系统的业务处理速率,由于线程个数的减少而节省了线程占用的系统资源开销,降低了当前系统的资源占用率,同时可以扩大当前系统所在的机器上部署的其他系统需要的线程池,从而在一定程度上起到合理利用硬件资源、网络带宽和存储资源的效果,以便更好、更充分地利用系统资源,实现合理限流;还可以通过既提高限流速率又降低系统业务处理速率,以更好地利用系统资源,从而优化系统效率,实现合理限流。在具体实施时,可根据不同的场景需求选择不同的措施以达到合理限流的目的,以及达到系统内部高性能处理业务,外部更合理优化限流的结果。
图8是根据本发明实施例的数据限流的装置的主要模块的示意图。如图8所示,本发明实施例的数据限流的装置800主要包括数据保存模块801、逻辑运算模块802和限流调整模块803。
数据保存模块801用于将待处理数据保存到环数据结构中,环数据结构包括一个用于保存待处理数据的数组,一个指向当前可写入数据的位置的写指针和一个指向当前可读取数据的位置的读指针;
逻辑运算模块802用于分别获取写指针与读指针的当前位置的逻辑值,并计算写指针与读指针的当前位置的逻辑差值;
限流调整模块803用于根据逻辑差值进行数据限流。
其中,数组的大小是根据系统的极限处理能力确定的。
根据本发明的实施例,当向环数据结构中写入数据时,将数据写入写指针当前指向的位置,然后,将写指针指向的位置更新为下一个可写入数据的位置;
当从环数据结构中读取数据时,根据读指针当前指向的位置读取数据,然后,将读指针指向的位置更新为下一个可读取数据的位置。
根据本发明的实施例,写指针和读指针按照相同的方向前进,且写指针不指向保存有未读取数据的位置,读指针不超越写指针。
根据本发明的实施例的技术方案,限流调整模块803还可以用于:
当逻辑差值大于预设的第一阈值时,降低限流速率和/或提高系统业务处理速率;
当逻辑差值小于预设的第二阈值时,提高限流速率和/或降低系统业务处理速率;
其中,第一阈值大于第二阈值。
根据本发明实施例的技术方案,通过使用环数据结构来保存数据,并根据写指针和读指针的当前位置的逻辑差值来进行数据限流,由于写指针和读指针的当前位置的逻辑差值实际反映的就是当前系统的流量压力和实时处理能力,因此实现了根据系统的实时处理能力以及资源使用状态来进行合理限流。本发明通过从系统内部实时获取系统当前实际的处理能力参数,并把这个参数反馈给系统线程池等以进行业务优化和/或反馈给外层漏桶或令牌桶机制中以动态调整限流速率,从而实现了更准确地提高或优化系统性能和更合理地进行数据限流,且具有实时、高效、动态等优点。并且,由于本发明采用环数据结构进行数据保存,在进行数据读取时,通过实时关键字volitate来获取读指针的实时位置,因此,无需进行数据加锁即可避免资源争抢或重复获取数据的情况,实现方式简单。
图9示出了可以应用本发明实施例的数据限流的方法或数据限流的装置的示例性系统架构900。
如图9所示,系统架构900可以包括终端设备901、902、903,网络904和服务器905。网络904用以在终端设备901、902、903和服务器905之间提供通信链路的介质。网络904可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
用户可以使用终端设备901、902、903通过网络904与服务器905交互,以接收或发送消息等。终端设备901、902、903上可以安装有各种通讯客户端应用,例如购物类应用、网页浏览器应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等(仅为示例)。
终端设备901、902、903可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。
服务器905可以是提供各种服务的服务器,例如对用户利用终端设备901、902、903所浏览的购物类网站提供支持的后台管理服务器(仅为示例)。后台管理服务器可以对接收到的产品信息查询请求等数据进行分析等处理,并将处理结果(例如目标推送信息、产品信息--仅为示例)反馈给终端设备。
需要说明的是,本发明实施例所提供的数据限流的方法一般由服务器905执行,相应地,数据限流的装置一般设置于服务器905中。
应该理解,图9中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
下面参考图10,其示出了适于用来实现本发明实施例的终端设备或服务器的计算机系统1000的结构示意图。图10示出的终端设备或服务器仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图10所示,计算机系统1000包括中央处理单元(cpu)1001,其可以根据存储在只读存储器(rom)1002中的程序或者从存储部分1008加载到随机访问存储器(ram)1003中的程序而执行各种适当的动作和处理。在ram1003中,还存储有系统1000操作所需的各种程序和数据。cpu1001、rom1002以及ram1003通过总线1004彼此相连。输入/输出(i/o)接口1005也连接至总线1004。
以下部件连接至i/o接口1005:包括键盘、鼠标等的输入部分1006;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分1007;包括硬盘等的存储部分1008;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分1009。通信部分1009经由诸如因特网的网络执行通信处理。驱动器1010也根据需要连接至i/o接口1005。可拆卸介质1011,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1010上,以便于从其上读出的计算机程序根据需要被安装入存储部分1008。
特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分1009从网络上被下载和安装,和/或从可拆卸介质1011被安装。在该计算机程序被中央处理单元(cpu)1001执行时,执行本发明的系统中限定的上述功能。
需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、rf等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本发明实施例中所涉及到的单元或模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元或模块也可以设置在处理器中,例如,可以描述为:一种处理器包括数据保存模块、逻辑运算模块和限流调整模块。其中,这些单元或模块的名称在某种情况下并不构成对该单元或模块本身的限定,例如,数据保存模块还可以被描述为“用于将待处理数据保存到环数据结构中的模块”。
作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:将待处理数据保存到环数据结构中,所述环数据结构包括一个用于保存待处理数据的数组,一个指向当前可写入数据的位置的写指针和一个指向当前可读取数据的位置的读指针;分别获取所述写指针与所述读指针的当前位置的逻辑值,并计算所述写指针与所述读指针的当前位置的逻辑差值;根据所述逻辑差值进行数据限流。
根据本发明实施例的技术方案,通过使用环数据结构来保存数据,并根据写指针和读指针的当前位置的逻辑差值来进行数据限流,由于写指针和读指针的当前位置的逻辑差值实际反映的就是当前系统的流量压力和实时处理能力,因此实现了根据系统的实时处理能力以及资源使用状态来进行合理限流。本发明通过从系统内部实时获取系统当前实际的处理能力参数,并把这个参数反馈给系统线程池等以进行业务优化和/或反馈给外层漏桶或令牌桶机制中以动态调整限流速率,从而实现了更准确地提高或优化系统性能和更合理地进行数据限流,且具有实时、高效、动态等优点。并且,由于本发明采用环数据结构进行数据保存,在进行数据读取时,通过实时关键字volitate来获取读指针的实时位置,因此,无需进行数据加锁即可避免资源争抢或重复获取数据的情况,实现方式简单。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。