[alibaba/nacos]使用Nacos , Server服务出现假死

2024-07-18 514 views
4

server端使用的事2.0, client端使用的是1.4.1 使用了 配置中心 + 服务 配置中心, 我么的使用方式是 特定情况下, 通过sdk 添加或修改配置,

服务的用法是: 应用启动后, 我们会基于Api做服务注册, 因为我们的业务需要区分api, 这种用法会导致, 我们启动后, 同一个应用 可能注册几十甚至几百个服务

运行一段时间后, Nacos Server 会出现假死问题, 所有请求都无法处理, cpu 内存正常, tocat的线程池已经用尽

我们的产品特性,需要这样使用,才能满足产品需求. 这种使用方式有没有问题, 请问如何排除假死的问题,

回答

8

首先说,你们这种使用方式肯定是有问题的,这种情况没有根治的解决方案,但是可以从不同角度去优化这种情况,这种情况最好是从你应用本身去考虑,考虑一下几点:

  1. 再大的 tomcat 线程池在这种业务场景下都会被用尽,因为这是你们的产品需求规定的,所以从这里优化不太现实。
  2. 注册到 Nacos 中的服务是否都是即时需要的,如果是,请看第 3 点,如果不是,请将你们的 api 注入到 redis 或消息队列中,然后为每个 api 设置一个计数器和过期时间,一旦这个 api 所代表的服务被调用,计数器的值就加一,过期时间同时延长一定的时间,如果这个 api 所代表的服务很长时间没有被调用,则计数器的值就减一,直到计数器的值减到零时,在 Nacos 中手动销毁这个 api 所代表的服务,同时清除redis或消息队列中的 api 数据,以此重复。这样一来,你们的 tomcat 在某一时间段内的线程数并不是逐步递增的,这样的话就会在某一时间段后腾出一些可用的 tomcat 线程池空间。
  3. 由于你们注册到 Nacos 中的服务都是即时需要的,所以最重要的一点就是要保持服务的活跃性,所以可以考虑部署多个 Nacos Server 节点,各个节点之间通过互相访问的手段实现 Nacos Server 高可用集群,然后在你们的应用中引入负载均衡,并采用权重算法去分配每个请求所分配到 Nacos Server 节点上的次数。 这是比较容易实现的几点建议,可以考虑一下。
0

为什么 tomcat 的线程池会耗尽

9

@SteafanMrZhou

9

@hsoftxl Nacos Server 内部在处理服务时会开启相应的线程池,由于 Nacos Server 本身基于 SpringBoot 开发,并且没有指定外部的应用容器,所以不难得出,Nacos Server 在处理每一个服务的请求时,是委托给 SpringBoot 本身内置的 tomcat 服务器去管理,结合你的业务场景,每一次 api 服务的注册都会相应地增加 tomcat 线程池中线程的数量,即 tomcat 线程池中需要新开启一个线程连接去处理你的 api 服务请求,随着你 api 服务的增加,tomcat 线程池中的线程数量也会随之增加,直到 tomcat 线程池中可用的线程数量连接都被占用,即 tomcat 的线程池随之耗尽。

3

同一个应用 几百个服务,服务与nacosServer 之间会有心跳。 在同一时间,心跳也可能会占用你几个百个线程。,心跳时间改为随机,避免并发心跳。我建议你们根据你们api的不同,划分到不同的nacose服务。可以利用api 前缀(区分api的不同:分组)然后对应不同的nacos服务。

8

升级客户端到2.X的版本,用长连接替换掉心跳,同一个应用几百个不同的服务也是一个连接,一定程度上可以解决问题。 根本方案还是改造一下使用方式,一个应用实例注册一个服务是最理想的方式,至于你说的几十甚至几百个服务,只要是跟这个应用相关的,我理解都是接口,放到服务的元数据里面。服务发现的时候发现了应用实例,处理元数据信息即可。

0

@MajorHe1 服务元数据是放header,有大小限制,我们之前就是这样,后来发现元数据内容太大,被截掉了

5

2.x sdk -401错误,官方至今没解决。 kpi开源

7

目前临时解决方案,调整了心跳时间。 等待2.x更新