在工作中遇到了grpc的stream通信(server通過stream向client返回一個消息的stream),client會收不到消息的情況。發現收不到的這個消息比較大,跟同事討論說可能是grpc限制了消息的大小,通常是4M。網上搜索了一下,大多數是go的解決方案,和C++的接口名稱不太一樣,其中幫助比較大的是這一篇C++相關的博客http://www.freesion.com/article/475480468/,但是這裏面只寫了server端的message size設置,在我的代碼中這樣嘗試之後,發現還是不能成功收到消息,最後根據我所用版本的源碼,發現client連接時也需要做相關設置。本文給出的方法在我的環境下是可用的,但不確定是不是官方推薦的最佳方法,畢竟我沒有找到官方的文檔來說明這件事情。。
server端,在啓動時對ServerBuilder調用SetMaxSendMessageSize:
service_ = std::make_unique<MessageBridgeService>();
builder_ = std::make_unique<grpc::ServerBuilder>();
builder_->SetMaxSendMessageSize( 10 * 1024 * 1024); // 10M
builder_->AddListeningPort(FLAGS_service_address,
grpc::InsecureServerCredentials());
builder_->RegisterService(service_.get());
server_ = builder_->BuildAndStart();
client端,在連接時,使用CreateCustomChannel這個接口來創建channel,傳入自定義的ChannelArguments對象,其中設置最大接收消息大小:
grpc::ChannelArguments channel_args;
channel_args.SetInt(GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH, 10 * 1024 * 1024);
channel_ = grpc::CreateCustomChannel(
address, grpc::InsecureChannelCredentials(), channel_args);
stub_ = MessageBridge::NewStub(channel_);
需要注意的時,在我的場景下,是server通過stream向client發送大消息,所以對server來說,是設置最大發送大小,對client來說,是設置最大接收大小。如果是反過來,則應該替換成下面兩個調用:
// server
builder_->SetMaxReceiveMessageSize( 10 * 1024 * 1024); // 10M
// client
channel_args.SetInt(GRPC_ARG_MAX_SEND_MESSAGE_LENGTH, 10 * 1024 * 1024);