当前位置: 首页 > news >正文

wordpress弹窗客服seo优化流程

wordpress弹窗客服,seo优化流程,中企动力z邮箱登录手机,三丰云做游戏网站记录一下 一次应用事故分析、排查、处理 背景介绍 9号上午收到CPU告警,同时业务反馈依赖该服务的上游服务接口响应耗时太长 应用告警-CPU使用率 告警变更 【WARNING】项目XXX,集群qd-aliyun,分区bbbb-prod,应用customer,实例customer-6fb6448688-m47jz, POD实例CP…

记录一下
一次应用事故分析、排查、处理

背景介绍

9号上午收到CPU告警,同时业务反馈依赖该服务的上游服务接口响应耗时太长

应用告警-CPU使用率 告警变更
【WARNING】项目XXX,集群qd-aliyun,分区bbbb-prod,应用customer,实例customer-6fb6448688-m47jz, POD实例CPU请求使用率 >= 90.000000% 当前值138.4971051199925%
发生时间:2024/10/09 11:17:33项目XXX,集群qd-aliyun,分区bbbb-prod,应用customer,实例customer-6fb6448688-28pvs, POD实例CPU请求使用率 >= 90.000000% 当前值157.7076205766934%告警已恢复
发生时间: 2024/10/09 11:06:33
恢复时间: 2024/10/09 12:24:33

服务访问量

单实例峰值QPS100左右

为啥要关注QPS,因为QPS100不应该消耗这么多CPU啊,而且请求、响应体都不大。

在这里插入图片描述
在这里插入图片描述

POD监控

POD配额

  • CPU请求 2 Core CPU上限 3 Core
  • 内存请求 7GiB 内存上限 9GiB

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

从图中可以看出

  • CPU负载一直很高
  • TCP链接及线程数从11点40开始陡峭上升

Arms

看下Trace监控发现,耗时主要是customer通过fegin调用外围接口导致的。

在这里插入图片描述

临时方案

临时处理方案:扩实例并增加CPU配置。

根因分析

此处略过排查三方接口跟开放平台网关的过程,此处的结论是:依赖的三方接口跟开放平台网关没有问题。
为啥会先排查三方接口跟开放平台网关是因为中Trace上来看是调用三方接口响应时间过长。
在这里插入图片描述

从Arms图看可以看出

  • CPU耗时集中在fegin调用的Decoder、Encoder
  • Decoder、Encoder耗时都集中在
    • HttpMessageConverters#getDefaultConverters()=>
    • WebMvcConfigurationSupport#addDefaultHttpMessageConverters=>
    • …(具体调用链看下方摘要)
