发明内容
本发明要解决的技术问题为:通过改善参数存放机制,配合进程级、线程级标志位,以及数据注册、搜索、拉取建模连接分离的机制,实现非阻塞的参数更新,避免参数更新导致系统停止、业务处理中断或参数更新互斥。
本发明采取的技术方案为:实时系统参数数据的非阻塞更新和访问方法,实时系统包括参数服务器端和参数客户端,参数服务器端所在主机上设置有数据内存块,且主机上运行有可完成将参数从参数源加载到内存中并完成参数排序建模检错的进程或线程;参数客户端运行有通过访问参数进行业务处理的进程或线程;
所述数据内存块数量为3块,分别定义为0号数据内存块、1号数据内存块和控制内存块,其中0号数据内存块、1号数据内存块用于存放参数数据,控制内存块用于存放控制信息数据;所述0号数据内存块以及1号数据内存块中,其中一个数据内存块用于存储参数服务器端接收的最新参数数据,另一数据内存块用于存储参数服务器端最近一次更新后的参数数据,以提供给参数客户端进行数据访问;
上述控制信息数据包括:最新参数所在内存块ID、临界资源锁、参数个数N、上次死锁解除时刻和更新标记,0号数据内存块与1号数据内存块内数据包括:内存大小和key、各参数偏移量、各参数记录数以及各参数客户端的注册信息;其中参数客户端进程注册信息包括进程启动信息、进程ID、更新线程状态、上次更新完成时刻、上次检查更新时刻、进程使用参数内存块ID、线程集合和线程集合内各元素对应的使用参数内存块ID;;
实时系统中参数数据更新包括参数客户端的参数更新,以及参数服务器端的参数更新;
参数客户端的参数更新,包括进程探测和线程探测,其中:
进程探测步骤为:进程中的更新线程检测本进程使用内存块ID与参数服务器端控制区内存的最新参数所在内存块ID是否一致,如果不一致则更新为最新参数所在内存块ID,并等待各业务线程完成线程探测步骤;如果等待超时则强制将对应业务线程所用内存块ID更新为进程使用内存块ID;
线程探测步骤为:各业务线程检测本线程所用内存块ID与其所属进程使用参数内存块ID是否一致,如果不一致则更新为其所属进程当前所用参数内存块ID;
参数服务器端的参数更新,包括以下步骤:
a)根据控制内存的更新标记判断是否需要进行参数更新:如果不需要,则参数更新的判断执行进入指定时间的睡眠状态,再重复步骤a);
如果需要进行参数更新,则执行步骤b);
b)检测控制内存的参数客户端注册信息里各个线程使用参数内存块ID与控制内存的最新参数所在内存块ID是否一致:
如果不一致则执行进入指定时间的睡眠状态,等待参数客户端完成更新参数,如果等待超过指定时间则强制将控制内存的参数客户端注册信息里各个线程使用参数内存块ID变更为控制内存的最新参数所在内存块ID,然后执行步骤c),如果等待未超过指定时间则重复步骤b);
如果一致,则执行步骤c);
c)从参数源拉取各参数记录总数,从而获得存放参数的数据内存所需容量S,假设控制内存的最新参数所在内存ID为0,即位于0号内存中,如果S比1号内存容量大,则重建1号内存至容量至少为S;同理控制内存的最新参数所在内存ID为1,如果S比0号内存容量大,则重建0号内存至容量至少为S;
d)从参数源拉取各参数并完成检错、排序和模型建立,变更最新参数所在内存块ID,然后重复步骤b)至d);
实时系统中,参数服务器端运行的进程或线程以及参数客户端运行的进程或线程,通过搜索部件、参数注册部件以及内存连接部件访问数据内存块中的参数数据以及控制信息数据;其中:
搜索部件从参数注册部件中获取可访问的参数集合及每个参数偏移量和记录数,以定位到参数数据所在的数据内存块进行数据访问;
参数注册部件声明需要加载的参数数据,并为每个参数数据分配一个唯一的身份ID;
客户端及服务器端运行的进程或线程依次通过搜索部件、参数注册部件和内存连接部件访问0号数据内存块和1号数据内存块中的参数数据;
客户端参数更新进程以及服务器端进程分别依次通过搜索部件和内存连接部件访问控制内存块中的控制信息数据。
上述参数注册部件为每个参数数据分配的唯一身份ID,可用于在参数服务器端或参数客户端在访问控制内存块时能够快速定位各参数数据对应的控制信息数据。客户端参数更新线程依次通过搜索部件和连接部件读写自己在控制内存块中的客户端注册信息,以完成参数更新操作,将自己在控制内存块中的客户端注册信息中“进程使用参数内存块ID”改写成与“最新参数所在内存块ID”一致;服务器端进程依次通过搜索部件和内存连接部件对控制内存块进行读写操作。
基于本发明的内存块设置方式,本发明对于参数数据的存放方式分为共享内存方式和私有内存方式。为了防止业务线程阻塞,本发明参数数据的存放方式可根据一台主机上需要访问相同参数的进程数是否大于1来判断,如果大于1,则采用共享内存存放模式进行参数数据的存放;如果等于1,则采用私有内存存放模式进行参数数据的存放。另外如果为了维护方便(方便查看参数数据正确性等),在等于1的情况下也同样可以采用共享内存存放模式进行参数数据的存放。
共享内存方式下,本发明将所述0号数据内存块以及1号数据内存块中,其一用于存储参数服务器端接收的最新参数数据,另一数据内存块用于存储参数服务器端最近一次更新后的参数数据,以提供给参数客户端进行数据访问。
私有内存方式下客户端进程和服务器端进程实际为同一个进程,且只有一个客户端进程;客户端更新线程和服务端更新线程实际合并为同一个线程;且不存在进程探测。
上述内存存放方式皆能够实现参数更新过程中将进程级标志位与线程级标志位相结合完成参数数据的非阻塞更新。
有益效果
相比于现有的参数更新方式,本发明对实时系统中的内存块设置进行了优化,配合进程级、线程级标志位,以及数据注册、搜索、拉取建模连接分离的机制,进行非阻塞的参数更新和访问,不会因为更新参数导致系统停止、中断业务处理或者互斥地更新参数。
具体实施方式
以下结合附图和具体实施例进一步说明。
本发明的实时系统参数数据的非阻塞更新和访问方法中,实时系统包括参数服务器端和参数客户端,参数服务器端所在主机上设置有数据内存块,且主机上运行有可完成将参数从参数源加载到内存中并完成参数排序建模检错的进程或线程;参数客户端运行有通过访问参数进行业务处理的进程或线程;
如图1所示,数据内存块数量为3块,分别定义为0号数据内存块、1号数据内存块和控制内存块,其中0号数据内存块、1号数据内存块用于存放参数数据,控制内存块用于存放控制信息数据;
上述控制信息数据包括:最新参数所在内存块ID、临界资源锁、参数(PO)个数N、上次死锁解除时刻和更新标记,0号数据内存块与1号数据内存块内数据包括:内存大小和key、各参数偏移量、各参数记录数以及各参数客户端的注册信息;结合图2,参数客户端进程注册信息包括进程启动信息、进程ID、更新线程状态、上次更新完成时刻、上次检查更新时刻、进程使用参数内存块ID、线程集合和线程集合内各元素对应的使用参数内存块ID;
实时系统中参数数据更新包括参数客户端的参数更新,以及参数服务器端的参数更新;
参数客户端的参数更新参考图3,包括进程探测和线程探测,其中:
进程探测步骤为:进程中的更新线程检测本进程使用内存块ID与参数服务器端控制区内存的最新参数所在内存块ID是否一致,如果不一致则更新为最新参数所在内存块ID,并等待各业务线程完成线程探测步骤;如果等待超时则强制将对应业务线程所用内存块ID更新为进程使用内存块ID;
线程探测步骤为:各业务线程检测本线程所用内存块ID与其所属进程使用参数内存块ID是否一致,如果不一致则更新为其所属进程当前所用参数内存块ID;
参数服务器端的参数更新参考图4,包括以下步骤:
a)根据控制内存的更新标记判断是否需要进行参数更新:如果不需要,则执行进入指定时间的睡眠状态,重复步骤a);
如果需要进行参数更新,则执行步骤b);
b)检测控制内存的参数客户端注册信息里各个线程使用参数内存块ID与控制内存的最新参数所在内存块ID是否一致:
如果不一致则执行进入指定时间的睡眠状态,等待参数客户端完成更新参数,如果等待超过指定时间则强制将控制内存的参数客户端注册信息里各个线程使用参数内存块ID变更为控制内存的最新参数所在内存块ID,然后执行步骤c),如果等待未超过指定时间则重复步骤b);
如果一致,则执行步骤c);
c)从参数源拉取各参数记录总数,从而获得存放参数的数据内存所需容量S,假设控制内存的最新参数所在内存ID为0,即位于0号内存中,如果S比1号内存容量大,则重建1号内存至容量至少为S;同理控制内存的最新参数所在内存ID为1,如果S比0号内存容量大,则重建0号内存至容量至少为S;
d)从参数源拉取各参数并完成检错、排序和模型建立,变更最新参数所在内存块ID,然后重复步骤b)至d);
参考图5,本发明实时系统中,参数服务器端运行的进程或线程以及参数客户端运行的进程或线程,通过搜索部件、参数注册部件以及内存连接部件访问数据内存块中的参数数据以及控制信息数据;数据访问过程采用了参数注册部件、搜索部件、连接部件、数据拉取检错排序建模分离的机制,访问过程中:
搜索部件从参数注册部件中获取可访问的参数集合及每个参数偏移量和记录数,以定位到参数数据所在的数据内存块进行数据访问;
参数注册部件声明需要加载的参数数据,并为每个参数数据分配一个唯一的身份ID,如从0开始分配设置;
客户端及服务器端运行的进程或线程依次通过搜索部件、参数注册部件和内存连接部件访问0号数据内存块和1号数据内存块中的参数数据;
客户端参数更新线程以及服务器端进程分别依次通过搜索部件和内存连接部件访问控制内存块中的控制信息数据。
上述参数注册部件为每个参数数据分配的唯一身份ID,可用于在参数服务器端或参数客户端在访问控制内存块时能够快速定位各参数数据对应的控制信息数据。客户端参数更新线程依次通过搜索部件和连接部件读写自己在控制内存块中的客户端注册信息,以完成参数更新操作,将自己在控制内存块中的客户端注册信息中“进程使用参数内存块ID”改写成与“最新参数所在内存块ID”一致;服务器端进程依次通过搜索部件和内存连接部件对控制内存块进行读写操作。
通过内存连接部件、搜索部件,本发明实现了数据内存块对参数服务器端和参数客户端的信息透明化;通过搜索部件业务线程可以透明地访问参数,而不用关心参数是放在0号数据内存块还是1号数据内存块,参数客户端可以快速的查找到所需要的参数数据,参数服务器端可以快速完成模型建立操作;
通过在参数注册部件声明需要加载的参数,参数服务器端可以得知需要从参数源拉取哪些参数,参数客户端可以得知可以访问哪些参数。
上述访问机制使得参数服务器端能够迅速从参数源拉取数据,并完成检错排序建模;参数客户端无需再去建模,提高数据处理效率。
如果参数服务器端只是拉取数据,不完成检错排序建模,则每个参数客户端都需要做相同的事情。例如:如果参数服务器端没有完成检错排序建模,电信行业计费系统接受到一条用户的gprs话单,首先需要搜索该用户的套餐的参数信息,然后再搜索该套餐的具体组成(语音,短信,gprs等),匹配到gprs后再搜索gprs对应的费率信息,每个参数客户端都需要进行多次搜索,而参数服务器端完成了建模工作,则参数客户端只需要一次搜索就可以得到所需要的所有信息,大大提高了生成效率。
在实时系统里面,阻塞业务线程会带来很坏的影响。例如:电信行业的在线计费系统,会在每个用户电话拨通前进行鉴权,如果在某个时刻,某省有1000个用户在拨打电话,在线计费系统的业务线程阻塞的去更新参数,如果该阻塞耗时1秒,则这1000个用户电话拨通耗时就会多1秒。
基于本发明的内存块设置方式,本发明对于参数数据的存放方式分为共享内存方式和私有内存方式。为了防止业务线程阻塞,本发明参数数据的存放方式可根据一台主机上需要访问相同参数的进程数是否大于1来判断,如果大于1,则采用共享内存存放模式进行参数数据的存放;如果等于1,则采用私有内存存放模式进行参数数据的存放。另外如果为了维护方便(方便查看参数数据正确性等),在等于1的情况下也同样可以采用共享内存存放模式进行参数数据的存放。
共享内存方式下,本发明将所述0号数据内存块以及1号数据内存块中,其一用于存储参数服务器端接收的最新参数数据,另一数据内存块用于存储参数服务器端最近一次更新后的参数数据,以提供给参数客户端进行数据访问。具体为:
例如有一份参数在2014-10-16 00:00:00开始生效,参数记录带有生效时间字段为2014-10-16 00:00:00,维护人员在2014-10-15 12:00:00时将参数更新入数据库,
假设服务端是定时每5分钟检测是否需要更新参数,当前最新参数所在内存块ID为0,
参数服务端在2014-10-15 12:05:00左右检测到需要数据更新标记后话费5分钟将新参数加载到1号内存块,2014-10-15 12:10:00之后客户端无需停止应用就可以读取到新的参数记录。
不需要重新启动客户端或者停止业务线程去拉取参数,如果一天更新10次参数,每次更新花费5分钟,采用2块数据内存块存放新老2份参数的机制每天就可以节省50分钟的时间用于业务生产。
又如某系统有20台生产主机,每台主机运行10个需要访问参数的进程,每份参数需要消耗内存512M,则共需要消耗20X 10X 512M(100G)的内存,如果检测到需要更新参数,则会有200个进程从参数源拉取参数。即一台主机上访问同一份参数的进程大于1个,采用本发明的共享内存方式,则每台主机上只需0号数据内存块、1号数据内存块、控制内存块(控制内存块只存很少的数据,假设20M)共1044M,整个系统共需要消耗:20X 1044M((约20.4G),内存使用率提高约80%,网络使用率和cpu使用率提高约80%。原来200个进程拉取200份数据,采用本发明后只需要20个进程拉取20份。
私有内存方式下客户端进程和服务器端进程实际为同一个进程,且只有一个客户端进程;客户端更新线程和服务端更新线程实际合并为同一个线程;且不存在进程探测。具体为:
例如假设控制内存的最新参数所在内存块ID在2014-10-15 12:10:00由参数服务端由0更新为1后,参数客户端更新线程在2014-10-15 12:10:03检测到该变化,则客户端更新线程连接上1号数据内存块并将本客户单对应的进程使用参数内存块ID变更为1,紧接着参数客户端业务线程检测到本进程使用参数内存块ID与本业务线程使用参数内存块ID不同后将本业务线程使用参数内存块ID变更为1,待该参数客户端所有业务线程完成变更后,参数客户端更新线程断开与0号数据内存块的连接,这样无须阻塞业务线程。
上述两种内存存放方式皆能够实现参数更新过程中将进程级标志位与线程级标志位相结合完成参数数据的非阻塞更新。
本发明通过改善参数存放机制,配合进程级、线程级标志位,以及数据注册、搜索、拉取建模连接分离的机制,实现非阻塞的参数更新,避免参数更新导致系统停止、业务处理中断或参数更新互斥。