前段时间一直忙着面试、写论文,这段时间稍微空闲下来,写一下做的一个比较有特点的项目,主要是处理高并发的一套流程,主要是相关思路并且会帖出相关代码实现。
1:项目简单介绍+问题产生原因
在研一到研二期间实验室开发小组为某区疾控中心做的一个预约管理系统,这个项目具有以下的一个业务流程:每天的上午九点钟,疾控中心的工作人员会放出一批体检预约号,总量大概在200-300左右,号码有限,且体检通过会获得疾控中心发放的健康证(此证存在用于上岗的硬性要求),于是会导致大量餐饮或者其他第三产业服务者用户蹲点抢号,造成了一个短时间的高并发场景,一方面是对于用户的响应不及时,影响用户使用体验,一方面大量请求集中打在数据库上,对于数据库也造成了一定的压力,于是我们开发了一套先消费的处理逻辑解决这个问题。
2:解决流程思路分享
2.1: 总体流程思路
具体流程如下,在疾控中心的操作人员发放预约号时,会同时将这一批预约号信息(包括预约时间、预约号库存等信息)放入到redis缓存中,用户调用取号接口时,首先通过redis分布式锁进行互斥访问缓存中的预约号信息,成功获取到库存号的用户才允许发送消费消息到rabbitMQ(实质上是发送自己的相关信息、预约号的相关信息整合到一个对象类,在数据库中生成一条预约记录),成功发送消息到消息队列上的用户,可以立即返回消费成功的提示,以此减少用户响应时间,同时进行了一个流量削峰的操作,缓解了数据库压力。