Hyperledger Fabric 收到過大消息導致 gRPC 錯誤

概要

gRPC 默認的接收消息限制自 v1.0 之後調整到了 4 MB,導致當接收消息超過 4MB 後會 reset 掉連接。

問題分析

首先這是個老問題,而且並不只有 Fabric 碰到,所有使用 gRPC 的情況下都可能碰到(不論是 Python、Java、Golang 語言),包括 Tensorflow 等項目中也都報了相關的bug,例如 https://github.com/tensorflow/tensorboard/issues/1202

典型的報錯日誌如下

rpc error: code = ResourceExhausted desc = grpc: received message larger than max (8653851 vs. 4194304)”。

最近在社區也有人報了這個問題:https://lists.hyperledger.org/g/fabric/topic/31542292.

具體到 Fabric中,有兩種操作比較容易碰到這個問題。

一個是利用客戶端 SDK(特別是 Java SDK)從網絡獲取大消息時,例如大的區塊。

另一個是鏈碼邏輯中從 Peer 獲取大消息時,例如查詢的結果太大。

解決思路

解決思路其實也很簡單,通過相應的 gRPC option,進行設置即可。例如

opts = append(opts, grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(size)))
conn, err := grpc.Dial(address, opts...)

目前 Fabric v1.4 版本中,Node SDK 已經提供了更高層的配置參數,Java SDK 暫時還未提供(已有 Jira Issue:https://jira.hyperledger.org/browse/FAB-15398)。後續各 SDK,包括鏈碼應該都會支持這個配置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章