总所周知,随着云技术的发展,和业务的复杂度的上升,越来越多的系统开始拆分成独立的子模块微服务。模块之间免不了相互通信。但是随着业务量的增多,传输量也随之增大,偶发性timeout,无响应, 传输量过大等问题。

这时候就要对服务进行配置需要进行调优。可以从运维层面,或者代码层面,本文主要介绍从代码层面

Grpc是一个很好的微服务框架,大部分语言都支持,之前的文章有介绍,可以看一下

这次主要说一下在Grpc微服务通信间的一些问题及优化。运维层面我们就不说了,主要是代码层面的优化。主要是C#代码,其他语言可参考,Grpc框架都大差不差

问题一:

 Docker Swarm 模式下 服务闲置一段时间,客户端第一次连接会提示异常。咱公网是k8s部署,不清楚为什么k8s不会出现这个问题。

后来,通过查资料,可以大致知道是这么个流程。首先 kube-proxy 是支持 IPTABLES 和 IPVS 两种模式的,

使用的是 IPTABLES不会出现问题。具体为啥,没做深入连接,运维层面,我们就不吹牛逼。各位看官有兴趣去查一下,告诉小弟。

Grpc.Core.RpcException: Status(StatusCode=Unavailable, Detail="Connection reset by peer")
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Grpc.Core.Internal.AsyncCall`.UnaryCall(TRequest msg)
at Grpc.Core.DefaultCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method` method, String host, CallOptions options, TRequest request)
at Grpc.Core.Interceptors.InterceptingCallInvoker.<BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest req, ClientInterceptorContext` ctx)
at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext` context, BlockingUnaryCallContinuation` continuation)

解决方案:

1、重试机制

.net 可通过polly 实现,当然,这种方式不太好,毕竟不算根本上解决问题。只能算取巧。可以用第二种,从根本上解决唤醒问题

  private readonly Polly.Retry.RetryPolicy RetryPolicy = Policy
.Handle<RpcException>(t => t.Status.StatusCode == StatusCode.Unavailable)
.Retry();

2、还可以通过优化Grpc 服务端代码,新增如下配置即可

var server = new Server(new List<ChannelOption>
{
new ChannelOption("grpc.keepalive_time_ms", ), // 发送 keepalive 探测消息的频度
new ChannelOption("grpc.keepalive_timeout_ms", ), // keepalive 探测应答超时时间
new ChannelOption("grpc.keepalive_permit_without_calls", ) // 是否允许在没有任何调用时发送 keepalive
})
{
Services = { ServiceA },
Ports = { new ServerPort(host, port, ServerCredentials.Insecure) },
};

问题二:

Grpc传输量,默认是4M,如果服务之间调用,传输数据量超过最大值,会提示 , Received message larger than max (xxxxxx vs. 4194304

解决方案:

1、我们通过代码配置,调大这个限制。以提高服务间吞吐量。

当然,不建议太大,太大了对服务资源也是一种消耗。可以通过第二种方式进行优化

 var channelOptions = new List<ChannelOption>();
// add max message length option 设最大接收数量
channelOptions.Add(new ChannelOption(ChannelOptions.MaxReceiveMessageLength, ( * * ) * ))

2、通过Grpc流式调用

Grpc 是基于 HTTP/2 实现的,HTTP/2 具有流的概念,流是为了实现 HTTP/2 的多路复用。流是服务器和客户端在 HTTP/2 连接内用于交换帧数据的独立双向序列,逻辑上可看做一个较为完整的交互处理单元,即表达一次完整的资源请求、响应数据交换流程。

类型

说明

简单 RPC

客户端传入一个请求对象,服务端返回一个结果对象

客户端流式 RPC

客户端传入多个请求对象,服务端返回一个结果对象

服务端流式 RPC

客户端传入一个请求对象,服务端返回多个结果对象

双向流式 RPC

客户端传入多个请求对象,服务端返回多个结果对象

具体可以用法看一下官方文档,后面出一篇文章详细说一下流式调用,各位大侠敬请期待

如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!

本文版权归作者和博客园共有,来源网址:https://www.cnblogs.com/DanielYao/欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利

 

聊聊Grpc使用中的坑以及怎么填的更多相关文章

  1. 从构建分布式秒杀系统聊聊Lock锁使用中的坑

    前言 在单体架构的秒杀活动中,为了减轻DB层的压力,这里我们采用了Lock锁来实现秒杀用户排队抢购.然而很不幸的是尽管使用了锁,但是测试过程中仍然会超卖,执行了N多次发现依然有问题.输出一下代码吧,可 ...

  2. 文艺splay,占坑等着填

    昨天CF上去就A了前三道题,然后自闭罚坐一个小时什么也没写出来23333.似乎D题人均wa3发就很烦.还是肤浅了 今天精神状态不太好,可能是晚睡的缘故,那不如明天一起写了算了 蹲一波大选结果,蹲一波s ...

  3. 浅谈Gson和fastjson使用中的坑

    相信大家在代码编写中都用过Gson和fastjson吧,用来进行 Java对象和json字符串之间的转换. 本篇文章就主要介绍博主在工作中使用这两款工具时遇到的坑和对应的解决办法. 觉得有用的可以点个 ...

  4. 数据统计 任务的一点感想 , sql 使用中的坑。

    需求: 多张表(个数不定,需求不是非常明确,只有一个大致需求)根据业务需求统计出一些数据 (按天统计,数据有多条校验规则)进行上传. 注意: 校验数据是否正确是需要第三放来反馈的,而且第三方的测试环境 ...

  5. React-Native 使用中的坑

    android 1.键盘会在 ScrollView 之上----不知道是不是未给ScrollView 设置高度的问题 2.navigation的标题在android居中显示办法 navigationO ...

  6. 微信JSApi支付~坑和如何填坑

    返回目录 微信一直用着不爽,这几天研究它的jsapi支付,即在微信内打开H5页面,完成支付的过程,在这个过程中,你将会遇到各种各样的问题,而大叔将把这些问题的解决方法写一下,希望可以给你带来帮助! 一 ...

  7. BigDecimal使用中的坑

    1.BigeDecimal调用divide时一定要记得规定小数位数的保留情况,不然除不尽的时候报错. 2.使用该种BigeDecimal时,加减乘除都要使用它内部封装好的方法,不然容易报错.

  8. JavaScript之周道长浅谈变量使用中的坑

    天空一声巨响,道长闪亮登场,飞花落叶,尘土飞扬,此处不应恐慌,用阅读变量的概念来提升气场. 1)变量的声明,使用一个变量之前应该先声明.变量是使用关键字var来声明的,如下: var number; ...

  9. 关于MySQL redo log,挖些坑,慢慢填

    1. 为什么可以设置为多个redo log ? (innodb_log_files_in_group,默认值和推荐值都是2,我们线上设的统一为4): 2. 什么条件下会触发刷脏?除了master_th ...

随机推荐

  1. 2019-2020-1 20199328《Linux内核原理与分析》第六周作业

    使用gdb跟踪分析一个系统调用内核函数 首先我们删除本身的menu目录,并从github上克隆一个menu,并进行编译 编译过程 现在找到test.c文件,加入上个实验中做的getPid()方法 利用 ...

  2. Web性能优化之-深入理解TCP Socket

    什么是Socket?    大家都用电脑上网,当我们访问运维社区https://www.unixhot.com的时候,我们的电脑和运维社区的服务器就会创建一条Socket,我们称之为网络套接字.那么既 ...

  3. js 实现图片瀑布流效果,可更改配置参数 带完整版解析代码[waterFall.js]

    前言:         本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽.         本篇文章为您分析一下原生JS实现图片瀑布流效果 页面需求 1 ...

  4. Vant Weapp小程序蹲坑之使用card组件显示价格

    问题 在基于mpvue+Vant Weapp组件库实战过程中,问题越来越多.网络上所谓的"坑"总结,仅仅不过是其开发中所遭所遇之"坑"而已--估计后面的&quo ...

  5. vue中递归组件的使用

    2019独角兽企业重金招聘Python工程师标准>>> 递归 简单来讲就是程序自己调用自身. vue中的递归组件就是,组件自身调用自身. 父组件 <template> & ...

  6. MySQL用另一张表的字段值Update本表

    SQL示例: UPDATE TABLE1 a, TABLE2 b SET a.field1 = b. field1 [, a.field2 = b.field2, ...] WHERE a.connn ...

  7. ROC-RK3328-CC开源主板运行LibreELEC系统

    LibreELEC是运行Kodi媒体中心的轻量级操作系统,基于Linux内核发行,系统为适配Kodi运行环境,做了许多优化和精简,运行速度快,操作简单.是一款很优秀的多功能播放器操作系统. ROC-R ...

  8. 爱创课堂每日一题第五十四天- 列举IE 与其他浏览器不一样的特性?

    IE支持currentStyle,FIrefox使用getComputStyle IE 使用innerText,Firefox使用textContent 滤镜方面:IE:filter:alpha(op ...

  9. 图论--Floyd总结

    Key word:     ①最短路     ②传递闭包:大小关系 数值关系 先后关系 联通关系     ③floyd变形     ④实现方式:插点发法     ⑤思想:动态规划 1.最短路: 最短路 ...

  10. python-文件字符分布【get()函数与.sort(key=lambda x:x[0],reverse = False)】

    文件字符分布 描述 统计附件文件的小写字母a-z的字符分布,即出现a-z字符的数量,并输出结果.‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬ ...