错误案例
【现象描述】
芝麻开门项目在周末两天的时间内共对1650万左右的数据进行了订正,订正当天应用正常。到了周一,由于中文站的访问量一下子增加,导致memcached写入死锁。从上午九点左右开始,发现阿里助手首页打开很慢,中午到下午两点响应时间进一步增加。下午三点半左右,随着cache的会员逐渐增多,应用逐渐恢复,下午五点开始基本恢复正常。
【错误代码】
While(存在未处理的数据) { Member = readFromDB(); // 从数据库中逐一读取 update(member); // 更新这个会员数据,并默认清空该会员cache中的数据; logger.info(member); }
错误分析
在大数据量订正的时候,如果该数据也保存在cahce中,要把大数据块分成小块,每次只处理小块数据,并要防止cache数据被清空。因为在系统高访问的情况下,高并发的写入cache,每一次写入cache都会加锁,而mencached本身有缺陷,在高并发的时候,等待写入的请求直线增加,会导致写入无限制延长,甚至写入死锁。
正确用法
提取所有数据保存到文件file1;
评估确定每天允许更新的数据量 k,分块处理大数据量;
设置定时任务,每天执行一次;
任务代码如下:
i = 0; While(i <= k){ member = readFromFile(file1); Update(member); putBackToCache(member) // 必要时需要这么做,但是需要和架构师讨论; logger.info(member); removeFromFile(file1); i ++; }
测试关注点
1、测试环境下执行任务,使得cache数据被清空;
2、模拟用户高并发访问的情况,启动多个进程进行持续访问;
3、打开系统页面,检查系统响应时间是否增加,以及是否可以接受,检查系统是否有死锁的日志。