百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

高并发系统怎么选日志框架?(高并发系统设计全彩版手册)

ccwgpt 2024-10-01 08:13 37 浏览 0 评论

经常遇到小伙伴在完成接口开发后通过Jmeter进行性能压测,压测发现TPS上不去,少则几十多则一两百,这在高并发系统中远远不够的。很大一部分原因是使用了不合适的log日志组件,一般开发人员很难想到到这点。下面就带你选择合适的日志组件让你的接口性能提升几倍甚至几十倍。

首先看看我们日常使用的日志组件。

log4j、logback、log4j2日志对比:

1.log4j: 这是Java中最早的日志框架之一,提供了可靠、快速且灵活的日志记录功能。它广泛用于许多不同的Java应用程序中。

2.logback: logback是log4j的一个改进版,由相同的原创者设计。它被设计为更加灵活且具有更好性能,特别是在日志轮换和条件日志处理方面。logback直接实现了SLF4J API,这意味着你可以很容易地将log4j或其他日志系统替换为logback。logback的默认配置要比log4j快几倍,而且logback的配置文件可以在出错时不需要完全解析,可以提高应用程序的健壮性。

3.log4j2: 这是log4j的升级版,完全重写了代码以提供更高的性能和更多的功能。它支持异步日志记录和更复杂的配置,同时也保持向后兼容性。log4j2 也使用了SLF4J API,提供了更多的灵活性和更好的资源管理。

log4j和logback是同步框架,如果选择这个两个组件作为项目的日志组件,通过jmeter进行高并发压测时可以通过jvm的jstack命令观察应用程序的线程栈,会发现有大量的IO写日志线程阻塞,例子如下:


日志的IO线程阻塞,这就导致很多的请求不能及时处理,极大降低了接口的TPS,这也就是压测时导致TPS上不去的根本原因。

怎样解决日志IO阻塞问题,同步改异步使用log4j2,log4j2的异步日志是通过队列来处理,log4j2支持以下四队列

1.DisruptorBlockingQueue 基于disruptor实现的高性能队列。

2.JCToolsBlockingQueue基于JCTools 实现的无锁队列。

3.LinkedTransferQueue是Java原生的LinkedTransferQueue 实现。

4.ArrayBlockingQueue是Java 原生的 ArrayBlockingQueue 实现。

在项目实践,disruptor队列性能是远超另外三种队列,disruptor是高性能环形队列,每秒能处理500-600万订单。这里着重介绍log4j2+disruptor的使用方案。

springboot集成log4j2+disruptor解决方案

1.引入pom

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    <!-- disruptor -->
    <dependency>
        <groupId>com.lmax</groupId>
        <artifactId>disruptor</artifactId>
    </dependency>

2.排除logback

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <!-- 排除掉logging,不使用logback-->
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <exclusions>
            <!-- 排除掉logging,不使用logback -->
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
    有其他组件使用了logback也要一并排除

3.开启全局异步

@SpringBootApplication
public class BootLaunchApplication {
   public static void main(String[] args) {
      //下面语句使得Log4j2日志输出使用异步处理
      System.setProperty("Log4jContextSelector","org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
      SpringApplication.run(BootLaunchApplication.class, args);
   }
}

如果不使用全局异步,可以开启局部异步,需要在log4j2.xml中配置

<Loggers>
    <AsyncRoot level="INFO">
        <appender-ref ref="Console"/>
        <appender-ref ref="errorAppender"/>
        <appender-ref ref="applicationAppender"/>
    </AsyncRoot>

