Nacos client SDK 订阅式请求坑
一、場景復(fù)現(xiàn)
(1)業(yè)務(wù)需求
在不同的nacos注冊集群,不同的namespace,由頁面發(fā)起查詢nacos集群上注冊的服務(wù)實例ip。
(2)故障現(xiàn)象
nacos集群配置推送push超時,查看nacos日志請求一直在20~30qps不間斷。把源站點(diǎn)的請求日志打印出來,發(fā)現(xiàn)除了端口不一樣幾乎都是參數(shù)相同的請求。
2021-01-11 12:43:20,133 INFO /nacos/v1/ns/instance/list,app=unknown&healthyOnly=false&namespaceId=test&clientIP=172.16.2.21&serviceName=MusicService&udpPort=59393&encoding=UTF-8,172.16.2.21 2021-01-11 12:43:20,256 INFO /nacos/v1/ns/instance/list,app=unknown&healthyOnly=false&namespaceId=test&clientIP=172.16.2.21&serviceName=PhotoService&udpPort=52456&encoding=UTF-8,172.16.2.21 2021-01-11 12:43:20,155 INFO /nacos/v1/ns/instance/list,app=unknown&healthyOnly=false&namespaceId=test&clientIP=172.16.2.21&serviceName=FruitService&udpPort=30299&encoding=UTF-8,172.16.2.21 2021-01-11 12:43:20,236 INFO /nacos/v1/ns/instance/list,app=unknown&healthyOnly=false&namespaceId=pro&clientIP=172.16.2.21&serviceName=CityService&udpPort=48202&encoding=UTF-8,172.16.2.21 2021-01-11 12:43:20,742 INFO /nacos/v1/ns/instance/list,app=unknown&healthyOnly=false&namespaceId=dev&clientIP=172.16.2.21&serviceName=CountryService&udpPort=12920&encoding=UTF-8,172.16.2.21源站點(diǎn)的代碼
maven設(shè)置
<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>1.3.3</version></dependency>代碼?
private List<Instance> queryInstances(String serviceName, String ip, int port, String namespace) {try {Properties properties = new Properties();properties.setProperty("namespace", namespace);properties.setProperty("serverAddr", ip + ":" + port);NamingService naming = NamingFactory.createNamingService(properties);List<Instance> instances = naming.selectInstances(serviceName, true);log.info("nacos查詢結(jié)果, ip:{}, size:{}", ip, instances.szie());return instances;}catch (Exception e){log.warn("nacos查詢異常", e);}return Collections.emptyList(); }通過關(guān)鍵字查詢源站點(diǎn)的日志,統(tǒng)計得到請求次數(shù)才是十幾次,跟nacos上的請求數(shù)幾十萬相差很遠(yuǎn),百思不得其解。停掉源站點(diǎn)的進(jìn)程,請求就消失沒有了。
過了兩天后,有需要使用到查詢服務(wù)ip的功能,又把源站點(diǎn)的進(jìn)程啟動起來,不久又出現(xiàn)nacos請求的20-30qps。
?
(3)分析問題
上源站點(diǎn)的機(jī)器把tcp dump快照打印:發(fā)現(xiàn)請求一次頁面接口,發(fā)送了tcp nacos查詢uri連接20~30次,有些請求是沒有響應(yīng)體的。
No. Time Source Destination Protocol Length Info 5 0.291331 172.16.2.21 172.16.2.22 HTTP 372 GET /nacos/v1/ns/instance/list,app=unknown&healthyOnly=false&namespaceId=test&clientIP=172.16.2.21&serviceName=MusicService&udpPort=43212&encoding=UTF-8 8 0.223167 172.16.2.21 172.16.2.22 HTTP 372 GET /nacos/v1/ns/instance/list,app=unknown&healthyOnly=false&namespaceId=test&clientIP=172.16.2.21&serviceName=MusicService&udpPort=21345&encoding=UTF-8 10 0.182930 172.16.2.21 172.16.2.22 HTTP 372 GET /nacos/v1/ns/instance/list,app=unknown&healthyOnly=false&namespaceId=test&clientIP=172.16.2.21&serviceName=MusicService&udpPort=21245&encoding=UTF-8 11 0.308301 172.16.2.21 172.16.2.22 HTTP 371 GET /nacos/v1/ns/instance/list,app=unknown&healthyOnly=false&namespaceId=test&clientIP=172.16.2.21&serviceName=CityService&udpPort=23145&encoding=UTF-8 GET /nacos/v1/ns/instance/list? app=unknown&healthyOnly=false&namespaceId=test&clientIP=172.16.2.21&serviceName=CityService&udpPort=23145&encoding=UTF-8 HTTP/1.1 Client-Version: Nacos-Java-client:v1.3.3 User-Agent: Nacos-Java-Client:v1.3.3 Accept-Encoding: gzip,deflate,sdch RequestId: ba341cd2-a5cd-d132-67cb-e1f34135a12c Request-Module: Naming Content-Type: application/x-www-form-urlencoded;charset=UTF-8 Accept-Charset: UTF-8 Host: 172.16.2.22:10812 Accept: text/html,image/gif,image/jpeg,*; q=.2,*/*;q=.2 Connection: keep-alive從這里可以推斷出,應(yīng)該是nacos 訂閱機(jī)制,很多不斷請求。
翻看naocs client的源碼,發(fā)現(xiàn)很多reator后綴的屬性和類對象的初始化,進(jìn)一部驗證了訂閱機(jī)制猜測。
?
二、解決方案
? ? ? ?基本的解決方法:NamingService.selectInstances(serviceName, health)方法默認(rèn)是訂閱的,不使用該方法,改成NamingService.selectInstances(serviceName, health, subscribe)方法,使用后及時調(diào)用NamingService.shutdown()方法,避免sdk里面繼續(xù)訂閱請求。
? ? ? SDK本身就是訂閱響應(yīng)式的,不適合查詢一次的實例ip的場景,使用restful api查詢最合適,避免多了訂閱同步請求。
總結(jié)
以上是生活随笔為你收集整理的Nacos client SDK 订阅式请求坑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本电脑设计的配置要求(笔记本电脑设计
- 下一篇: Nacos(一)之简介