天天看點

dubbo異常Data length too large

記錄下dubbo服務報錯

Data length too large

的異常

生産dubbo調用,dubbo服務方報錯

dubbo異常Data length too large

根據堆棧檢視了下com.alibaba.dubbo.remoting.transport.AbstractCodec.checkPayload(Channel, long),發現是資料太大,超過了dubbo的封包體最大長度限制8M,dubbo預設封包體限制是int DEFAULT_PAYLOAD = 8 * 1024 * 1024,即8m。從上圖日志裡面看,要發送的封包體是13116835,大概12.5m。也是奇怪,一個簡單的查詢調用,運作了快一年第一次出現這個問題。是哪裡出現問題了呢?

經過排查,發現要傳回的一個consoleLog太大導緻的,這個字段儲存的是shell執行日志,從資料庫檢視,該字段内容确實很大,裡面

chown: changing ownership of '/home/user/data1/export/20201129/13/XXXX.xlsx': Operation not permitted

大概有5w多行,這樣就基本12.5m了,為什麼腳本執行會報錯大量的這個異常呢? 經過跟業務組咨詢,他們這個應用生成報表在/home/user/data1目錄,這樣在執行chown -R user:user /home/user的時候,由于該目錄下的Excel檔案太多(5w多個),這樣每條就報錯這個錯誤。但是問題來了,這些excel都是由應用生成,而應用又是由user使用者啟動,按理chown指令不應該出現這樣的問題(經過到伺服器檢視這些Excel确實是屬于user使用者),問題出現在哪呢?

想到要生成這麼多報表excel檔案,那麼肯定需要比較大的磁盤空間,平時生産給的虛機應用通常是200g,這麼多檔案按理磁盤空間應該是不足的,是不是對磁盤做了什麼特殊處理,經過咨詢系統的開發,說他們檔案系統/home/user找過運維擴容過,是挂載磁盤(nfs),那麼問題很明顯出現在nfs上。繼而咨詢了運維得到答案,

nfs 預設運作是 root_squash。client 挂載無法執行,權限操作。需要改為需要改成 no_root_squash 才可以

,知道了問題就好解決了,我們的腳本不應該對/home/user再進行chown -R user:user /home。還有就是不要再查詢consoleLog。

如果要增大dubbo最大封包限制,可以通過

dubbo.protocol.payload=20*1024*1024

設定為20m,但是通常不建議設定。

繼續閱讀