    <AsyncLogger name="org.apache" level="INFO" additivity="false">
        <AppenderRef ref="apacheAppender"/>
    </AsyncLogger>
</Loggers>

4.配置log4j2.xml其他参数

做完以上操作后,在进行压测会发现TPS增加几倍甚至几十倍。

相关推荐

自己动手写Android数据库框架_android开发数据库搭建

http://blog.csdn.net/feiduclear_up/article/details/50557590推荐理由关于Android数据库操作,由于每次都要自己写数据库操作,每次还得去...

谷歌开源大模型评测工具LMEval,打通谷歌、OpenAI、Anthropic

智东西编译|金碧辉编辑|程茜智东西5月28日消息,据科技媒体TheDecoder5月26日报道,当天,谷歌正式发布开源大模型评测框架LMEval,支持对GPT-4o、Claude3.7...

工信部:着力推动大模型算法、框架等基础性原创性的技术突破

工信部新闻发言人今日在发布会上表示,下一步,我们将坚持突出重点领域,大力推动制造业数字化转型,推动人工智能创新应用。主要从以下四个方面着力。一是夯实人工智能技术底座。通过科技创新重大项目,着力推动大模...

乒乓反复纠结“框架不稳定”的三个小误区

很多球友由于对框架的认知不清晰,往往会把“框架不稳定”当成一种心理负担,从而影响学球进度,其典型状态就是训练中有模有样,一旦进入实战,就像被捆住了手脚。通过训练和学习,结合“基本功打卡群”球友们交流发...

前AMD、英特尔显卡架构师Raja再战GPU,号称要全面重构堆栈

IT之家8月5日消息,知名GPU架构师拉贾科杜里(RajaKoduri)此前曾先后在AMD和英特尔的显卡部门担任要职。而在今日,由Raja创立的GPU软件与IP初创企...

三种必须掌握的嵌入式开发程序架构

前言在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架构不仅结构清晰,并且便于开发。我相...

怪不得别人3秒就知道软考案例怎么做能50+

软考高级统一合格标准必须三科都达到45分,案例分析也一直是考生头疼的一门,但是掌握到得分点,案例能不能50+还不是你们说了算吗?今天就结合架构案例考点,分享实用的备考攻略~一、吃透考点,搭建知识框架从...

UML统一建模常用图有哪些,各自的作用是什么?一篇文章彻底讲透

10万+爆款解析:9大UML图实战案例,小白也能秒懂!为什么需要UML?UML(统一建模语言)是软件开发的“蓝图”,用图形化语言描述系统结构、行为和交互,让复杂需求一目了然。它能:降低沟通成本避...

勒索软件转向云原生架构,直指备份基础设施

勒索软件组织和其他网络犯罪分子正越来越多地将目标对准基于云的备份系统,对久已确立的灾难恢复方法构成了挑战。谷歌安全研究人员在一份关于云安全威胁演变的报告中警告称,随着攻击者不断改进数据窃取、身份泄露和...

ConceptDraw DIAGRAM:释放创意,绘就高效办公新未来

在当今数字化时代,可视化工具已成为提升工作效率和激发创意的关键。ConceptDrawDIAGRAM,作为一款世界顶级的商业绘图软件,凭借其强大的功能和用户友好的界面,正逐渐成为众多专业人士的首选绘...

APP 制作界面设计教程:一步到位_app界面设计模板一套

想让APP界面设计高效落地,无需繁琐流程,掌握“框架搭建—细节填充—体验优化”三步法,即可一步到位完成专业级设计。黄金框架搭建是基础。采用“三三制布局”:将屏幕横向三等分,纵向保留三...

MCP 的工作原理:关键组件_mcp部件

以下是MCP架构的关键组件:MCP主机:像ClaudeDesktop、GitHubCopilot或旅行助手这样的AI智能体,它们希望通过MCP协议访问工具、资源等。MCP主机会...

软件架构_软件架构师工资一般多少

软件架构师自身需要是程序员,并且必须一直坚持做一线程序员。软件架构应该是能力最强的一群程序员,他们通常会在自身承接编程任务的同时,逐渐引导整个团队向一个能够最大化生产力的系统设计方向前进。软件系统的架...

不知不觉将手机字体调大!老花眼是因为“老了吗”?

现在不管是联系、交友,还是购物,都离不开手机。中老年人使用手机的时间也在逐渐加长,刷抖音、看短视频、发朋友圈……看手机的同时,人们也不得不面对“视力危机”——老花眼,习惯眯眼看、凑近看、瞪眼看,不少人...

8000通用汉字学习系列讲座(第046讲)

[表声母字]加(续)[从声汉字]伽茄泇迦枷痂袈笳嘉驾架咖贺瘸(计14字)嘉[正音]标准音读jiā。[辨形]上下结构,十四画。会意形声字,从壴从加,加也表声。注:从壴,字义与鼓乐有关;从加,字义与...

取消回复欢迎 发表评论: