高并发下服务端日志记录的优化方法及系统与流程

文档序号:33040072发布日期:2023-01-24 21:11阅读:61来源:国知局
高并发下服务端日志记录的优化方法及系统与流程

1.本发明涉及通信技术领域,具体地,涉及一种高并发下服务端日志记录的优化方法及系统。


背景技术:

2.在现在很多系统都存在有对应的服务端,而每一个服务端系统中都存在有需要打印日志的功能,或者各种开源软件也都存在打印日志的功能。对于不重要的日志信息,现在的做法是主线程直接打印日志,为了防止日志打印影响主线程,更优解决方式是主线程同步写入本地队列,存在独立的异步线程消费本地队列中的消息打印日志。如果日志消息可丢失或者可不准确,可以使用如上的更优解方式,但是,类似某些数据库或者消息中间件中,通常都是使用多线程方式进行业务处理,并记录日志的,但是都需要使用精确的日志记录方式,在现在的更优解方式上,只能针对本地队列进行全局加锁,即写消息时,需要对本地队列进行全局加锁,消费消息时也需要对本地队列进行全局加锁。在非高并发场景下,该种方式能够确保消息的安全与精确性,但是会影响业务的吞吐能力。
3.现有技术中高并发场景下,为了保证多线程场景下对本地队列的安全竞争,会对整个本地队列进行加锁处理,因为只有加锁条件下,才能让同一时刻只有一个线程对于此队列进行访问,此时,会影响日志写入的吞吐能力。
4.公开号为cn111699479a的专利文献公开了一种日志处理方法、设备及计算机可读存储介质,该方法包括:客户端通过预设的调用接口向服务端发送注册请求;所述服务端接收客户端发送的注册请求;所述服务端根据所述注册请求为所述客户端申请共享内存;当所述共享内存申请成功后,所述服务端向所述客户端发送注册成功信息;所述客户端当接收到所述服务端反馈的注册成功信息时,将所述客户端的日志信息写入所述共享内存中;所述服务端从所述共享内存中获取所述日志信息,并存储至预设的存储路径。但是该专利文献与本技术的技术方案不同。


技术实现要素:

