一個 Dubbo 服務啟動要兩個小時

前幾天在測試環境碰到一個非常奇怪的與 dubbo 相關的問題,事后我在網上搜索了一圈并沒有發現類似的帖子或文章,于是便有了這篇。

希望對還未碰到或正在碰到的朋友有所幫助。

現象

現象是這樣的,有一天測試在測試環境重新部署一個 dubbo 應用的時候發現應用“啟動不起來”。

但過幾個小時候之后又能自己慢慢恢復,并能夠對外提供 dubbo 服務。

What?一個 Dubbo 服務啟動要兩個小時
但其實經過我后續排查發現剛開始其實并不是啟動不起來,而是啟動速度非常緩慢,所以當應用長時間啟動后才會對外提供服務。而這個速度慢到居然要花費 2 個小時。

導致的一個結果是測試完全不敢在測試環境發版驗證了,每驗證一個功能修復一個 bug 就得等上兩個小時,這誰受得了。

而且經過多次觀察,確實每次都是花費兩小時左右應用才能啟動起來。

嘗試解決

最后測試頂不住了,只能讓我這個“事故報告撰寫專家”來看看。

當我得知這個問題的現象時其實完全沒當一回事:

都不用想,這不就是主線程阻塞了嘛,先看看是否在初始化的時候數據庫、Zookeeper 之類的連不上導致阻塞了-------來之多次事故處理的經驗告訴我。

于是我把這事打回給測試讓他先找運維排查下,不到萬不得已不要影響我 Touch fish。

第二天一早看到測試同學的微信頭像跳動時我都已經準備接受又一句 “膜拜大佬” 的回復時,卻收到 “網絡一切正常,沒人動過,再不解決就要罷工了”。

好吧,忽悠不過去了。

首先這類問題的排查方向應該不會錯,就是主線程阻塞了,至于是啥導致的阻塞就不能像之前那樣瞎猜了。

我將應用重啟后用 jstack pid 將線程快照打印到終端,直接拉到最后看看 main 線程到底在干啥。

前幾次的快照都是很正常:

加載 Spring ---->連接 Zookeeper ---> 連接 Redis,都是依次執行下來沒有阻塞。

隔了一段后應用確實還沒起來,我再次 jstack 后得到如下信息:

What?一個 Dubbo 服務啟動要兩個小時

翻源碼

我一直等了十幾分鐘再多次 jstack 得到的快照得到的信息都是一樣的。

What?一個 Dubbo 服務啟動要兩個小時

如圖所示可見主線程是卡在了 dubbo 的某個方法 ServiceConfig.java 的 303 行中。

于是我找到此處的源碼:

What?一個 Dubbo 服務啟動要兩個小時

簡單來說這里的邏輯就是要獲取本機的 IP 將其注冊到 Zookeeper 中用于其他服務調用。

What?一個 Dubbo 服務啟動要兩個小時

再往下跟就如堆棧中一樣是卡在了 Inet4AddressImpl.getLocalHostName 處。

但這是一個 native 方法,我們應用也根本干涉不了,最終的現象就是調用這個本地方法非常耗時。

于是這問題貌似也阻塞在這兒了,沒有太多辦法。

最終解決

既然這是一個 native 方法,那說明和應用本身沒有啥關系(確實也是這樣,這個問題是突然間出現的。)

那是否是服務器本身的問題呢,想到在 native 方法里是獲取本機的 hostname,那是否和這個 hostname 有關系呢。

What?一個 Dubbo 服務啟動要兩個小時

這是在我自己的阿里云服務器上測試,真正的測試環境不是這個名字。

拿到服務器 hostname 后再嘗試 ping 這個 hostname,奇怪的現象發生了:

命令剛開始會卡住一段時間(大概幾十秒),然后才會輸出 hostname 對應的 ip 以及對應的延遲。

而當我直接 ping 這個 ip 時卻能快速響應后面的輸出。

最后我嘗試在 /etc/hosts 配置文件中加入了對應的 host 配置:

xx.xx.xx.xx(ip) hostname

再次 ping hostname 的效果就和直接 ping ip 一樣了。

