具体实施方式
参考图1,为调用分布式对象的一个应用场景的示意图,某一机器A(称为用户)向任意一个包括分布式对象的机器C发送请求消息,该机器可以是网络设备、服务器、计算机或者任何其它包含分布式对象的设备。该请求消息一般携带有目的分布式对象所在的机器的标识(例如IP地址),目的分布式对象所在的可执行程序的标识(例如编号C1、C2、C3),目的分布式对象的标识ID(例如编号0、1、2、3、4、5、6、7)。根据上述请求消息中的机器IP地址、可执行程序编号C3,该请求消息可以到达目的分布式对象所在的该可执行程序的接收消息线程对应的消息队列。
参考图2,为一个分布式对象调度系统的具体实施方式的结构图,该调度系统包括以下单元,接收消息线程12、调度器13、调度线程15、调度队列14。其中:
接收消息线程12用于监听网络端口11,如有请求消息到达接收消息线程12对应的消息队列,则发送该请求消息至调度器13中。
调度器13用于提供分布式对象ID和调度线程之间的对应的关系(或者称映射关系),以及调度线程和调度队列之间的对应关系,其中分布式对象ID和唯一的调度线程对应,调度线程和调度队列一一对应;根据接收到的请求消息(例如其中的头信息),解析出该目标分布式对象ID;根据该目标分布式对象ID找到该目标分布式对象(或者目标分布式对象ID)唯一对应的调度线程15;将该请求消息发送到调度线程15对应的调度队列14中。
调度线程15用于在有请求消息到达该调度线程15对应的调度队列14时(可以是检测知道,或者是由调度器13通知知道),取出该请求消息,以及根据该请求消息中的目标分布式对象ID找到该目标分布式对象ID对应的分布式对象并调用该分布式对象对应的方法。
需要解释的是,在调度系统中,每个调度线程对应一个调度队列。在另一个具体实施方式中,调度线程15还用于存储与该调度线程15对应的该分布式对象ID。例如,一个分布式对象ID为一个编号,该编号由调度线程15保存,从而使得分布式对象和具体线程绑定。
调度队列14用于缓存收到的请求消息。
具体的,在一个实施方式中,该调度队列14为一个数组,请求消息为数组中的一个元素。具体的,该调度队列可以是循环队列、双向链表等。
参考图3,为一个调度器13的具体实施方式的结构示意图,该调度器13包括解析模块131,对应关系模块132,交互模块133、查询模块134。其中,
该解析模块131用于根据接收到的请求消息解析出目标分布式对象ID。
该对应关系模块132用于提供分布式对象ID和调度线程之间的对应的关系,以及调度线程和调度队列之间的对应关系,其中分布式对象ID和唯一的调度线程对应,调度线程和调度队列一一对应。也就是说,对于分布式对象ID,只有一个调度线程和其对应,而一个调度线程可能对应多个分布式对象ID。对于调度线程,只有一个调度队列与其对应;对于调度队列,也只有一个调度线程与其对应。
查询模块134用于根据所述目标分布式对象ID找到所述目标分布式对象ID唯一对应的调度线程。
该交互模块133用于接收由接收消息线程12发送的请求消息,以及发送该请求消息至所述目标分布式对象ID唯一对应的所述调度线程15对应的调度队列14中。
更具体的,在一个实施方式中,对应关系模块132具体用于保存一个分布式对象ID与其唯一对应的调度线程15的对应关系列表。另一个具体实施方式中,该对应关系模块132采用运算器生成分布式对象ID和唯一一个调度线程15对应的对应关系。
在另一个具体实施方式中,参考图4,调度器13还用于在向分布式系统加载分布式对象时,给该分布式对象分配唯一的分布式对象ID。此时,调度器13相对于图3所示的结构,还包括分配模块135,该分配模块135用于在分布式对象在向分布式系统加载时,给该分布式对象分配唯一的分布式对象ID。在其它的实施方式中,该分配分布式对象ID的步骤可由其它设备完成。
上述分布式对象调用系统至少有以下优点:
一方面,上述分布式对象的调用系统中,由于将分布式对象ID和线程一一对应,使得在处理时不会出现两个以上线程对同一个分布式对象进行调用,这样避免了频繁的对分布式对象进行加锁以及解锁的处理,相对于现有技术节省了系统资源的开销。例如,发明人在实施本发明的过程中发现,现有技术中一种对同一个分布式对象调用的方法中:在某一段时间,可能有两个线程同时对某一个分布式对象进行调用,并且分布式对象提供的方法必须是多线程安全的。因为在多线程环境下,多个线程竞争使用同一个共享资源(即分布式对象)时,线程之间会发生冲突;所以在有共享资源或共享对象的临界区的所有线程中,接收异步请求时需要进行加锁,使得一次只允许一个线程进入临界区,确保共享资源线程安全。另外,所有同步线程在同一个队列取请求消息,取请求消息也需要解锁保护。上述进行加锁、解锁保护的步骤增加了系统资源的开销,而本发明具体实施方式克服了上述缺点。
另一方面,上述分布式对象的调用系统中,采用调度队列即缓存队列的方式对于用户的请求进行处理,不会出现用户请求的拥塞或者遗漏,增强了系统在爆发用户(短时间内发生大量用户请求)的情况下的稳定性和处理能力。
本发明具体实施方式还提供了上述系统在运行时执行的分布式对象的调度方法,参考图5,为该分布式对象的调度方法的流程图。该方法包括:
501、接收消息线程12检测或者监听是否有请求消息到,如果有则发送该请求消息至调度器13。
具体的,该检测可以是循环进行的,或者周期的,或者定时的,或者可以是在没有消息到来时接收消息线程12处于休眠状态,如果有消息到则接收,接收完毕后如果仍有消息到则循环接收,不休眠。
502、调度器13根据接收到的该请求消息解析出目的分布式对象ID,并根据该解析出的目的分布式对象ID,查找到该目标分布式对象唯一对应的调度线程15。
其中,分布式对象ID和唯一的调度线程对应,也就是说,对于分布式对象ID,只有一个调度线程和其对应,而一个调度线程可能对应多个分布式对象ID。上述对应关系可以由调度器13或者其它设备提供。
具体的,为使分布式对象ID对应一个唯一的调度线程,可以有几种不同的实现方式:
一个实施方式中,调度器13可以保存一个分布式对象ID与其唯一对应的调度线程15的对应关系列表。
另一个实施方式中,调度器13给分布式对象分配一个唯一的编号,该编号由唯一一个调度线程15保存。
在另一个具体实施方式中,调度器采用一个运算器或者对应规则,实现分布式对象ID和唯一一个调度线程15对应。例如,调度线程编号为0,1,2......n,n≥2,分布式对象ID编号为0,1,2......m,m≥2,该对应规则为:编号为m的对分布式对象ID对应的调度线程15的编号为:分布式对象ID的编号m对调度线程的个数(n+1)取模的值。
下面为应用上述取模的方法的一个具体实例,系统有三个调度线程,其编号为0,1,2(n=2);有8个分布式对象,分布式对象ID编号为0,1,2,3,4,5,6,7。按照上述取模的对应规则,编号为0,1,2,3,4,5,6,7的分布式对象ID对应的调度线程的编号为:0,1,2,3,4,5,6,7分别对3取模的值(结果为0,1,2,0,1,2,0,1)。
本技术领域的普通技术人员可以理解的是上述分布式对象ID对应一个唯一的调度线程的实现方法仅仅是举例,而不是对技术方案的限定。
503、调度器13将该请求消息发送给调度线程15对应的调度队列14。
或者,可以理解为调度器将该请求消息放置于调度线程15对应的调度队列14。需要解释的是,调度线程和调度队列一一对应,也就是说,对于调度线程,只有一个调度队列与其对应;对于调度队列,也只有一个调度线程与其对应。上述对应关系可以由调度器13或者其它设备提供。
在另一个实施例中,调度器13在执行上述发送请求消息给调度队列14的步骤之外,还可以通知调度线程15有请求消息到。
上述请求消息用于触发调度线程15根据目的分布式对象ID找到对应的分布式对象并调用该找到的分布式对象对应的方法,具体包括504-506:
504、当有请求消息到达调度线程15对应的调度队列14,调度线程15从该调度队列14中取出该请求消息。
具体的,在一个具体实施方式中,调度线程15可以通过检测知道有请求消息到达调度线程15对应的调度队列14。例如,该检测可以是循环进行的,或者周期的,或者定时的,或者可以是在没有消息到来时调度线程15处于休眠状态,如果有消息到则接收,接收完毕后如果仍有消息到则循环接收,不休眠。
在另一个具体实施方式中,调度线程15也可以通过接收调度器13发来的通知后知道有请求消息到达调度线程15对应的调度队列14。
在上述实施方式中,调度线程15可以一直阻塞在请求消息队列上,直到有请求消息到才进行处理。在这个实施方式中,可以进一步降低资源的开销,从而提高系统性能。
505、调度线程15根据目的分布式对象ID找到对应的分布式对象。
506、调度线程15调用该找到的分布式对象对应的方法。
上述调度方法实施方式中,由于将分布式对象ID和线程一一对应,使得在处理时不会出现两个以上线程对同一个分布式对象进行调用,这样避免了频繁的对分布式对象进行加锁以及解锁的处理,相对于现有技术节省了系统资源的开销。
在一个具体实施方式中,上述调度队列14是一个存放请求消息的队列,其具体格式是一个数组。可以是循环队列、双向链表等。
以该调度队列14是循环队列为例,该循环队列可以采取读写点控制请求消息出入队判断,其判断的具体方法如下:
定义两个成员,分别为读点和写点;
如果读点和写点相等,则队列为空;
读点和写点相差一个间隔,则队列为满;
请求消息入队时请求消息写入写点位置,写点后移;
读请求消息时从读点读取数据,读点后移。
上述过程用程序化语言表达为:
putMessage(pMsg)//请求消息入队
{
如果(m_unRead==(m_unWrite+1)%m_unMaxSize)//读点和写点相差一个间隔,则队列满
{
返回
}
//请求消息写入写点位置
//写点后移
}
getMessage(pMsg)//请求消息出队
{
如果读点和写点相等,说明队列空,返回
//从读点位置取请求消息
//读点后移
}
在上述具体实施方式中,采取分布式对象ID和线程一一对应,以及循环队列的读写点控制请求消息出入队判断方法,从而至少有以下优点:
一方面,调度线程15读取、放入请求消息至调度队列14无需加锁处理。
另一方面,循环队列可以预分配内存,在请求消息出、入队列过程中无需动态的申请和释放内存,避免了频繁的系统资源调用,保证了请求消息处理高效执行。
还有一方面,在调度队列14非空时请求消息入队无需通知调度线程15,仅在队列空调度线程15阻塞在调度队列14时请求消息入队才通知调度线程15;也就是说,仅在队列空时需要阻塞等待,从而大大降低了系统开销。
另一方面,采用调度队列即缓存队列的方式对于用户的请求进行处理,不会出现用户请求的拥塞或者遗漏,增强了系统在爆发用户(短时间内发生大量用户请求)的情况下的稳定性和处理能力。
本领域技术人员可以知道,本发明的其它技术效果可以通过对比其它现有技术而得到,在此不赘述。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。以上公开的仅为本发明的几个具体实施例,但是,本发明并非局限于此,任何本领域的技术人员能想到的变化都应落入本发明的保护范围。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。