5.针对现有技术中的缺陷,本发明的目的是提供一种高并发下服务端日志记录的优化方法及系统。
6.根据本发明提供的一种高并发下服务端日志记录的优化方法,包括如下步骤:
7.步骤1:在需发送消息的线程中增加threadlocal功能,通过threadlocal功能,在每一个业务线程中独立设置一个局部日志队列,并增加写入日志消息方法和读取日志消息方法;
8.步骤2:当业务线程需要记录日志时,均向自身业务线程中的局部日志队列记录消息;当自身线程中的局部日志队列中消息达到阀值时,通知日志消费队列到自身日志消费线程中的局部变量获取消息。
9.优选的,所述步骤2中,日志消费队列每隔预设时间到各个业务线程的局部队列中
获取消息,并进行消息的消费处理。
10.优选的,所述写入日志消息方法具体为:通过threadlocal中的set方法向自身业务线程的局部队列中写入消息;
11.所述读取日志消息方法具体为:使用threadlocal中的get方法从自身业务线程的局部队列中读取消息。
12.优选的,所述写入日志消息方法具体包括如下步骤:
13.步骤2.1:写入日志消息至本地局部队列中;
14.步骤2.2:检查本地局部队列中,消息总数量是否达到阀值;
15.步骤2.3:当本地局部队列中消息总数量未达到阀值,则无需后续处理,当达到阀值时,发送通知消息至日志消费线程,本流程结束。
16.优选的,日志消费线程存在如下两种消费日志消息的方式:
17.主动方式:消费线程每隔预设时间,调用读取日志消息方法读取消费业务线程中本地局部队列中的消息,并进行日志的打印操作;
18.被动方式:当消费线程获取到步骤2.3中的通知消息时,调用读取日志消息方法读取消费业务线程中本地局部队列中的消息,并进行日志的打印操作。
19.优选的,读取日志消息方法内部流程为:读取本地局部队列中消息,并删除队列中已经消费的消息记录。
20.本发明还提供一种高并发下服务端日志记录的优化系统,包括如下模块:
21.模块m1:在需发送消息的线程中增加threadlocal功能,通过threadlocal功能,在每一个业务线程中独立设置一个局部日志队列,并增加写入日志消息模块和读取日志消息模块;
22.模块m2:当业务线程需要记录日志时,均向自身业务线程中的局部日志队列记录消息;当自身线程中的局部日志队列中消息达到阀值时,通知日志消费队列到自身日志消费线程中的局部变量获取消息。
23.优选的,所述模块m2中,日志消费队列每隔预设时间到各个业务线程的局部队列中获取消息,并进行消息的消费处理。
24.优选的,所述写入日志消息模块具体执行如下过程:通过threadlocal中的set方法向自身业务线程的局部队列中写入消息;
25.所述读取日志消息模块具体执行如下过程:使用threadlocal中的get方法从自身业务线程的局部队列中读取消息。
26.优选的,所述写入日志消息模块具体包括如下模块:
27.模块m2.1:写入日志消息至本地局部队列中;
28.模块m2.2:检查本地局部队列中,消息总数量是否达到阀值;
29.模块m2.3:当本地局部队列中消息总数量未达到阀值,则无需后续处理,当达到阀值时,发送通知消息至日志消费线程,本流程结束。
30.与现有技术相比,本发明具有如下的有益效果:
31.1、本发明写入以及消费消息通过threadlocal功能,以自身线程提供的消息写入以及消费方法,均保证了同一时刻只有自身线程能够操作本地局部队列,无需针对队列进行加锁解锁;
32.2、本发明在高并发场景之下,能够很好的提高业务吞吐,减少业务部分场景下的毛刺问题;
33.3、本发明的消息的写入与读取都由业务线程自身所完成,避免了多线程写入与读取需要加锁的场景,在高并发场景之下,能够很好的提高业务吞吐,减少业务部分场景下的毛刺问题;
34.4、本发明针对每一个线程自身的threadlocal进行消息的写入与读取,因为threadlocal中天然的线程数据隔离,无需再次进行加锁操作,各个线程只需要写入自身的threadlocal中即可实现无锁数据写入,进一步提高了写入效率。
附图说明
35.通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
36.图1为本发明的高并发下服务端日志记录的优化方法的步骤流程图。
具体实施方式
37.下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。
38.实施例1:
39.如图1所示,本实施例提供一种高并发下服务端日志记录的优化方法,包括如下步骤:
40.步骤1:在需发送消息的线程中增加threadlocal功能,通过threadlocal功能,在每一个业务线程中独立设置一个局部日志队列,并增加写入日志消息方法和读取日志消息方法;写入日志消息方法具体为:通过threadlocal中的set方法向自身业务线程的局部队列中写入消息;写入日志消息方法具体包括如下步骤:
41.步骤2.1:写入日志消息至本地局部队列中;
42.步骤2.2:检查本地局部队列中,消息总数量是否达到阀值;
43.步骤2.3:当本地局部队列中消息总数量未达到阀值,则无需后续处理,当达到阀值时,发送通知消息至日志消费线程,本流程结束;
44.读取日志消息方法具体为:使用threadlocal中的get方法从自身业务线程的局部队列中读取消息;
45.日志消费线程存在如下两种消费日志消息的方式:
46.主动方式:消费线程每隔预设时间,调用读取日志消息方法读取消费业务线程中本地局部队列中的消息,并进行日志的打印操作;
47.被动方式:当消费线程获取到步骤2.3中的通知消息时,调用读取日志消息方法读取消费业务线程中本地局部队列中的消息,并进行日志的打印操作;
48.读取日志消息方法内部流程为:读取本地局部队列中消息,并删除队列中已经消费的消息记录。
49.步骤2:当业务线程需要记录日志时,均向自身业务线程中的局部日志队列记录消息;当自身线程中的局部日志队列中消息达到阀值时,通知日志消费队列到自身日志消费线程中的局部变量获取消息;日志消费队列每隔预设时间到各个业务线程的局部队列中获取消息,并进行消息的消费处理。
50.本实施例还提供一种高并发下服务端日志记录的优化系统,所述高并发下服务端日志记录的优化系统可以通过执行所述高并发下服务端日志记录的优化方法的流程步骤予以实现,即本领域技术人员可以将所述高并发下服务端日志记录的优化方法理解为所述高并发下服务端日志记录的优化系统的优选实施方式。
51.实施例2:
52.本实施例提供一种高并发下服务端日志记录的优化系统,包括如下模块:
53.模块m1:在需发送消息的线程中增加threadlocal功能,通过threadlocal功能,在每一个业务线程中独立设置一个局部日志队列,并增加写入日志消息模块和读取日志消息模块;写入日志消息模块具体执行如下过程:通过threadlocal中的set方法向自身业务线程的局部队列中写入消息;
54.读取日志消息模块具体执行如下过程:使用threadlocal中的get方法从自身业务线程的局部队列中读取消息;
55.写入日志消息模块具体包括如下模块:
56.模块m2.1:写入日志消息至本地局部队列中;
57.模块m2.2:检查本地局部队列中,消息总数量是否达到阀值;
58.模块m2.3:当本地局部队列中消息总数量未达到阀值,则无需后续处理,当达到阀值时,发送通知消息至日志消费线程,本流程结束。
59.模块m2:当业务线程需要记录日志时,均向自身业务线程中的局部日志队列记录消息;当自身线程中的局部日志队列中消息达到阀值时,通知日志消费队列到自身日志消费线程中的局部变量获取消息;日志消费队列每隔预设时间到各个业务线程的局部队列中获取消息,并进行消息的消费处理。
60.实施例3:
61.本领域技术人员可以将本实施例理解为实施例1、实施例2的更为具体的说明。
62.本实施例提供一种新的日志记录方式,以java语言为例,通过threadlocal功能,在每一个业务线程中独立设置一个局部日志队列,当业务线程需要记录日志时,均向自身业务线程中的局部日志队列记录消息,(由于threadlocal中记录的数据已经是天然线程隔离的,所以不需要进行写入加锁);当自身线程中的局部日志队列中消息达到阀值时,通知日志消费队列到自身线程中的局部变量获取消息;同时,日志消费队列每隔一段时间也会到各个业务线程的局部队列中获取消息,并进行消息的消费处理。
63.通过如上方式,写入以及消费消息通过threadlocal功能,以自身线程提供的消息写入以及消费方法,均保证了同一时刻只有自身线程能够操作本地局部队列,无需针对队列进行加锁解锁,在高并发场景之下,能够很好的提高业务吞吐,减少业务部分场景下的毛刺问题。
64.以java语言为例:
65.1、在需发送消息的线程中新增加threadlocal功能,并需要至少提供两个新方法:
写入日志消息和读取日志消息;
66.写入日志消息:私有方法,向自身线程的局部队列中写入消息,主要使用threadlocal中的set方法;因为该方法私有,所以该方法只供自身线程调用;
67.读取日志消息:公有方法,从自身线程的局部队列中读取消息,主要使用threadlocal中的get方法;因为该方法公有,所以该方法可供外部线程调用。
68.2、当业务线程需要记录日志时,组装日志数据,调用写入日志消息方法,该方法内部主要流程为:
69.2.1、写入日志消息至本地局部队列中;
70.2.2、检查本地局部队列中,消息总数量是否达到阀值(具体阀值根据业务而定,这边假设阀值为20);
71.2.3、当本地局部队列中消息总数量未达到阀值,则无需后续处理,当达到阀值时,发送通知消息至日志消费线程,本流程结束。
72.3、日志消费线程存在两种消费日志消息的方式,一种主动,一种被动:
73.主动方式:消费线程每隔一定的时间,(具体数值根据业务而定,这边假设数值为3秒),调用读取日志消息方法,消费业务线程中本地局部队列中的消息,并进行日志的打印操作;
74.被动方式:当消费线程获取到步骤2.3中的通知消息时,调用读取日志消息方法,消费业务线程中本地局部队列中的消息,并进行日志的打印操作;
75.其中读取日志消息方法内部主要流程为:
76.3.1、读取本地局部队列中消息,并删除队列中已经消费的消息记录。
77.4、由于消息的写入与读取都有业务线程自身所完成,避免了多线程写入与读取需要加锁的场景,在高并发场景之下,能够很好的提高业务吞吐,减少业务部分场景下的毛刺问题。
78.本发明避免了多线程写入与读取需要加锁的场景,在高并发场景之下,能够很好的提高业务吞吐,减少业务部分场景下的毛刺问题。
79.本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统及其各个装置、模块、单元以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统及其各个装置、模块、单元以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同功能。所以,本发明提供的系统及其各项装置、模块、单元可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置、模块、单元也可以视为硬件部件内的结构;也可以将用于实现各种功能的装置、模块、单元视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
80.以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本技术的实施例和实施例中的特征可以任意相互组合。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1