概要
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,包括鏈碼應該都會支持這個配置。