京东到家购物车日志优化实践
Posted 达达集团技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了京东到家购物车日志优化实践相关的知识,希望对你有一定的参考价值。
生产环境排查问题往往都是通过日志,但对于巨大的日志量,如何实现针对某一个操作进行整个日志链路的追踪就显得尤为重要。
Log4j2提供的日志追踪方案是NDC和MDC,但仅限于当前线程内的数据传递(其底层原理是维护一个ThreadLocalMap),如果是父子线程之间的调用,就无法完成完整的链路追踪工作。
购物车使用 TTL(TransmittableThreadLocal) + 线程池 + Log4j2 来解决这个问题
ThreadLocal:解决的是每个线程可以拥有自己线程的变量实例。
可以从隔离的角度解决变量线程安全的问题。
优点:解决了当前线程的值传递
缺点:不支持子线程
InheritableThreadLocals:其设计的初衷是为了增强ThreadLocal类型,使其具备变量可以被子线程继承的特性,具体表现为当前线程创建子线程的时候,会把ThreadLocal快照拷贝一份到子线程的ThreadLocal中,但是对于使用复用线程的执行组件时,ITL的值传递已经不起作用。
优点:支持新建子线程的值传递
缺点:不支持线程池
TransmittableThreadLocal: 为了进一步增强InheritableThreadLocals,使其能够在提交任务到线程池的时候拷贝“任务提交者(通常为主线程)”的线程变量,因此会在当前线程创建任务的时候初始化,即构造Runnable接口的对象时初始化。(因继承ITL,会有ITL特性,当线程池新建线程执行任务时,即使不改造线程池仍然会有主线程快照,但是会存在脏数据)
优点:支持子线程、线程池的值传递
缺点:需要改造线程池代码
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)
(服务器配置 4c8g磁盘50G 12并发tp99)
直播预告丨京东到家支付平台的高可用架构设计实践
新兴互联网金融业务的迅速崛起,对支付服务提出更高的要求,原有的系统架构很难满足快速变化、日益复杂的新兴业务需求;与此同时,随着用户量、业务量爆炸式增长,系统的处理容量的稳定运行也面临巨大考验。
6月23日晚8点,京东到家高级工程师 郑志成将分享京东到家支付平台整体能力介绍,剖析多端支付场景的强一致性架构设计思路及解决方案,以及支付平台可靠性、稳定性优化实战分析。
主题:京东到家支付平台的高可用架构设计实践
讲师:京东到家 高级工程师 郑志成
时间:6月23日周三晚8点
-
地点:线上网络直播间
郑志成
京东到家 高级工程师
1、分享有礼
2、在线提问
群里和直播间的朋友可以获得在线向老师提问的机会,老师会当场回答,后续dbaplus社群会将问答整理成文分享给更多朋友。
3、填问卷有奖
直播结束后可填写观后感,我们会从优质,走心的观后感中送出技术书籍。
↓点击阅读原文,获取回看链接
以上是关于京东到家购物车日志优化实践的主要内容,如果未能解决你的问题,请参考以下文章