为时四周的微信抢票大作业终于接近尾声,回首这段时间,真是感慨万千。不是所有的大作业都是微信抢票大作业,能够让人同时体验产品经理、开发工程师、测试工程师、运维工程师四个角色。经过了微信抢票大作业的洗礼,才知道之前对老师上课讲的内容只是一知半解,只有实践才能出真知。

一、搞开发

  讲道理,这次大作业的开发工作其实不是很多。因为框架设计的很好,接口也介绍的很详细,只需要按部就班填坑就可以达到基本要求了。

  但是既然助教上课都提到了几个优化方案,比如内存型数据库,异步队列等,好奇如我怎能不试呢。于是就开始给自己挖坑,然后再吭哧吭哧填坑。。。缓存机制和异步队列的设计实现文档里都有提及,不再赘述了(毕竟说起来真是好麻烦,一把辛酸泪。。。)

  就讲一个很有趣的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

不是所有的大作业都叫微信抢票大作业相关推荐

  1. Django微信抢票大作业总结

    本次微信抢票大作业的开发到此已经结束了.在这几周间,紧张的开发也使我收获颇丰.接下来我就谈谈自己在这一开发过程中的一些心得体会. 首先谈谈自己学到的东西.我感觉自己最大的收获就是接触到了服务器方面的编 ...

  2. 【互联网今日大事儿记】春运抢票开始啦!

    点击上方 "公众号" 可以订阅哦! 1 索尼明年或下调员工薪酬 北京时间12月6日消息,据路透社报道,索尼很有可能在明年下调员工平均薪酬.在两年内六次下调业绩预期后,索尼正经历痛苦 ...

  3. 2018,抢票大作战

    寒冬腊月,雾霾笼罩,又到了抢票的季节! 抢票资源 了解更多抢票信息.软件及技巧,请加群:417633743 抢票记录 2018.1.17 多次失败后,终于抢到了有座的了. 2017.12.29 今天进 ...

  4. python演唱会抢票脚本_基于selenium的大麦网演唱会抢票程序

    自从我在知乎分享了代码后,很多人关注了我的代码,自己也很荣幸,哈哈.但是好多人运行我的代码却出现了这样那样的问题,我刚开始也很纳闷,明明自己当初试了好几个演唱会都可以,为什么现在有这么多问题,上段时间 ...

  5. 抢票加速包的钱都白花了?铁总:第三方抢票软件已被限制

    春节将至,繁忙的返乡大军又将成为春运的主力军.有些幸福的人儿已经踏上了返乡的旅程,然而更多的是仍需坚守在工作岗位,且车票没有着落的命苦的人. 如何更为便捷的购票,成了每年返乡人心中的痛.中国铁路123 ...

  6. python解释器环境中、用于表示上一次_大工20秋《数据挖掘》在线作业3 【标准答案】...

    可做奥鹏全部院校作业论文!答案请添加qq:599792222 或 微信:1095258436 大工20秋<数据挖掘>在线作业3 1.[单选题] 以下哪一种数据类型元素之间是无序的,相同元素 ...

  7. flash大作业一分钟源文件_初中生写作业慢的7个原因及对策

    写作业慢的原因提要:1.条理性差--学习无方法.2.追求完美--橡皮综合症.3.学习基础差--学习没有兴趣,学习有困难.4.被逼无奈--故意磨蹭.5.时间观念差--不会管理时间.6.注意力不集中--无 ...

  8. 16秋川大计算机基础作业,川大 16秋 《计算机应用基础》第一次作业答案

    <川大 16秋 <计算机应用基础>第一次作业答案>由会员分享,可在线阅读,更多相关<川大 16秋 <计算机应用基础>第一次作业答案(7页珍藏版)>请在人 ...

  9. 如下哪个是Java中的合法自定义标识符_吉大13春《面向对象程序设计》在线作业答案...

    吉大13春<面向对象程序设计>在线作业答案 2013-03-21 01:03:14 259 有学员问关于吉大13春<面向对象程序设计>在线作业答案的题目的参考答案和解析,具体如 ...

最新文章

  1. java分代技术_JVM调优总结(六):分代垃圾回收详述2
  2. 如果有一天 Pytorch / Tensorflow 不开源了,我们该怎么办?
  3. WINXP光启工具盘的制作(4)-acrosin true image
  4. 判断脚本,图片,CSS,iframe等是否加载完成
  5. JavaScript提高:005:ASP.NET使用easyUI TABS标签显示问题
  6. Spring注释详解
  7. Web前端进阶之JavaScript模块化编程知识
  8. boost::timer::progress_display相关的测试程序
  9. vue - blog开发学习1
  10. linux6.0 安装教程,CentOS 6.0安装步骤
  11. java gui 单选_java GUI编程(swing)之三swing单选框复选框组件
  12. node ajax validator,使用validator.js对字符串数据进行验证
  13. python导入dat数据_Kaggle影评数据集,Python数据分析小例子14
  14. 【POJ1442】Black Box
  15. feign调用多个服务_SpringCloud服务间调用
  16. dojo省份地市级联之省份Dao接口类(三)
  17. ios人脸识别_适用于Android和iOS的10种最佳人脸识别应用程序
  18. 国家药品不良反应监测中心 ADR 电子传输EDI解决方案
  19. 海思HI3518E视频处理基础概念《二》----- 视频输入VI和 视频输出VO
  20. linux定时清理临时目录,tmp临时文件目录自动清理

热门文章

  1. 开发人员常说的CLI是什么
  2. bootstrap btn按钮颜色
  3. 盘点火影中写轮眼谁最强
  4. VMware虚拟机nat模式详解
  5. golang项目 七牛图片管理系统 基于GIN
  6. 手把手教你使用MATLAB中的Classification Learner
  7. 三星性能测试软件,13款软件压力测试 Galaxy S4性能体验
  8. 一周上手flutter
  9. Amcharts4使用笔记
  10. matlab实现lzw编码,LZW编码算法matlab实现