MSE 自治服务帮你快速定位解决 Dubbo 重复订阅导致 RPC 服务注册失败问题

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 不正确的 Dubbo 使用姿势可能会导致 Dubbo 应用以及 ZooKeeper 注册中心出现稳定性问题,本文将探讨由于 Dubbo Reference 重复初始化,导致 ZooKeeper 出现不可用的解决方法。

作者:子葵

背景

Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,具有易用、超大规模微服务实践、云原生基础设施适配、安全性等特点。但是不正确的 Dubbo 使用姿势可能会导致 Dubbo 应用以及 ZooKeeper 注册中心出现稳定性问题。近期,一线上客户发布时,由于 Dubbo Reference 重复初始化,导致 ZooKeeper 出现不可用,服务注册订阅失败,造成业务大面积故障。

ZooKeeper 出现异常日志↓并且 ZooKeeper 集群持续不可用,无法自愈。


原因分析

Dubbo Reference 是 Dubbo 框架中服务提供者在调用者中的代理实现,在初始化 Dubbo Reference 的时候会将 consumer 本身注册在订阅的服务的 consumer 列表中,如果在一个应用中实例化了多个同一个接口的 Dubbo Reference,那么 ZooKeeper 中对应的被订阅的服务 consumer 列表中也会存在多个由于此应用订阅产生的 Znode 节点,这些 Znode 节点的 Path 除了 timestamp 字段都是一致的。

Dubbo 本身通过这种方式表示真实的订阅关系,但是在客户端不正确的使用的情况下,就可能导致 Dubbo 应用本身以及 ZooKeeper 的稳定性问题。

https://github.com/apache/dubbo/issues/4587

例如在 Dubbo 2.7.9 之前的版本中在应用中初始化多个相同接口的 Dubbo Reference, 可能会导致内存溢出的问题。

对于 ZooKeeper 集群,在之前 jute.maxbuffer 调优文章中分析过在 ZooKeeper Server 之间数据同步的时候会严格根据 jute.maxbuffer 的限制进行 Server 之间用于同步的数据包大小的校验,如果数据包超过限制会导致 Follower 和 Leader 之间断连。对于由于错误使用,应用不断初始化同一个接口的 Dubbo Reference,在应用崩溃之后,应用创建的大量的临时节点会导致 ZooKeeper 集群持续崩溃。


问题排查以及解决方案

针对注册配置中心

如果使用的是 ZooKeeper 作为注册配置中心, 可以根据 jute.maxbuffer 一文中的建议,增加 jute.maxbuffer 参数的值,从而延缓问题,但是无法根本解决问题。MSE ZooKeeper 针对此类问题特别设计了限流机制,保证在客户端误用,或者非预期异常的情况下,限制客户端重复注册同一个 consumer,从而保证 ZooKeeper 集群的稳定,并且根据 MSE ZooKeeper 的观测系统可轻松排查具体的应用注册信息。使用 MSE ZooKeeper 排查步骤:例如,有一应用 test 由于初始化方式不合理,导致应用重复初始化对于接口 com.demo.provider 的 Dubbo Reference,在应用启动一段时间后,注册就会报错,此时 MSE ZooKeeper 已经限制了此客户端进行注册行为,从而保障 ZooKeeper Server 自身的稳定性,此时我们可以在 MSE 控制台中根据监控以及推送轨迹信息,排查问题应用。首先进入 MSE 控制台对应的实例详情页,打开观测分析-> 监控中心 -> TopN 监控。通过 TopN 监控中的客户端 TPS TopN 找到时间段内频繁写入的 SessionId,通过此 SessionId,在数据管理 -> 数据轨迹中查询对应 SessionId 的数据操作记录。通过查询结果可以看出具体的某一个机器进行了多次 consumer 注册。


针对 Dubbo 应用本身

升级 Dubbo 版本到最新的稳定版本,同时在使用过程中需要注意 Dubbo  Reference 的初始化方式,减少非必要的同一个接口的多个 Dubbo Reference,Dubbo Reference 本身比较重,多个 Dubbo Reference 本身会消耗机器资源。


总结

在平时业务开发中,由于框架的误用或者 bug 导致的业务以及业务依赖的中间件的稳定性问题需要有快捷的手段进行排查,找到原因及时止血,MSE ZooKeeper 针对多种使用场景,提供多种数据统计聚合能力,帮助用户提高问题排查的效率,并且针对 ZooKeeper 多种使用场景,提供丰富的监控指标,基于 Dragonwell jdk 进行深度优化,具有多可用区容灾能力,免运维,高可用等能力,助力用户构建稳定高效的微服务应用。


5 月份日常产品活动折扣

【0元试用】

服务治理试用版,开通后 30 天免费使用。

【新老同享】

注册配置中心资源包:开发版/规格 1C2G 76.7 元/月。

服务治理无损上下线&灰度发布:0.01 元/Agent/小时

【首购专享】

注册配置中心专业版,包年包月 7 折。

云原生网关,包年包月 7 折。

服务治理资源包(按量抵扣),包年包月 7 折。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
3月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
2月前
|
存储 负载均衡 监控
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
这篇文章是关于Apache Dubbo框架与Zookeeper的关系,以及如何下载、安装和启动Zookeeper的教程,包括解决启动过程中可能遇到的报错问题。
98 3
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
|
2月前
|
消息中间件 监控 Ubuntu
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
96 3
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
|
2月前
|
Dubbo 应用服务中间件 Apache
Dubbo 应用切换 ZooKeeper 注册中心实例,流量无损迁移
如果 Dubbo 应用使用 ZooKeeper 作为注册中心,现在需要切换到新的 ZooKeeper 实例,如何做到流量无损?
30 4
|
2月前
|
存储 前端开发 JavaScript
前端的全栈之路Meteor篇(四):RPC方法注册及调用-更轻量的服务接口提供方式
RPC机制通过前后端的`callAsync`方法实现了高效的数据交互。后端通过`Meteor.methods()`注册方法,支持异步操作;前端使用`callAsync`调用后端方法,代码更简洁、易读。本文详细介绍了Methods注册机制、异步支持及最佳实践。
|
2月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
173 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
6月前
|
NoSQL Dubbo 应用服务中间件
Dubbo Zookeeper(一)Zookeeper初识
Dubbo Zookeeper(一)Zookeeper初识
|
4月前
|
缓存 Dubbo Java
Dubbo服务消费者启动与订阅原理
该文章主要介绍了Dubbo服务消费者启动与订阅的原理,包括服务消费者的启动时机、启动过程以及订阅和感知最新提供者信息的方式。
Dubbo服务消费者启动与订阅原理
|
4月前
|
Dubbo 网络协议 Java
深入掌握Dubbo服务提供者发布与注册原理
该文章主要介绍了Dubbo服务提供者发布与注册的原理,包括服务发布的流程、多协议发布、构建Invoker、注册到注册中心等过程。
深入掌握Dubbo服务提供者发布与注册原理
|
5月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
128 3

相关产品

  • 微服务引擎