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

ipv6网站建设东莞移动版wordpress主题

ipv6网站建设东莞,移动版wordpress主题,广告模板app,建设电影推荐网站的项目背景Spring Event事件订阅框架#xff0c;被网上一些人快吹上天了#xff0c;然而我们在新项目中引入后发现#xff0c;这个框架缺陷很多#xff0c;玩玩可以#xff0c;千万不要再公司项目中使用。还不如自己手写一个监听者设计模式#xff0c;那样更稳定、可靠。 之前我已…Spring Event事件订阅框架被网上一些人快吹上天了然而我们在新项目中引入后发现这个框架缺陷很多玩玩可以千万不要再公司项目中使用。还不如自己手写一个监听者设计模式那样更稳定、可靠。 之前我已经被Spring Event事件发布订阅组件坑过一次。那次是在服务关闭期间有请求未处理完成当调用Spring Event时出现异常。 根源是Spring关闭期间不得调用GetBean也就是无法使用Spring Event 。详情点击这里查看 然而新项目大量使用了Spring Event在另一个Task服务还未来得及移除Spring Event的情况下出现了类似的问题。 当领导听说新引入的Spring Event再次出现问题时非常愤怒因为一个月内出现了两次故障。在复盘会议上差点爆粗口。 在上线过程中丢消息了 “五哥你看一眼钉钉给你发的监控截图线上好像有丢消息” 旁边同事急匆匆的跟我说。 “线上有问题强哥在上线我让他先暂停下~”于是我赶紧通知强哥先暂停发布。优先排查线上问题~ 怎么会有问题呢我有点意外正好我和强哥各有代码上线我只改动很小一段代码。我对这次代码变更很自信坚信不会有问题所以我并没有慌乱和紧张。搁之前我的小心脏早就怦怦跳了 诡异的情况 出现问题的业务逻辑是 消费A 消息经过业务处理后再发送B消息。 从线上监控和日志分析Task服务收到了 A 消息然后处理失败了。诡异之处是没有任何异常日志和异常打点仿佛凭空消失了。 分析代码分支后我和同事十分确信任何异常退出的代码分支都有打印异常日志和上报异常监控打点出现异常不可能不留一丝痕迹。 正当陷入困境之时我们发现蹊跷之处。“丢消息”的时间只有 3秒钟之后便恢复正常。问题出在启动阶段消息A进入Task服务服务还未完全发布完成时导致不可预测的情况发生。 当分析Spring 源代码以后我们发现原因出在 Spring Event…… 在详细说明问题根源前我简单介绍一下 SpringEvent使用熟悉它的读者可以自行跳过。 Spring Event的简单使用 声明事件 自定义事件需要继承Spring ApplicationEvent。我选择使用泛型支持子类可以灵活关联事件的内容。 发布事件 使用Spring上下文 ApplicationContext发布事件 监听事件 监听器只需要 在方法上声明为 EventListener注解Spring就会自动找到对应的监听器。Spring会根据方法入参的事件类型和 发布的事件类型 自动匹配。 服务启动阶段Spring Event 注册严重滞后 在Kafka 消费逻辑中通过Spring Event发布事件业务逻辑都封装在 Event Listenr 中。经过分析和验证后我们终于发现问题所在。 当Kafka 消费者已经开始消费消息但Spring Event 监听者还没有注册到Spring ApplicationContext中 所以Spring Event 事件发布后没有Event Listener消费该事件。3秒钟以后Event Listener被注册到Spring后异常就消失了。 问题根源在Event Listener 注册的时间点滞后于 init-method 的时间点 init-method ——— Kafka 开始监听的时间点 Kafka 消费者的启动点 在 Spring init-method中例如下面的 XML中init-method 声明 HelloConsumer 的初始化方法为 init方法。在该方法中注册到Kafka中抢占分片开始消费消息。 bean idkafkaConsumer classcom.helloworld.KafkaConsumer init-methodinit destroy-methoddestroy 如果在init-method 方法中成功注册到Kafka抢占到分片然而 Spring Event Listener还未注册到Spring 就会 “Spring事件丢失” 的现象。 EventListener注册到Spring 的时间点 在Spring的启动过程中EventListener 的启动点滞后于 init-method 。如下图Spring的启动顺序所示。 其中init-method在InitializingBean中被触发而 EventListener 在 SmartInitializingSingleton 中初始化。由于启动顺序的先后关系当init-method的执行时间较长时例如连接超时就会出现Kafka已开始消费但EventListener还未注册的问题。 Spring 启动顺序 InitializingBean 的初始化代码 通过分析 Spring源代码。InitializingBean 阶段 invokeInitMethod 会执行init-method方法Kafka消费者就是在init-method 执行完成后开始消费kafka消息。 SmartInitializingSingleton 继续分析Spring源代码。 EventListenerMethodProcessor 是 SmartInitializingSingleton 子类该类负责解析Spring 中所有的Bean如果有方法添加EventListener注解则将 EventListener方法 注册到 Spring 中 以下是代码截图 Spring Event很好我劝你别用 通过代码分析可以发现在Spring中init-method方法会先执行然后才会解析和注册Event Listener。因此在消费Kafka和注册EventListener之间存在一个时间间隔如果在这期间发布了Spring Event该事件将无法被消费。 通常情况下这个时间间隔非常短暂但是当init-method执行较慢时比如Kafka消费者 A 初始化很快但是Kafka消费者 B 建立连接超时导致init-method执行时间较长就会出现问题。在这段时间内Kafka消费者 A 发布的Spring事件无法被消费。 尽管这不是一个稳定必现的问题但是当线上流量较大时它发生的概率会增加后果也会更严重。我们在上线3个月后线上环境才首次遇到这个问题。 在《服务关闭期Spring Event消费失败》这篇文章中有读者评论提到了这个问题。 有朋友说 这和spring event有什么关系自己实现一套不也有同样的问题吗关键是得优雅停机啊! 他所说的是正确的如果服务能够完美地进行优雅发布即使是在大流量场景下Spring Event也不会出现问题。 然而要确保服务的优雅发布是非常困难的尤其是公司的项目很多框架和组件都是基础架构组提供的与其费力去改造公司的项目不如不使用Spring Event。 一般情况下公司的项目通常会在 init-method 方法中统一初始化消息队列 MQ 消费者。如果想要安全地使用Spring Event必须等到Spring完全发布完成之后才能初始化 Kafka 消费者。与其按照Spring Event的要求改造公司的项目还不如不使用Spring Event。 对于公司的项目来说稳定性是最重要的。 与其冒着巨大的风险使用Spring Event不如自己手写事件监听模式这样反而简易、安全、可靠。
http://www.sadfv.cn/news/83076/

