京东到家购物车日志优化实践

Posted 达达集团技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了京东到家购物车日志优化实践相关的知识,希望对你有一定的参考价值。

生产环境排查问题往往都是通过日志,但对于巨大的日志量,如何实现针对某一个操作进行整个日志链路的追踪就显得尤为重要。

  Log4j2提供的日志追踪方案是NDC和MDC,但仅限于当前线程内的数据传递(其底层原理是维护一个ThreadLocalMap),如果是父子线程之间的调用,就无法完成完整的链路追踪工作。

  购物车使用 TTL(TransmittableThreadLocal) + 线程池 + Log4j2 来解决这个问题


2.1 ThreadLocal技术选型
  • ThreadLocal:解决的是每个线程可以拥有自己线程的变量实例。

    可以从隔离的角度解决变量线程安全的问题。 

  •      优点:解决了当前线程的值传递               

         缺点:不支持子线程

  • InheritableThreadLocals:其设计的初衷是为了增强ThreadLocal类型,使其具备变量可以被子线程继承的特性,具体表现为当前线程创建子线程的时候,会把ThreadLocal快照拷贝一份到子线程的ThreadLocal中,但是对于使用复用线程的执行组件时,ITL的值传递已经不起作用。

    优点:支持新建子线程的值传递                

    缺点:不支持线程池

  • TransmittableThreadLocal: 为了进一步增强InheritableThreadLocals,使其能够在提交任务到线程池的时候拷贝“任务提交者(通常为主线程)”的线程变量,因此会在当前线程创建任务的时候初始化,即构造Runnable接口的对象时初始化。(因继承ITL,会有ITL特性,当线程池新建线程执行任务时,即使不改造线程池仍然会有主线程快照,但是会存在脏数据)

    优点:支持子线程、线程池的值传递       

    缺点:需要改造线程池代码

  • 2.2 TTL线程池改造


    2.3 Log4j2 MDC + TTL线程池实现 

      MDC和NDC是Log4j用于存储应用程序的上下文信息,其底层原理是维护一个ThreadLocalMap (ThreadLocal),当使用线程池时,无法获取主线程的值,所以我们利用TTL思想在线程池执行任务之前,copy一份主线程上下文信息快照,并且在执行完线程之后,恢复执行线程备份的变量,解决Log4j2在线程池值传递的问题

      ParallelCallableTask重写Callable任务,所以需要线程池执行Callable任务,改为执行ParallelCallableTask任务

    2.4 链路日志使用

      针对用户每次请求的traceId分析产生问题的具体原因,通过链路日志的改造,traceId贯穿整个业务流程



    三. 测试指标及建议

    3.1 建议

    1. 合理的记录程序运行时的各项参数,可以快速帮我们定位问题原因

    2.日志分级输出,合理调整日志的输出级别,可以减少cpu和磁盘压力

    3.调整日志格式,正确清晰的输出日志,可以减少线上风险,规避性能隐患

    4.Log4j+监控组合使用可以让开发更容易发现问题,解决问题   

    5.如果对日志性能要求高,可以使用异步日志,如果打印过多,要考虑日志分级

    6.改造线程池可以减少系统链路关键字的维护,不需要无限制的透传下去


    3.2 测试指标 

    购物车网关cpu使用率压测结果(服务器配置cpu:4c 内存8g 磁盘50G)


    3.3 Log4j2各项参数测试结果

    (服务器配置 4c8g磁盘50G 12并发tp99)

    直播预告丨京东到家支付平台的高可用架构设计实践


    新兴互联网金融业务的迅速崛起,对支付服务提出更高的要求,原有的系统架构很难满足快速变化、日益复杂的新兴业务需求;与此同时,随着用户量、业务量爆炸式增长,系统的处理容量的稳定运行也面临巨大考验。


    6月23日晚8点,京东到家高级工程师 郑志成将分享京东到家支付平台整体能力介绍,剖析多端支付场景的强一致性架构设计思路及解决方案,以及支付平台可靠性、稳定性优化实战分析。


    活动信息

     

    • 主题京东到家支付平台的高可用架构设计实践

    • 讲师:京东到家 高级工程师   郑志成

    • 时间:6月23日周三晚8点

    • 地点:线上网络直播间


    抢先剧透


    直播预告丨京东到家支付平台的高可用架构设计实践


    讲师信息


    直播预告丨京东到家支付平台的高可用架构设计实践

    郑志成

    京东到家  高级工程师



    直播地址



    直播预告丨京东到家支付平台的高可用架构设计实践


    互动福利


    1、分享有礼




    2、在线提问


    群里和直播间的朋友可以获得在线向老师提问的机会,老师会当场回答,后续dbaplus社群会将问答整理成文分享给更多朋友。


    3、填问卷有奖


    直播结束后可填写观后感,我们会从优质,走心的观后感中送出技术书籍。


    往期直播回看地址



    ↓点击阅读原文,获取回看链接

    以上是关于京东到家购物车日志优化实践的主要内容,如果未能解决你的问题,请参考以下文章

    京东到家基于netty与websocket的实践

    实战案例:京东到家MySQL容器化实践

    京东到家多数据源同步的架构设计与实践

    京东到家基于Netty与WebSocket的实践

    京东「卖家日志」系统的构建 | 流式计算日志系统应用实践

    “淘宝京东”构建流式计算卖家日志系统架构的应用实践