于是我再次重啟應用,一切都正常了。

總結

最后根據我調整的內容嘗試分析下本次問題的原因:

  • 當 Dubbo 在啟動獲取本地 ip 時,是通過服務器 hostname 從 dns 服務器返回當前的 ip 地址。
  • 由于 dns 服務器或者是本地服務器與 dns 服務器之間存在網絡問題,導致這個過程的時間被拉長(猜測)。
  • 我在本地的 host 文件中配置后,就相當于本地有一個緩存,優先取本地配置的 ip ,避免了和 dns 服務器交互的過程,所以速度提升了。

雖然問題得到解決了,但還是有幾個疑問:

第一個是為什么和 DNS 服務器的交互會這么慢,即便是慢也沒有像應用那樣需要 2 個小時才能返回,這里我也沒搞得太清楚,有相關經驗的朋友可以留言討論。

第二就是 Dubbo 在這個依賴外部獲取資源時健壯性是否可以做的更好,雖說我這問題估計也幾人碰到。

對于這種長時間沒有啟動成功的問題是否可以加上提示,比如直接拋出異常退出程序,將問題可能的原因告訴開發者,方便排查問題。

轉載于:https://www.cnblogs.com/CQqf2019/p/11155487.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247587.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247587.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247587.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

表單提交enctype參數詳解之:application/x-www-form-urlencode和multipart/form-data

application/x-www-form-urlencode 我們在提交表單的時候,form表單參數中會有一個enctype的參數。enctype指定了HTTP請求的Content-Type。 默認情況下,HTML的form表單的enctypeapplication/x-www-form-urlencoded。 application/x-www-form-urlencoded是…

內網端口映射工具

由于開發微信需要一個公網域名,需要將本地端口映射到外網域名,最熱的工具是ngrok,但被微信屏蔽了,這里使用的是natapp,環境是mac,windows下可使用nat123、花生殼等工具實現同樣功能。 簡單記錄一下過程。 …

iOS----------iPhone導出手機所有短信

第一步:手機連接到itunes 選擇本電腦備份 備份的時候不要加密 然后立即備份 第二步:前往文件夾,找到itunes的備份路徑~/Library/Application Support/MobileSync/Backup 在這目錄下搜索 3d0d開頭的文件,這就是 iPhone 短信的…

跨站點腳本(XSS)

1. 簡介 跨站點腳本(XSS)是當前web應用中最危險和最普遍的漏洞之一。安全研究人員在大部分最受歡迎的網站,包括Google, Facebook, Amazon, PayPal等網站都發現這個漏洞。如果你密切關注bug賞金計劃,會發現報道最多的問題屬于XSS。為了避免跨站腳本,瀏覽器也有自己的過濾器,但安…

spring webscoket服務端使用記錄

記錄spring4中websocket的使用方式 pom jar包配置 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>${spring.version}</version> </dependency> <depen…

MVC是什么?(轉載)

MVC (Modal View Controler)本來是存在于Desktop程序中的&#xff0c;M是指數據模型&#xff0c;V是指用戶界面&#xff0c;C則是控制器。使用MVC的目的是將M和V的實現代碼分離&#xff0c;從而使同一個程序可以使用不同的表現形式。比如一批統計數據你可以分別用柱狀圖、餅圖來…

CSRF攻擊原理及防御

CSRF攻擊原理及防御 一、CSRF攻擊原理 CSRF是什么呢&#xff1f;CSRF全名是Cross-site request forgery&#xff0c;是一種對網站的惡意利用&#xff0c;CSRF比XSS更具危險性。想要深入理解CSRF的攻擊特性我們有必要了解一下網站session的工作原理。   session我想大家都不…

H3C FTP配置示例

轉載于:https://www.cnblogs.com/fanweisheng/p/11156596.html

用dotnet自帶的mail類發郵件出現的問題

在使用dotnet自帶的mail類發送郵件的時候&#xff0c;因為默認的smtp端口是25&#xff0c;如果更改了smtp的端口號&#xff0c;則需加上MailMessage msg &#xff1d; new MailMessage();msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport&…

Angular CLI ng 指令指南

