微服务预热那些事

背景

随着流量增长,服务的节点越来越多,对服务性能要求也越来越大,在服务启动时经常会发现存在抖动,针对这些服务抖动,就需要采取一些预热措施,下面就简单介绍下系统相关的服务预热、中间件预热、数据库预热等

预热场景

服务预热

在《springcloud线上发布超时》系列文章中已经描述了一些微服务需要预热的服务资源,

  • 连接池
  • 线程池
  • 限流池
  • grpc连接
  • jit

池资源相关预热我这里就不描述了,参考我的发布预热系列文章:springcloud线上发布超时

这里说一下jit,网上有两种方案,

方案一 定制化jdk

将jit过程信息保存到文件中,下次发布时自动加载,成熟方案是阿里的jwarmup,已经集成到阿里的jdk中,有兴趣的可以了解下

方案二 跑测试用例预热

一般都是采用测试用例预热,如果仅仅是jdk预热,可以直接跑几个测试用例循环n次就行,但是如果涉及到中间件预热,这里就可能不满足需求了。
我现在就是采用流量录制以及回放预热,如下图:
在这里插入图片描述

方案三 定制路由策略,通过tag配置来路由

这里的方案就是需要定制化路由策略,刚启动的服务注册时带上一些配置信息,网关或者服务调用段获取到配置后来根据配置来路由,先路由少量流量,慢慢增加直到路由100%,这样可以达到针对jit的预热效果

中间件预热

redis预热

先在很多服务为了提高吞吐量而使用redis,这就会导致服务启动后或者redis数据丢失后,会导致请求都打到db中去,从而导致db压力倍增,这就是常见的redis雪崩。

CDN预热

CDN经常是也承担了入口缓存,那么这里也会需要预热,可以录制生产流量回放来达到预热效果。

mysql预热

mysql重启后十几分钟的性能是非常差的,原因是因为InnoDB有innodb buffer pool,详细可以参考该链接:https://blog.csdn.net/u014236541/article/details/79870670

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
一、基于nginx+lua完成商品详情页访问流量实时上报kafka的开发 ==================================== 在nginx这一层,接收到访问请求的时候,就把请求的流量上报发送给kafka 这样的话,storm才能去消费kafka中的实时的访问日志,然后去进行缓存热数据的统计 用得技术方案非常简单,从lua脚本直接创建一个kafka producer,发送数据到kafka ``` wget https://github.com/doujiang24/lua-resty-kafka/archive/master.zip yum install -y unzip unzip lua-resty-kafka-master.zip cp -rf /usr/local/lua-resty-kafka-master/lib/resty /usr/hello/lualib nginx -s reload local cjson = require("cjson") local producer = require("resty.kafka.producer") local broker_list = { { host = "192.168.31.187", port = 9092 }, { host = "192.168.31.19", port = 9092 }, { host = "192.168.31.227", port = 9092 } } local log_json = {} log_json["headers"] = ngx.req.get_headers() log_json["uri_args"] = ngx.req.get_uri_args() log_json["body"] = ngx.req.read_body() log_json["http_version"] = ngx.req.http_version() log_json["method"] =ngx.req.get_method() log_json["raw_reader"] = ngx.req.raw_header() log_json["body_data"] = ngx.req.get_body_data() local message = cjson.encode(log_json); local productId = ngx.req.get_uri_args()["productId"] local async_producer = producer:new(broker_list, { producer_type = "async" }) local ok, err = async_producer:send("access-log", productId, message) if not ok then ngx.log(ngx.ERR, "kafka send err:", err) return end ``` 两台机器上都这样做,才能统一上报流量到kafka ``` bin/kafka-topics.sh --zookeeper 192.168.31.187:2181,192.168.31.19:2181,192.168.31.227:2181 --topic access-log --replication-factor 1 --partitions 1 --create bin/kafka-console-consumer.sh --zookeeper 192.168.31.187:2181,192.168.31.19:2181,192.168.31.227:2181 --topic access-log --from-beginning ``` (1)kafka在187上的节点死掉了,可能是虚拟机的问题,杀掉进程,重新启动一下 nohup bin/kafka-server-start.sh config/server.properties & (2)需要在nginx.conf中,http部分,加入resolver 8.8.8.8; (3)需要在kafka中加入advertised.host.name = 192.168.31.187,重启三个kafka进程 (4)需要启动eshop-cache缓存服务,因为nginx中的本地缓存可能不在了 二、基于storm+kafka完成商品访问次数实时统计拓扑的开发 ==============

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值