# 082. 在 storm 拓扑中加入热点缓存消失的实时自动识别和感知的代码逻辑
# storm 中增加热点消失感知逻辑
在 cn.mrcode.cachepdp.eshop.storm.ProductCountBolt.HotProductFindThread#run
中补充该逻辑
// 4. 热点商品消失,通知 nginx 取消热点缓存
if (lastTimeHotPids.size() > 0) {
// 上一次有热点商品
for (long lastTimeHotPid : lastTimeHotPids) {
// 但是不在这一次的热点中了,说明热点消失了
if (!hotPidList.contains(lastTimeHotPid)) {
// 发送到分发层
String url = "http://eshop-03/cancel_hot?productId=" + lastTimeHotPid;
HttpClientUtils.sendGetRequest(url);
}
}
}
lastTimeHotPids.clear();
for (Long pid : hotPidList) {
lastTimeHotPids.add(pid);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# nginx 增加取消热点逻辑
在 /usr/hello/hello.conf
中增加接口映射
location /cancel_hot {
default_type 'text/html';
content_by_lua_file /usr/hello/lua/cancel_hot.lua;
}
1
2
3
4
2
3
4
/usr/hello/lua/cancel_hot.lua
逻辑
local uri_args = ngx.req.get_uri_args()
local product_id = uri_args["productId"]
local cache_ngx = ngx.shared.my_cache
local hot_product_cache_key = "hot_product_"..product_id
-- 设置标志,并且过期时间为 60 秒,过期之后条件也不成立
cache_ngx:set(hot_product_cache_key,"false",60)
1
2
3
4
5
6
7
2
3
4
5
6
7
在 /usr/hello/hello.conf
中声明下 nginx 的缓存变量 my_cache
lua_shared_dict my_cache 128m;
1