热点数据降级详解(storm+nginx+lua)

对于热点数据,瞬间大量流量涌入,通过转发层nginx可能会流向同一个应用层nginx,因此可能导致崩溃。需要对这些热点数据进行降级处理,将流量负载均衡到所有的应用层nginx上

  • 用storm实时统计处瞬间称为热点的数据
    基于之前所描述,我们会将所有相关的流量请求都分上报至kafka从而通过storm来统计保存至LRUMap,接下来可以比较高频率的(秒级)去遍历这些LRUMap,将其中的访问次数进行排序,统计处靠后的95%的商品访问次数的平均值,然后从往前开始遍历去找有没有瞬间出现的热点数据,我们可以定义靠前的数据超过95%平均值多少倍的阀值就认定为热点数据,然后继续遍历直至小于平均值多少倍的一个安全值就brean这个循环。
  • 将storm统计处认定为热点的数据上报到流量分发层nginx
    通过http将统计出的热点数据发送至流量分发层nginx上,通过lua脚本去处理这个请求,并将商品列表放至本地缓存中,同时storm会将热点数据对应的完整缓存发送至所有的应用层nginx服务器上去,并放至本地缓存中
  • 流量分发层nginx的分发降级策略
    对于流量分发nginx,每次访问一个商品详情页的时候,如果发现它是热点,那么立即做流量分发策略的降。可以通过hash策略,针对同一个productId的访问都同一台应用nginx服务器上的这种情况降级成对这个热点商品,流量分发采取随机负载均衡发送到所有的后端应用nginx服务器上去,从而避免说大量的流量全部集中到一台机器
  • storm保存热点商品id对应的list
    storm每次统计热点的数据都需要基于上一次的统计结果,对于不是热点数据的商品发送http请求值流量分发的nginx上去,取消掉之前进行的降级策略处理,并从该nginx本地缓存中删除
一、基于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完成商品访问次数实时统计拓扑的开发 ==============
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值