不是所有的大作业都叫微信抢票大作业
为时四周的微信抢票大作业终于接近尾声,回首这段时间,真是感慨万千。不是所有的大作业都是微信抢票大作业,能够让人同时体验产品经理、开发工程师、测试工程师、运维工程师四个角色。经过了微信抢票大作业的洗礼,才知道之前对老师上课讲的内容只是一知半解,只有实践才能出真知。
一、搞开发
讲道理,这次大作业的开发工作其实不是很多。因为框架设计的很好,接口也介绍的很详细,只需要按部就班填坑就可以达到基本要求了。
但是既然助教上课都提到了几个优化方案,比如内存型数据库,异步队列等,好奇如我怎能不试呢。于是就开始给自己挖坑,然后再吭哧吭哧填坑。。。缓存机制和异步队列的设计实现文档里都有提及,不再赘述了(毕竟说起来真是好麻烦,一把辛酸泪。。。)
就讲一个很有趣的debug经历吧:
1 with transaction.atomic(): 2 try: 3 if is_key: 4 act = Activity.objects.select_for_update().get(key=key_or_id) 5 else: 6 act = Activity.objects.select_for_update().get(id=key_or_id) 7 ticket = Ticket.objects.select_for_update().get(student_id=self.user.student_id, activity_id=act.id) 8 reply_text = { 9 'Title': self.get_message('ticket_title', act_name=act.name), 10 'Description': self.get_message('ticket_description', act_description=act.description), 11 'Url': self.url_ticket(ticket.unique_id) 12 } 13 is_reply_text = False 14 except Activity.DoesNotExist: 15 reply_text = "活动不存在" 16 except Ticket.DoesNotExist: 17 if act.book_start > timezone.now(): 18 reply_text = "抢票尚未开始" 19 elif act.book_end < timezone.now(): 20 reply_text = "抢票已经结束" 21 elif act.remain_tickets <= 0: 22 reply_text = "对不起,票已经被抢光啦" 23 else: 24 act.remain_tickets -= 1 25 act.save() 26 t = Ticket(student_id=self.user.student_id, 27 activity_id=act.id, 28 unique_id=gen_unique_id(self.user.student_id, act.id), 29 status=Ticket.STATUS_VALID) 30 t.save() 31 reply_text = "抢票成功,请稍后查看抢票结果" 32 is_success = True 33 if is_success: 34 task_update_activity_in_cache.delay(act.id)
这是我抢票部分的代码,大概就是在锁内读取数据库,更新数据库,在锁外以异步队列更新缓存。
1 @task 2 def task_update_activity_in_cache(id): 4 acts = Activity.objects.filter(id=id) 5 print(acts[0].remain_tickets) 6 print(timezone.now()) 7 if not acts: 8 return 9 if acts.count() > 1: 10 raise DbError("duplicated id") 11 activity = acts[0] 12 cache.set(querykey_of_act('id', activity.id), activity) 13 cache.set(querykey_of_act('key', activity.key), activity)
这是我的task_update_activity_in_cache。设想中如果抢到票,会先更新数据库该活动的余票数,然后我异步更新缓存的时候,从数据库中读取这个活动,更新缓存中该活动的余票数。然而实际上我抢了票之后,再查看活动详情,余票数并没有-1。一开始我以为是celery没配好,没执行这个任务,但是后来我加了第五行后,控制台打印了信息,而且就是原来的余票数,并没有减一。查看数据库,余票数又是更新了的,so interesting...
在我一筹莫展的时候,突然有一次,异步任务成功更新了缓存,这就更加玄学了。。。突然我灵机一动,决定分别在两个函数里打印save()操作和filter()操作的时间,发现当两个时间只相差0.0001秒的时候,filter()从数据库读取的还是原来的值,当时间差大一点之后,filter()从数据库读取的就是新值。所以。。。续一秒,解决问题:)
唯二的遗憾就是没能用异步队列实现定时更新菜单的操作,以及部署时没能以deamon的方式运行celery,原因都是实在配不起来,查遍文档也配不起来,搜遍谷歌也配不起来,只好选择放弃T T
二、配环境
我对配环境这件事的唯一印象就是:只要有大作业就要配环境,只要配环境就会头疼,配着配着就不知道自己配到哪里了,查遍谷歌度娘结果全是骗人的。但是这次大作业不仅要配环境,而且还要配很多很多的环境,而且不仅要配开发环境,还要配生产环境。也许是做好了长期抗战的心理准备,这次反而很淡定,也很顺利。现在我觉得,配环境这件事也不是那么枯燥乏味的。心得体会就是:配环境最重要的是要动脑子,要明白基本的工作原理,一定一定要查文档,一定一定要好好学习英语,一定一定不要迷信谷歌度娘,一定一定要看比较新的answer。。。
三、做测试
部署完成之后,就可以开始做性能测试。性能测试我使用了jmeter进行压测。性能测试必须是在功能正确的基础上进行测试。所以从我准备开始性能测试到我真正开始性能测试,花了整整一天时间debug。。。因为是学生党,经费有限,所以选了一个配置最低的服务器,刚开始测的时候在并发数为200的时候就有超过10%的错误率,平均响应时间为几万毫秒。感觉这种错误率实在是太可怕了,所以又对抢票和缓存的代码进行重构,效果也只是将平均响应时间缩短了几百毫秒,错误率并没有下降。
一筹莫展的时候,我突然想到可以用jmeter的结果分析树看看都是哪里出了问题,然后我发现错误都是no http response,也就是请求超时。说明错误率高并不是程序的问题,于是花了20块钱将服务器的带宽从1mbps调为2mbps,能承受的最大并发数一下子提高到500,零错误率,平均响应时间几百毫秒。一颗赛艇!!!
当并发数达到600时,又开始有错误。立刻查看响应,是nginx发了502 BAD GATEWAY。说明nginx在转发请求之后迟迟得不到响应,也就是uwsgi的问题,为了进一步提高性能,我又提高了uwsgi的listen参数,但是由于系统net.core.somaxconn为128,所以这个参数只能到128。重新测试,能承受的并发量提高到700。因为服务器配置确实比较低,所以基本上达到瓶颈了。
总结下来,虽然最后仍有一些遗憾,但是成功完成了如此challenging的大作业,还是很开心的。
转载于:https://www.cnblogs.com/zizhao/p/6030213.html
不是所有的大作业都叫微信抢票大作业相关推荐
- Django微信抢票大作业总结
本次微信抢票大作业的开发到此已经结束了.在这几周间,紧张的开发也使我收获颇丰.接下来我就谈谈自己在这一开发过程中的一些心得体会. 首先谈谈自己学到的东西.我感觉自己最大的收获就是接触到了服务器方面的编 ...
- 【互联网今日大事儿记】春运抢票开始啦!
点击上方 "公众号" 可以订阅哦! 1 索尼明年或下调员工薪酬 北京时间12月6日消息,据路透社报道,索尼很有可能在明年下调员工平均薪酬.在两年内六次下调业绩预期后,索尼正经历痛苦 ...
- 2018,抢票大作战
寒冬腊月,雾霾笼罩,又到了抢票的季节! 抢票资源 了解更多抢票信息.软件及技巧,请加群:417633743 抢票记录 2018.1.17 多次失败后,终于抢到了有座的了. 2017.12.29 今天进 ...
- python演唱会抢票脚本_基于selenium的大麦网演唱会抢票程序
自从我在知乎分享了代码后,很多人关注了我的代码,自己也很荣幸,哈哈.但是好多人运行我的代码却出现了这样那样的问题,我刚开始也很纳闷,明明自己当初试了好几个演唱会都可以,为什么现在有这么多问题,上段时间 ...
- 抢票加速包的钱都白花了?铁总:第三方抢票软件已被限制
春节将至,繁忙的返乡大军又将成为春运的主力军.有些幸福的人儿已经踏上了返乡的旅程,然而更多的是仍需坚守在工作岗位,且车票没有着落的命苦的人. 如何更为便捷的购票,成了每年返乡人心中的痛.中国铁路123 ...
- python解释器环境中、用于表示上一次_大工20秋《数据挖掘》在线作业3 【标准答案】...
可做奥鹏全部院校作业论文!答案请添加qq:599792222 或 微信:1095258436 大工20秋<数据挖掘>在线作业3 1.[单选题] 以下哪一种数据类型元素之间是无序的,相同元素 ...
- flash大作业一分钟源文件_初中生写作业慢的7个原因及对策
写作业慢的原因提要:1.条理性差--学习无方法.2.追求完美--橡皮综合症.3.学习基础差--学习没有兴趣,学习有困难.4.被逼无奈--故意磨蹭.5.时间观念差--不会管理时间.6.注意力不集中--无 ...
- 16秋川大计算机基础作业,川大 16秋 《计算机应用基础》第一次作业答案
<川大 16秋 <计算机应用基础>第一次作业答案>由会员分享,可在线阅读,更多相关<川大 16秋 <计算机应用基础>第一次作业答案(7页珍藏版)>请在人 ...
- 如下哪个是Java中的合法自定义标识符_吉大13春《面向对象程序设计》在线作业答案...
吉大13春<面向对象程序设计>在线作业答案 2013-03-21 01:03:14 259 有学员问关于吉大13春<面向对象程序设计>在线作业答案的题目的参考答案和解析,具体如 ...
最新文章
- java分代技术_JVM调优总结(六):分代垃圾回收详述2
- 如果有一天 Pytorch / Tensorflow 不开源了,我们该怎么办?
- WINXP光启工具盘的制作(4)-acrosin true image
- 判断脚本,图片,CSS,iframe等是否加载完成
- JavaScript提高:005:ASP.NET使用easyUI TABS标签显示问题
- Spring注释详解
- Web前端进阶之JavaScript模块化编程知识
- boost::timer::progress_display相关的测试程序
- vue - blog开发学习1
- linux6.0 安装教程,CentOS 6.0安装步骤
- java gui 单选_java GUI编程(swing)之三swing单选框复选框组件
- node ajax validator,使用validator.js对字符串数据进行验证
- python导入dat数据_Kaggle影评数据集,Python数据分析小例子14
- 【POJ1442】Black Box
- feign调用多个服务_SpringCloud服务间调用
- dojo省份地市级联之省份Dao接口类(三)
- ios人脸识别_适用于Android和iOS的10种最佳人脸识别应用程序
- 国家药品不良反应监测中心 ADR 电子传输EDI解决方案
- 海思HI3518E视频处理基础概念《二》----- 视频输入VI和 视频输出VO
- linux定时清理临时目录,tmp临时文件目录自动清理