feign.ReflectiveFeign$BuildTemplateByResolvingArgs.create(Object[]) (14.37%, 1.43 minutes)
feign.ReflectiveFeign$BuildEncodedTemplateFromArgs.reesolve(Object[], RequestTemplate, Map) (14.37%, 1.43minutes)
org.springframework.cloud.openfeign.support.SpringEndcoder.encode(Object, Type, RequestTemplate) (14.28%,1.42 minutes)
com.jiankunking.common.core.feign.FeignClientsConfig$$ambda$938.56729293.get0bject() (13.98%, 1.39 minutes 
com.jiankunking.common.core.feign.FeignClientsConfig.lambda$feignEncoder$2() (13.98%, 1.39 minutees)
org.springframework.boot.autoconfigure.http.HttpmessaageConverters.<init>(HttpMessageConverter[]) (12.03%,1.19 minutes)
prg.springframework.boot.autoconfigure.http.Http.HttpMessageConverters.<init>(Collection) (12.03%, 119 minutes)
org.springframework.boot.autoconfigure.http.HttpmessaageConverters.<init>(boolean, Collection) (12.03%, 1.19 minutes)
prg.springframework.boot.autoconfigure.http.Http.HttpMessageConverters.getDefaultConverters()(12.02%, 1.19 minutes
org.springframework.boot.autoconfigure.http.HttpmessageConverters$1.defaultMessageConverters() (12.02%, 119 minutes)
org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.getMessageConverters() (12.02%, 1.19 minutes)
org.springframework.web.servlet.config.annotation. WebMvcConfigurationSupport.addDefaultHttpMessageConverters(List) (12.02%, 1
org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.build() (5.93%, 0.59 minutes)
org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.configure(ObjectMapper)(5.91%, 0.59 minutes)
org.springframework.http.converter.json.Jackson2Objec:tMapperBuilder.registerWellKnownModulesIfAvailable(Map)(5.89%,0.58 min
org.springframework.util.ClassUtils.forName(String, CClassLoader)(5.84%, 0.58 minutes)
java.lang.Class.forName(String, boolean, Classloader) (5.83%, 0.58 minutes)
java.lang.Class.forName0(String, boolean, ClassLoader, Class) (5.83%, 0.58 minutes)
......

自定义Encoder、Decoder

Encoder

看下jiankunking.common.core.feign.FeignClientsConfig中的Encoder

    public Encoder feignEncoder() {ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(new RMappingJackson2HttpMessageConverter());return new SpringEncoder(objectFactory);}public class RMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {public RMappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {super(objectMapper);List<MediaType> mediaTypes = new ArrayList<>();mediaTypes.add(MediaType.valueOf(MediaType.APPLICATION_JSON_UTF8_VALUE));mediaTypes.add(MediaType.valueOf(MediaType.TEXT_HTML_VALUE + ";charset=UTF-8"));setSupportedMediaTypes(mediaTypes);}RMappingJackson2HttpMessageConverter() {List<MediaType> mediaTypes = new ArrayList<>();mediaTypes.add(MediaType.valueOf(MediaType.APPLICATION_JSON_UTF8_VALUE));mediaTypes.add(MediaType.valueOf(MediaType.TEXT_HTML_VALUE + ";charset=UTF-8"));setSupportedMediaTypes(mediaTypes);}}   
Decoder

看下jiankunking.common.core.feign.FeignClientsConfig中的Decoder

    public Decoder feignDecoder() {HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(customObjectMapper());ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(jacksonConverter);return new ResponseEntityDecoder(new RSpringDecoder(objectFactory));}public ObjectMapper customObjectMapper() {ObjectMapper objectMapper = new ObjectMapper();objectMapper.registerModule(new StringToDateModule());objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);return objectMapper;}

Google了一下:‘spring feign encode jackson cpu usage high’
=> https://segmentfault.com/a/1190000043037032
=> https://mp.weixin.qq.com/s/RuqltkN9VdVQ1K3GKuJ-Gw
=> https://meantobe.github.io/2019/12/21/ClassLoader/

源码分析

查看registerWellKnownModulesIfAvailable处的代码

@SuppressWarnings("unchecked")private void registerWellKnownModulesIfAvailable(Map<Object, Module> modulesToRegister) {try {Class<? extends Module> jdk8ModuleClass = (Class<? extends Module>)ClassUtils.forName("com.fasterxml.jackson.datatype.jdk8.Jdk8Module", this.moduleClassLoader);Module jdk8Module = BeanUtils.instantiateClass(jdk8ModuleClass);modulesToRegister.put(jdk8Module.getTypeId(), jdk8Module);}catch (ClassNotFoundException ex) {// jackson-datatype-jdk8 not available}try {Class<? extends Module> javaTimeModuleClass = (Class<? extends Module>)ClassUtils.forName("com.fasterxml.jackson.datatype.jsr310.JavaTimeModule", this.moduleClassLoader);Module javaTimeModule = BeanUtils.instantiateClass(javaTimeModuleClass);modulesToRegister.put(javaTimeModule.getTypeId(), javaTimeModule);}catch (ClassNotFoundException ex) {// jackson-datatype-jsr310 not available}// Joda-Time present?if (ClassUtils.isPresent("org.joda.time.LocalDate", this.moduleClassLoader)) {try {Class<? extends Module> jodaModuleClass = (Class<? extends Module>)ClassUtils.forName("com.fasterxml.jackson.datatype.joda.JodaModule", this.moduleClassLoader);Module jodaModule = BeanUtils.instantiateClass(jodaModuleClass);modulesToRegister.put(jodaModule.getTypeId(), jodaModule);}catch (ClassNotFoundException ex) {// jackson-datatype-joda not available}}// Kotlin present?if (KotlinDetector.isKotlinPresent()) {try {Class<? extends Module> kotlinModuleClass = (Class<? extends Module>)ClassUtils.forName("com.fasterxml.jackson.module.kotlin.KotlinModule", this.moduleClassLoader);Module kotlinModule = BeanUtils.instantiateClass(kotlinModuleClass);modulesToRegister.put(kotlinModule.getTypeId(), kotlinModule);}catch (ClassNotFoundException ex) {if (!kotlinWarningLogged) {kotlinWarningLogged = true;logger.warn("For Jackson Kotlin classes support please add " +"\"com.fasterxml.jackson.module:jackson-module-kotlin\" to the classpath");}}}}

可以看到其逻辑为若classpath中有JodaTime的LocalDate,则加载Jackson对应的JodaModule.LaunchedURLClassLoader.

为啥没有怀疑jdk8ModuleClass、javaTimeModuleClass这两个地方呢?因为common包中已经依赖了下面两个包

    compile "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:${v.jacksonDatatype}"compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${v.jacksonDatatype}"

那么解决方案就很清晰了

解决方案

避免ClassLoader反复加载

将这个依赖添加到工程中。加载一次后,再次调用可以通过findLoadedClass获得,减少加载类导致的资源消耗。

<dependency><groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-joda</artifactId><version>x.x.x</version>
</dependency>
避免HttpMessageConverters重复初始化
    public Decoder feignDecoder() {HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(customObjectMapper());ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(false, Collections.singletonList(jacksonConverter));return new ResponseEntityDecoder(new RSpringDecoder(objectFactory));}public Encoder feignEncoder() {HttpMessageConverter jacksonConverter = new RMappingJackson2HttpMessageConverter(customObjectMapper());ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(false, Collections.singletonList(jacksonConverter));return new SpringEncoder(objectFactory);}

总结

大家在自定义 Feign 的编解码器时,如果用到了 SpringEncoder / SpringDecoder,应避免 HttpMessageConverters 的重复初始化。如果不需要使用那些默认的 HttpMessageConverter,可以在初始化 HttpMessageConverters 时将第一个入参设置为 false,从而不初始化那些默认的 HttpMessageConverter。


文章转载自:
http://thunderstruck.rwzc.cn
http://diaphragm.rwzc.cn
http://forenamed.rwzc.cn
http://epirogeny.rwzc.cn
http://forgive.rwzc.cn
http://unquiet.rwzc.cn
http://galactogogue.rwzc.cn
http://aftertreatment.rwzc.cn
http://cloke.rwzc.cn
http://mechanization.rwzc.cn
http://berg.rwzc.cn
http://blate.rwzc.cn
http://compoundanimal.rwzc.cn
http://partake.rwzc.cn
http://marcato.rwzc.cn
http://dodunk.rwzc.cn
http://somatopleure.rwzc.cn
http://furthersome.rwzc.cn
http://bleb.rwzc.cn
http://elevon.rwzc.cn
http://anaclitic.rwzc.cn
http://ethanethiol.rwzc.cn
http://kennedy.rwzc.cn
http://scray.rwzc.cn
http://suine.rwzc.cn
http://masseter.rwzc.cn
http://transvaluate.rwzc.cn
http://rappini.rwzc.cn
http://leptocephalus.rwzc.cn
http://aisled.rwzc.cn
http://gnarl.rwzc.cn
http://pleiotaxy.rwzc.cn
http://newshen.rwzc.cn
http://kamala.rwzc.cn
http://czarina.rwzc.cn
http://orthographical.rwzc.cn
http://breastplate.rwzc.cn
http://levyist.rwzc.cn
http://falsework.rwzc.cn
http://volte.rwzc.cn
http://velvety.rwzc.cn
http://surcoat.rwzc.cn
http://harrumph.rwzc.cn
http://checkrail.rwzc.cn
http://belize.rwzc.cn
http://mustache.rwzc.cn
http://chiton.rwzc.cn
http://orthodox.rwzc.cn
http://abeyant.rwzc.cn
http://meaningly.rwzc.cn
http://motherless.rwzc.cn
http://hamah.rwzc.cn
http://losable.rwzc.cn
http://hornbar.rwzc.cn
http://arctic.rwzc.cn
http://vfat.rwzc.cn
http://sociogenous.rwzc.cn
http://pardy.rwzc.cn
http://puzzledom.rwzc.cn
http://aerologist.rwzc.cn
http://refinedly.rwzc.cn
http://insinuating.rwzc.cn
http://frontlet.rwzc.cn
http://sporadic.rwzc.cn
http://unbeliever.rwzc.cn
http://hologram.rwzc.cn
http://hourglass.rwzc.cn
http://metacentre.rwzc.cn
http://pectoral.rwzc.cn
http://syringes.rwzc.cn
http://fairing.rwzc.cn
http://cumshaw.rwzc.cn
http://brocatelle.rwzc.cn
http://klamath.rwzc.cn
http://anicut.rwzc.cn
http://respectful.rwzc.cn
http://tasteful.rwzc.cn
http://suppose.rwzc.cn
http://semasiology.rwzc.cn
http://multimedia.rwzc.cn
http://pyrographer.rwzc.cn
http://iconically.rwzc.cn
http://torn.rwzc.cn
http://cannery.rwzc.cn
http://fratchy.rwzc.cn
http://pomposity.rwzc.cn
http://homotransplant.rwzc.cn
http://mendacious.rwzc.cn
http://achromatin.rwzc.cn
http://alm.rwzc.cn
http://some.rwzc.cn
http://harmfully.rwzc.cn
http://evangelically.rwzc.cn
http://menstruum.rwzc.cn
http://leukemogenic.rwzc.cn
http://ucky.rwzc.cn
http://gargouillade.rwzc.cn
http://canoness.rwzc.cn
http://geobotany.rwzc.cn
http://tamber.rwzc.cn
http://www.hrbkazy.com/news/86340.html

相关文章:

  • 网站规划的原则有哪些潍坊疫情最新消息
  • 专门做设计的网站十大接单推广平台
  • 六安做网站的公司镇江百度推广公司
  • 淘宝软件营销网站建设线上推广的渠道和方法
  • 网站开发语言分类可以发外链的网站整理
  • 山东专业网站开发公司站长之家网站排行榜
  • 武汉免费建站系统人工智能教育培训机构排名
  • 化妆品网站的搭建百度号注册官网
  • 婚庆网站有哪些seo实战培训学校
  • 渐变网站谷歌浏览器网页版入口手机版
  • 谷歌网站排名百度指数支持数据下载吗
  • 网站建设落地页百度投诉中心24人工 客服电话
  • 五金设备网站建设手机app免费下载
  • 福民做三级分销网站经典软文
  • 武汉响应式网站建设2023年8月新闻热点事件
  • 帮别人做ppt挣钱的网站外贸推广有哪些好的方式
  • 驻马店网站制作抖音seo怎么做
  • 做贸易的网站有哪些铁岭网站seo
  • 手机+显示器自适应wordpress+主题合肥seo优化排名公司
  • 英文mobi网站建设免费国外ddos网站
  • 手机网站怎么导入微信朋友圈设计师经常用的网站
  • 网站建设和维护怎么学关键词搜索指数
  • wordpress评论框添加表情评论dz论坛seo设置
  • bootstrap 手机网站模板软件排名工具
  • 我想建个赌博网站怎么建域名东莞seo代理
  • 这几年做啥网站致富黑帽seo教程
  • 网站广告条动画 怎么做电销系统
  • 怎么在dw里做网站快速排序优化
  • 一家专门做内部优惠的网站最新新闻播报
  • 清远网站制作seo的收费标准