你知道寫程式、玩 IT 最需要的是什麼嗎?是 “視力”!原來卡住我們好幾個星期的問題是因為有人將主機的 hosts 設定錯誤導致程式發生異常,而這個錯誤之前在做程式驗證時還檢驗不出來,有趣的地方請繼續看下去。
我們的專案利用 MSMQ 實做了一個訊息傳遞機制,假設我們有四台 Web 伺服器,如果 Web1 接到新訊息就會傳遞到 Web2, Web3, Web4 三台,如果 Web2 接收到訊息就會傳遞到 Web1, Web3, Web4 三台,依此類推。
由於客戶的環境並無 Active Directory 或自行建置的內部 DNS,我們為了讓訊息透過主機名稱而非透過 IP 連線,所以在各台主機設定 hosts 檔案 ( 不知道 hosts 的人可參考: 手動設定網址對應 IP 的方式 ),設定的內容如下圖示 ( 這是錯誤的設定,不知道是哪位天兵設定的 ):
設定完後很自然的透過 ping web2 的方式測試,結果是通的。然後測試 MSMQ 進行訊息傳遞,訊息也成功送出,所以上線後就認為應該沒問題了。
然後我們的程式透過 MSMQ 送一段時間後訊息就會停止傳送,我今天就是去客戶端查詢這個問題。首先,固執的我堅持認為 MSMQ 沒那麼弱,畢竟是在業界使用數十年的技術了,不可能在 MSMQ 的訊息無故不送出,且還不引發任何錯誤,但是訊息就是一直待在「傳出佇列」裡一動也不動的待著。
訊息放到「傳出佇列」後也沒有任何想傳遞的跡象,連嘗試送一次也沒有:
最後眼尖的我在開啟 hosts 檔查看 IP 對應表後才知道原來是 IP 打錯了!!!
但是,為什麼一個錯誤的 IP 卻 Ping 的到呢??
我們可以看一下 localhost - Wikipedia, the free encyclopedia 的說明,在 Internet Engineering Task Force (IETF) 定義的標準中是將整個 127.0.0.0/8 ( Class A ) 的位址都用做為 loopback 用途,所以所有 127.xxx.xxx.xxx 開頭的 IP 位址全部都會導向到「本機」,所以當然 Ping 的到。
最後,我將 127.20.11.xx 修改成 172.20.11.xx 就把問題解決了,一行程式都不用改!很瞎的問題,不過花了我們好多時間才解決。
我沒辦法要求開發人員能懂這麼多 IT / 網管 的東西,只希望你們 眼力 好一點,不要再打錯了,尤其是很愛 Copy & Paste 的人,更應該小心行事。
相關連結