11月6日,抽奖系统开发的第六天,早上闹钟响了就马上起来了,都不带一点拖延的。
平时早上有时候还想请个假晚点到,早上多赖一会儿床。可这段时间是真不行,任务进度赶着人走,请假是不可能,耽搁都很有危险。
晨会,催进度
9点10分的晨会,产品、技术都要到齐,晚了又没有请假的人,还要发红包。晨会上,产品对着需求表,技术一个个讲自己的工作情况,有困难有问题的地方,再提出来多讲一下。
这段时间的晨会重点,当然就是现在的抽奖系统啦。技术讲完已经开始做抽奖的接口,还有很多细节的部分要完善。产品就问,什么时候能完善,什么时候能提测,离双十一已经不到一周的时间了。
技术也很无奈,现在总体还算是跟上预期的进度了,要想超过计划,提前完成,这个现在是没什么可能,除非,简化需求。
开发没有延期,产品也就不太好催的太极,当然更不会现在去简化需求,甚至还想着运营那边又有些新的想法,还想加进来呢。只是看看技术的难处也是不少,今天也就没再提,毕竟也没有那么着急的需求,没有那么明确的事情,后面还要再跟运营多碰几次再明确了。
主体抽奖接口
接着昨天的抽奖接口,验证完规则成后,就要开始真正的抽奖和发奖了。抽奖要保证公平性,要考虑设计一个合理的随机算法。除了公平还要考虑性能,如果逻辑和算法太复杂,性能很糟糕,那结果也会不太好了。
最简单的随机方法就是类似:掷骰子或者抛硬币,而在程序中还有一个现成的方法,就是数字的random方法,在一个数字区间随机返回一个数字。有了一个随机数字,那要怎么匹配中奖呢?这时候,又要在奖品信息中,给分配一个字段来专门保存中奖区间。中奖区间的数字,也就是根据预设的中奖概率来设置的。比如:一等奖中奖概率为万分之一,那么中奖区间就是0-0;如果二等奖中奖概率为万分之十,那么中奖区间就是0-9;当然,不同奖品的中奖区间不要重复,0-0已经被一等奖使用了,那么二等奖就用1-10。有了这些准备,那实现公平、高效的抽奖也就很容易了。先通过rand.Intn(10000)就得到了一个万以内的随机数,然后再对奖品信息循环匹配中奖区间,落在某个奖品中奖区间,并且奖品有库存,那就可以确定抽奖成功了。
经过上面的抽奖,大家很容易忽略另外一个事情,以为就真的成功了。技术在这里还是考虑的很充分,很仔细的。增加了专门的发奖环节,因为奖品库存的判断和扣减是一个并发执行的过程,是线程不安全的,所以,需要在发奖环节再来专门处理这个问题。是否能够在线程安全的情况下,成功的扣减库存,成功发放奖品出去,才是安全可靠的、真正的发奖成功。
抽奖接口最核心的功能实现到这时候也就完成的差不多了,技术经过许多次开发测试和修改,终于是搞定了这个任务,内心的成就感那也是油然而生啊。再继续后面的任务,也就感觉轻松了好多。
多种类型的奖品发放
晚饭过后,技术回来继续把计划中的多种类型的发奖处理再完善一下。里面的实物奖,优惠券,都还是很不一样的。避免重发优惠券和减库存是类似的一个问题,就是要保证线程安全性读写,这里面可能用到分布式锁,也可能直接用redis或者来实现安全的更新,具体的实现,技术也是有些经验的,不是太大的难题。
老师总结
技术从一开始的不自信,到现在实现的核心抽奖逻辑,已经非常成熟和稳定可靠了,方法也都很好,这个转变可不是一点点呀。大家有没有觉得很惊讶呢?为什么呢?原因很简单,因为技术这两天报名了《Go抽奖系统》的课程,并且重头学过来,正好也就把抽奖接口的实现都借鉴过来了。站在前人的基础上,结合具体的业务,继续深挖技术实现,才是更有价值和意义,对于技术来说,也会更有提高。毕竟学习加上实践,不仅仅是学习,也不仅仅是完成任务,自己既得到了提高,又达成了工作任务,一举多得啊。
后面,技术在抽奖系统的开发中,已经可以拿到课程的源码,很多的开发工作都可以免去了,只要学习掌握了,把课程中的代码拿过去稍微改造下,也就可以达成非常好的线上业务的效果。可能也还会有些改动或者增加些规则,但是,核心的部分、优化的部分,已经是可以学会运用了。
也希望大家在学习了《Go抽奖系统》的课程后,真正的掌握并发编程的一些技能,真正的理解系统优化的一些方法,可以学以致用,有更大的提高。