开发者社区 > 云原生 > 正文

大佬们麻烦咨询个问题,我们使用nacos-client1.4.2,nacos-server2.0.3

大佬们,麻烦咨询个问题,我们使用nacos-client1.4.2,nacos-server2.0.3 查阅资料,nacos采用了双重手段保证服务端注册表实例发生变更时,客户端能感知到: (1)服务端推送udp; (2)客户端定时轮询的功能; 所以nacos这两种手段,既保证了实时性(推),又保证了数据更新不会漏掉(拉)

上面的描述看完就知道是实例发生变更时,服务端才会通过udp推送变更的实例信息过来, 但是从客户端的naming.log日志中发现一直有从不同的nacos服务端节点通过udp推送过来的数据,所以就有点懵逼,实例状态不变(一直是健康状态)的情况下,只是时间戳变化服务端也会推送数据给客户端吗?

下面是客户端naming.log中频繁收到的push data数据:image.png

展开
收起
真的很搞笑 2023-05-09 17:57:10 216 0
2 条回答
写回答
取消 提交回答
  • 在使用 Nacos 客户端时,不同的 Nacos 服务端节点会定期向客户端发送 UDP 数据包,即使实例状态并没有发生变化。那么这些数据包是为什么而来的呢?

    首先,对于 Nacos 服务端向客户端推送实例变更的方式,确实是采用了 UDP 推送和轮询两种方式,保证客户端能够及时感知到实例变更。当实例状态或服务列表发生变化时,Nacos 服务端会向相关的客户端推送 UDP 数据包,客户端接收到数据包后会进行实例列表更新。同时,客户端也会定期向 Nacos 服务端发送 HTTP 请求,获取最新的实例列表。

    但是,您提到的情况下,即使实例状态没有发生变化,仍然会收到来自不同 Nacos 服务端节点的 UDP 数据包,这可能是因为 Nacos 服务端在进行健康检查、负载均衡或其他管理操作时,会不断地刷新实例信息,并将这些信息广播到集群中的其它节点。

    由此,可能会导致客户端不断地收到来自不同 Nacos 服务端节点的 UDP 数据包,但这些数据包并不表示实例状态发生了变化,仅仅表示实例信息被 Nacos 服务端更新了。这种情况下,如果客户端不需要实时感知到这些变化,可以通过调整客户端的轮询间隔来减少网络流量,提高客户端性能。

    总之,Nacos 服务端向客户端推送实例变更采用了 UDP 推送和轮询两种方式,UDP 推送是保证实时性的关键,轮询则是为了保证数据更新不会漏掉。但在实际情况下,由于 Nacos 服务端可能会不断刷新实例信息并将其广播到集群中的其他节点,因此客户端可能会频繁地收到来自不同节点的 UDP 数据包,即使实例状态并没有发生变化。

    2023-05-10 09:38:01
    赞同 展开评论 打赏
  • 随心分享,欢迎友善交流讨论:)

    是的,Nacos 在服务实例的状态发生变化时,会通过 UDP 推送消息给客户端,通知客户端更新本地缓存中的服务实例信息。但是,即使服务实例的状态没有发生变化,在客户端设定的轮询时间到达时,客户端也会通过向服务端发送请求的方式来获取服务实例的最新状态。因此,在日志中看到不同的 Nacos 服务端节点通过 UDP 推送数据是正常的现象。

    2023-05-10 09:35:01
    赞同 展开评论 打赏
问答分类:
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载