Spring Cloud参数调优

一般情况下,我们现在大多数公司,包括很多创业公司,一上来就搞一套Spring Cloud,这已经成了行业标配,你说你们公司还在用SpringBoot的单体架构,我天!,一听感觉很low,这公司没啥前途,学不到东西。

然后我们加班加点终于开发完了,经测试同学通过,这时就开始上线了,刚开始好好的,系统反应还是很快的,但是用了一段时间,发现某些服务很慢,经常发生timeout,那现在怎么办呢?要不干脆点直接调大超时时间吧!,反正也找不到当初开发的哥们了,离职了,谁也不愿意去看他的烂代码,也不敢动,毕竟支撑着公司的业务,出问题了,担不起,所以还是直接调大timeout的时间吧,于是就在application.yml中调整:

ribbon:
  ReadTimeout: 10000
  ConnectTimeout: 10000
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000

超时一般设置两个地方,feign和ribbon那块的超时,还有hystrix那块的超时,其中后者那块的超时一般必须大于前者。这样看来,虽然慢了点,好歹不报错,数据能够刷出来,老板那也有了交代了。

又过了一段时间公司开始大面积推广了,用户量突然暴增,并发量直线上升,高峰期时候某个页面突然卡死了,不动了,后面的用户访问这个页面的时候页不动了。原因是这个服务的hystrix的线程池满了,hang住了

这个时候怎么办呢?要不重启下吧!程序员法宝重启服务~~,但是问题很快又会出现,亚历山大啊,那我们该如何合理的来解决这个问题呢?

我认为首先要优化服务A,不能简单粗暴的调大超时时间,要检查下代码,是不是使用了线程不安全的类比如hashmap、arraylist等,这个要根据实际情况来判断,除了检查代码,还要看下sql,能不能优化,如果使用第三方组件还得结合组件来优化。

一般情况下超时时间最好不要超过1s,如果超过1s,建议下是不是引入缓存、或者搜索引擎来优化。

设置了超时时间,还要设置重试次数,比如:

ribbon:
  ReadTimeout: 10000
  ConnectTimeout: 10000
  MaxAutoRetries: 0
  MaxAutoRetriesNextServer: 1

这样就万事大吉了吗?万一因为网络问题,明明调用下游的接口成功了,却没有返回成功,这时候按照设置,会继续重试,如果这个时候网络好了,也返回成功消息了,那这个接口不就调用成功两次了么?如果是一笔支付那就完了。

所以我们还得考虑接口幂等性的问题,记得只要涉及重试,一定要保证幂等性,那一般常见的幂等性方式:

  1. 根据具体的业务,比如我们可以使用雪花算法生产一个唯一的业务键,作为mysql的主键,插入时如果发现重复了就会报错。

  1. 结合redis的key,每次插入数据都去redis那判断下,如果key已经存在了,就不用重复操作了。

如果你想更加系统的学习知识,请关注我的微信公众号-辉哥讲技术

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值