rpc 服务器不可用 rpc服务器的常见问题


Dubbo是一款为微服务架构设计的RPC(远程过程调用)服务开发框架,它能够高效地解决服务治理与通信问题。其特性包括易用性、支持超大规模微服务实践、云原生基础设施适配以及安全性等。

不恰当的Dubbo使用方式可能会导致Dubbo应用以及ZooKeeper注册中心出现稳定性问题。近期,有客户在发布时遇到了因Dubbo Reference重复初始化而导致ZooKeeper服务不可用的情况,这进一步导致服务注册订阅失败,进而影响业务正常运作。

Dubbo Reference是Dubbo框架中服务提供者的一种代理实现方式,在初始化过程中会将消费者信息注册到所订阅服务的消费者列表中。如果在同一应用中实例化多个相同接口的Dubbo Reference,ZooKeeper中对应的被订阅服务的消费者列表中会生成多个由此应用产生的Znode节点。尽管Dubbo通过这种方式表示真实的订阅关系,但在客户端错误使用的情况下,这可能引发Dubbo应用和ZooKeeper的稳定性问题。

/apache/dubbo/issues/4587为例,特别是在Dubbo 2.7.9之前的版本中,如果多次初始化同一接口的Dubbo Reference,可能导致内存溢出问题。对于ZooKeeper集群而言,其数据同步受到jute.maxbuffer限制。由于错误的Dubbo Reference初始化方式,应用崩溃后产生的临时Znode节点可能导致ZooKeeper集群持续崩溃。

若使用ZooKeeper作为注册配置中心,虽然可以通过调整jute.maxbuffer参数值来缓解问题,但这并非根本解决方案。为此,MSE ZooKeeper针对此类问题设计了限流机制,以保障在客户端误用或非预期异常情况下,限制客户端重复注册同一消费者,从而维护ZooKeeper集群的稳定性。其观测系统还能轻松排查具体应用的注册信息。

使用MSE ZooKeeper进行问题排查的步骤如下:若某应用因不合理的初始化方式导致重复初始化特定接口的Dubbo Reference,MSE ZooKeeper将限制该客户端的注册行为,以保障ZooKeeper Server的稳定性。我们可在MSE控制台中通过监控及推送轨迹信息来定位问题应用。

首先进入MSE控制台对应的实例详情页,接着打开观测分析 -> 监控中心 -> TopN监控。通过TopN监控中的客户端TPS TopN可找到时间段内频繁写入的SessionId。然后,在数据管理 -> 数据轨迹中查询对应SessionId的数据操作记录。这样便能发现具体哪台机器进行了多次consumer注册。

为避免此类问题再次发生,建议升级Dubbo至最新稳定版本,并在使用过程中注意Dubbo Reference的初始化方式。减少不必要的同一接口的多个Dubbo Reference初始化,因为Dubbo Reference本身较重,多个Dubbo Reference会消耗机器资源。