瓜子二手车在 Dubbo 版本升级、多机房方案方面的思考和实践

  • 时间:
  • 浏览:0
  • 来源:uu快三_uu快三直播_uu快三官网开奖平台

  dubbo同机房优先调用的实现比较简单,相关逻辑如下:

  瓜子目前正在进行第二机房的建设工作,dubbo多机房是第二机房建设中比较重要的有有三个话题。在dubbo版本统一的前提下,当当我们都就还还可以 更顺利的开展dubbo多机房相关的调研与开发工作。

  继续对doRegister(url)的代码进行进一步排查,当当我们都发现在CuratorZookeeperClient.createEphemeral(path)办法所含那末 一段逻辑:在createEphemeral(path)捕获了NodeExistsException,创建ephemeral节点时,若此节点已占据 ,则认为ephemeral节点创建成功。这段逻辑初看起来并那末 你同类 问提,且在以下你同类 常见的场景下表现正常:

  在排查问提的过程中,当当我们都发现kafka的旧版本在使用zookeeper时也遇到过同类的问提,并参考kafka关于此问提的修复方案,选泽了dubbo的修复方案。在创建Ephemeral节点捕获到NodeExistsException时进行判断,若Ephemeral节点的SessionId与当前客户端的SessionId不同,则删除并重建Ephemeral节点。在内控 修复并验证通后后 ,当当我们都向社区提交了issues及pr。

  在继续排查问提前,当当我们都先普及下你同类 概念:dubbo默认使用curator作为zookeeper的客户端,curator与zookeeper是通过session维持连接的。当curator重连zookeeper时,若session未过期,则继续使用原session进行连接;若session已过期,则创建新session重新连接。而ephemeral节点与session是绑定的关系,在session过期后,会删除此session下的ephemeral节点。

  当当我们都在向dubbo社区的同学咨询了版本升级方面的相关经验后,于9月下旬结速英语 英语 了dubbo版本的升级工作。

  接下来,我会从这次线上事故结速英语 英语 ,讲讲当当我们都这段时间所做的 Dubbo 版本升级的历程以及当当我们都规划的 Dubbo 后续多机房的方案。

  基于社区dubbo2.7.3版本开发的dubbo内控 版本属于过渡性质的版本,目的是为了修复线上provider只有恢复注册的问提,以及你同类 社区dubbo2.7.3的兼容性问提。瓜子的dubbo最终还是要跟随社区的版本,而就有开发自已的内控 功能。后后 当当我们都在dubbo内控 版本中修复的所有问提均与社区保持了同步,以保证后续还还可以 兼容升级到社区dubbo的更高版本。

  dubbo注册恢复问提issues:https://github.com/apache/dubbo/issues/5125

  在生产环境,瓜子内控 各业务线共用一套zookeeper集群作为dubbo的注册中心。2019年9月份,机房的一台交换机占据 故障,意味zookeeper集群冒出了几分钟的网络波动。在zookeeper集群恢复后,正常情况表下dubbo的provider应该会调快重新注册到zookeeper上,但有一小部分的provider很长一段时间那末 重新注册到zookeeper上,直到手动重启应用后才恢复注册。

  针对以上逻辑,当当我们都简单实现了dubbo通过环境变量进行路由的功能,并向社区提交了pr。

  dubbo通过环境变量路由pr: https://github.com/apache/dubbo/pull/5348

  随着瓜子业务的不断发展,系统规模在逐渐扩大,目前在瓜子的私有云上可能运行着数百个 Dubbo 应用,上千个 Dubbo 实例。瓜子各部门业务比较慢发展,版本那末 来得及统一,各个部门就有另一方的用法。随着第二机房的建设,Dubbo 版本统一的需求变得越发迫切。几块月前,公司占据 了一次与 Dubbo 相关的生产事故,成为了公司 基于社区 Dubbo 2.7.3 版本升级的诱因。

  上文中的问提修复方案可能选泽,但当当我们都显然可能在每有有三个dubbo版本上都进行修复。在咨询了社区dubbo的推荐版本后,当当我们都决定在dubbo2.7.3版本的基础上,开发内控 版本修复来你同类 问提。并借你同类 可能,结速英语 英语 推动公司dubbo版本的统一升级工作。

  首先,当当我们都统计了冒出你同类 问提的dubbo服务的版本分布情况表,发现在大多数的dubbo版本中都占据 你同类 问提,且占据 问提的服务比例相对较低,在github中当当我们都也未找到相关问提的issues。后后 ,推断这是有有三个尚未修复的且在网络波动情况表的场景下偶现的问提。

curator版本兼容性问提

参考社区的pr,当当我们都在内控 版本进行了修复。

本文作者:李锦涛,任职于瓜子二手车基础架构部门,负责瓜子微服务架构相关工作。目前主要负责公司内 Dubbo 版本升级与推广、 Skywalking 推广工作。

  接着,当当我们都便将冒出问提的应用日志、zookeeper日志与dubbo代码逻辑进行相互印证。在应用日志中,应用重连zookeeper成功后provider立刻进行了重新注册,后后 便那末 任何日志打印。而在zookeeper日志中,注册节点被删除后,并那末 重新创建注册节点。对应到dubbo的代码中,只有在FailbackRegistry.register(url)doRegister(url)执行成功或应用线程被挂起的情况表下,还还可以 与日志中的情况表相吻合。

  后后 实际上还有你同类 极端场景,zookeeper的Session过期与删除Ephemeral节点就有原子性的,也就是 说客户端在得到Session过期的消息时,Session对应的Ephemeral节点可能还未被zookeeper删除。此时dubbo去创建Ephemeral节点,发现原节点仍占据 ,故不重新创建。待Ephemeral节点被zookeeper删除后,便会冒出dubbo认为重新注册成功,但实际未成功的情况表,也就是 当当我们都在生产环境遇到的问提。

创建zookeeper节点时提示那末 权限

dubbo配置文件中可能配置了zookeeper的用户名密码,但在创建zookeeper节点时却抛出KeeperErrorCode = NoAuth的异常,你同类 情况表分别对应有有三个兼容性问提:

  当当我们都咨询了dubbo社区的建议,并结合瓜子云平台的现状,初步选泽了dubbo多机房的方案。

  kafka同类问提issues:https://issues.apache.org/jira/browse/KAFKA-1387

  此时,问提的根源已被定位。定位问提后后 ,经当当我们都与 Dubbo 社区交流,发现考拉的同学也遇到过同样的问提,更选泽了你同类 意味。

  定位到问提后后 ,当当我们都便结速英语 英语 尝试本地复现。可能zookeeper的Session过期但Ephemeral节点未被删除的场景直接模拟比较困难,当当我们都通过修改zookeeper源码,在Session过期与删除Ephemeral节点的逻辑中增加了一段休眠时间,间接模拟出你同类 极端场景,并在本地复现了此问提。

dubbo的ServiceBean监听spring的ContextRefreshedEvent,进行服务暴露。openFeign提前触发了ContextRefreshedEvent,此时ServiceBean还未完成初始化,于是就意味了应用启动异常。

参考社区的pr,当当我们都在内控 版本修复了此问提。

  在推动升级dubbo2.7.3版本的过程整体上比较顺利,当然也遇到了你同类 兼容性问提: