C++ grpc stream message size 調整消息大小限制

在工作中遇到了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);

 

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