# 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

# 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

/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

/usr/hello/hello.conf 中声明下 nginx 的缓存变量 my_cache

lua_shared_dict my_cache 128m;
1