Angular CLI 使用教程指南參考 Angular CLI 現在雖然可以正常使用但仍然處于測試階段. Angular CLI 依賴 Node 4 和 NPM 3 或更高版本. 安裝

spring源碼閱讀(1/4) - Bean生成

上午去繳了上次沒帶駕駛證的扣分罰款&#xff0c;最近在圖書館沒事就看曾國藩家書&#xff0c;曾國藩說人要明強。光強沒有用&#xff0c;你要明強。也就是說要強的有道理。曾國藩又說&#xff0c;做學問不能做死學問&#xff0c;做學問其實很重要的事就是能懂得孝悌&#xff0…

NodeJS解決跨域問題:Access-Control-Allow-Origin

今天在玩vue-resource時&#xff0c;后臺使用nodejs來提供數據&#xff0c;由于需要跨域&#xff0c;在網上也找到了解決方法。 vue-resource代碼(其實就是ajax技術)&#xff1a; this.$http.get({url:"http://localhost:3000/getdata"}) .then(function (data) {co…

windows10系統下MongoDB的安裝及環境配置

windows10系統下MongoDB的安裝及環境配置&#xff1a; MongoDB的安裝 下載地址&#xff1a; https://www.mongodb.com/download-center (這是windows10環境下的教程&#xff01;請注意&#xff01;) 下載后&#xff0c;我們點擊mongodb-win32-x86_64-2008plus-ssl-3.4.3-signed…

Net EF to MySQL生成edmx文件時報錯:StrongTypingException:表“TableDetails中列“IsPrimaryKey的值為DBNull...

使用Net寫項目&#xff0c;數據庫用的MySQL&#xff0c;EF生成edmx文件時&#xff0c;報錯&#xff0c;StrongTypingException:表“TableDetails"中列“IsPrimaryKey"的值為DBNull。 解決方法&#xff1a; 1.重啟MySQL服務 2.MySQL中運行下以下命令&#xff1a; use …

MongoDB之在mac上設置環境變量

要下班&#xff0c;簡介做個筆記。設置環境變量在基于unix/linux的操作系統下進行程序開發&#xff0c;使用環境變量將會方便。通過設置環境變量將可以在任意目錄通過輸入程序名來執行設定目錄下的程序。不需要通過cd將工作目錄改變到程序目錄再執行程序。而且免去了輸入"…

popup a new windows

popup a new windows window.open(url, newwindow, height500, width850, top0, left0, toolbarno, menubarno, scrollbarsno, resizableno,locationno, statusno); 轉載于:https://www.cnblogs.com/sandy_liao/archive/2010/06/24/1764533.html

CSS clip:rect矩形剪裁功能

CSS中有一個屬性叫做clip&#xff0c;為修剪&#xff0c;剪裁之意。配合其屬性關鍵字rect可以實現元素的矩形裁剪效果。此屬性安安穩穩地存在于CSS2.1中&#xff0c;且使用上基本上沒有類似于max-height/display:table-cell等瀏覽器的兼容性問題。 根據Dreamweaver的自動提示&a…

CSS隱藏元素的十四種方法

通過設置width:0或者height:0隱藏一個元素&#xff0c;文字隱藏可以設置color為背景色或transparent&#xff0c;但內容還在&#xff0c;所以用font-size:0&#xff1b; 將元素的opacity設置為0&#xff0c;元素本身還在&#xff0c;只是看不見&#xff1b; 通過絕對定位將元…

jquery.lazyload.js詳解

簡介lazyload.js用于長頁面圖片的延遲加載&#xff0c;視口外的圖片會在窗口滾動到它的位置時再進行加載&#xff0c;這是與預加載相反的。優點&#xff1a;它可以提高頁面加載速度&#xff1b;在某些情況清晰它也可以幫助減少服務器負載。安裝bower安裝&#xff1a;$ bower in…

Spring Boot Cache使用與整合

參考&#xff1a; 史上最全的Spring Boot Cache使用與整合Spring Cache擴展&#xff1a;注解失效時間主動刷新緩存 項目地址使用本地Caffeine緩存 引入依賴包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starte…