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);

 

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