dsp*_*099 2 performance logging heroku redis node.js
假设我每秒都有大约150个请求进入api(node.js),然后在Redis中登录.按照这个速度,价格适中的RedisToGo实例每小时左右就会填满一次.
日志只是生成每日\ monthly\annual统计信息所必需的:这是最受欢迎的关键字,它是最高请求的网址,每日请求的总数等.没有超级重的计算,但有点耗时的数组运行看哪个是每个中最常见的元素.
如果我分析然后转储这些数据(在节点中使用setInterval函数可能?),比方说,每30分钟一次,这似乎不是什么大问题.但是如果突然间我必须处理每秒2500个请求呢?
我突然间每小时处理4.5~Gb的数据.每30分钟约2.25Gb.即使redis \node有多快,计算最频繁的请求仍需要一分钟.
问题:当处理2.25 gb的dada时,redis实例会发生什么?(从列表中,我想)
是否有更好的方法来处理潜在的大量日志数据,而不是将其移动到redis然后定期刷新?
IMO,您不应该使用Redis作为缓冲区来存储日志行并在之后批量处理它们.为此消耗内存并没有多大意义.通过在单个服务器中收集日志并将其写入文件系统,您将获得更好的服务.
现在你可以用Redis做的是试图实时计算你的统计数据.这是Redis真正闪耀的地方.您可以直接存储和汇总需要计算的统计信息,而不是将原始数据保存在Redis中(以后再批量处理).
例如,对于每个日志行,您可以将以下命令传递给Redis:
zincrby day:top:keyword 1 my_keyword
zincrby day:top:url 1 my_url
incr day:nb_req
Run Code Online (Sandbox Code Playgroud)
这将计算当前日期的热门关键字,最高网址和请求数.在一天结束时:
# Save data and reset counters (atomically)
multi
rename day:top:keyword tmp:top:keyword
rename day:top:url tmp:top:url
rename day:nb_req tmp:nb_req
exec
# Keep only the 100 top keyword and url of the day
zremrangebyrank tmp:top:keyword 0 -101
zremrangebyrank tmp:top:url 0 -101
# Aggregate monthly statistics for keyword
multi
rename month:top:keyword tmp
zunionstore month:top:keyword 2 tmp tmp:top:keyword
del tmp tmp:top:keyword
exec
# Aggregate monthly statistics for url
multi
rename month:top:url tmp
zunionstore month:top:url 2 tmp tmp:top:url
del tmp tmp:top:url
exec
# Aggregate number of requests of the month
get tmp:nb_req
incr month:nb_req <result of the previous command>
del tmp:nb_req
Run Code Online (Sandbox Code Playgroud)
在月末,该过程完全相似(在月度数据上使用zunionstore或get/incr来聚合年度数据).
这种方法的主要好处是每个日志行的操作数量有限,而月度和年度汇总可以很容易地计算.