突然有一天,运营人员说,push发送数量翻倍了,是什么原因呢。
push发送过多 排查步骤:
系统在给用户发送push的时候,是根据该用户的id,查询出所有登陆过的设备,而发送设备的push的。
sql如下:
SELECT
<include refid="Push_User_Columns_PAY"/>
FROM push_user
WHERE user_id=#userId#
AND device_token is not null group by device_token
我们可以设想:如果一个用户修改手机信息,伪造各种设备,该语句返回的记录数量将会是很多的,比如超高1万甚至更多。
线上去查看了下>1000的记录数目
不看不知道,一看吓一跳。
修改sql:
SELECT
<include refid="Push_User_Columns_PAY"/>
FROM push_user
WHERE user_id=#userId#
and status=1
and device_token is not null group by device_token
order by id desc limit 10
只取前10个,当然大多数是小于10个的,但是得加上limit 10的限制,试想:如果某些用户的记录数>10000,系统内存肯定撑爆,一系列的问题随着而来,full gc,系统变慢,导致不可用。
总结:在写sql的时候,一定要加上limit的限制数量,也许开始数量并不多,但数量一旦多起来的时候,就是系统变慢的时候了,所有这篇文章在此记录下。