相关文章:

  • 做网站送的手机站是什么博客推广工具
  • 电商网站建设思路wordpress 4.9.4 漏洞
  • 网站去哪做网站交互图片怎么做
  • 做挂件的网站厚街镇做网站
  • 新手怎样自己做网站网站怎么添加统计代码
  • 土巴兔这种网站怎么做wordpress zzt
  • 上海网站排名优化公司线上网络平台推广
  • 正定网站建设百度收录提交接口
  • 网站专题活动策划方案纯flash网站价格
  • 中国网站建设新闻优秀网站架构
  • 网站建设培训公司哪家好手机制作网站开发
  • 厦门 做网站如何用word做网站地图
  • 鄂尔多斯住房和城乡建设局网站品牌营销和品牌推广的区别
  • 网站翻译建设网站建设 宣传
  • 360网站如何做引流自己做的网站能放到阿里云上
  • wordpress 调用站外api建筑网站do
  • 哪个网站可以做任务网络游戏企业不得向提供游戏服务
  • 做一家视频网站wordpress now 1.5
  • 公司网站制作费算是无形资产吗常见的网站结构有哪些
  • 企业网站页脚seo网络培训班
  • 学广告平面设计哪里好seo优化的主要内容
  • 工商营业执照注册网站瑞诺国际公司团队介绍
  • 网站设置点赞丰台网站制作浩森宇特
  • 浅谈营销型网站建设的市场费用做网站的所有代码
  • 做影视网站存储视频会侵权吗郑州网站建站模板
  • 创意网站建设设计公司迁移wordpress本地到服务器
  • 网站标题 逗号wordpress登录入口
  • 临沂网站建设方案服务一个网站3个相似域名
  • 公司网站的定义企业网站 微博模块
  • 21年网站搭建公司排行榜南京模板建站定制网站