抽奖活动的高可用、高并发优化


这几年工作中做过不少营销活动,这里以抽奖活动为例,讨论一下如何设计出一个高可用、高并发的营销系统。

高可用、高并发架构的核心是分流和限流。系统架构时,应根据每一种营销活动的场景与特性,制定不同的分流、限流方案。

 业务

在开始进行架构讨论前,我们的简单描述一下业务,以方便我们有针对性的进行讨论。

1.  业务需求

公司希望拉更多的新用户来注册我们的app,所以想通过一个抽奖活动,用一些奖励和刺激的手段来促使用户使用我们的app,并通过奖励手段让用户帮我们一起推广宣传。业务主要诉求如下:

用户需要在app中或者活动页面(H5)中进行某些操作,以获取抽奖机会;例如分享给好友以后奖励一次抽奖机会。

每天每人最多拥有N次抽奖机会。

活动结束后给中奖用户发奖品。

每个人只能中一次奖。

 ……

 

2.  抽奖主流程

840f6d75934584c58173a602062d37132385b83a

这是系统的核心流程,也是后面进行性能优化的核心内容。

 

3.  分析

对活动而言,最重要的是曝光量,只有更多的分享与传播,才能让更多的人参与进来,活动效果才越好,对技术上的要求就是能够提供尽可能好的用户体验。

抽奖活动的页面中,大部分内容都是静态的,只有抽奖按钮需要与服务端交互;对此可以通过客户端、CDN缓存等提升用户体验。

营销活动是拿真金白银来推广,所以需要有效的机制能防止被人恶意攻击,将全部奖品刷走。

如果活动中奖品价值都较高,此种情况下,通常奖品数量有限,中奖概率不高,所以即便是抽奖的并发量较大,实际写DB的压力也并不大,即在扣减奖品库存、向DB中插入中奖记录等环节的写压力并不会大。

如果活动发放类似于优惠券的虚拟奖品,数量可能很大,中奖概率非常高,那么当抽奖并发量大时,写DB的压力会很大。

 

 核心指标

1.  高并发

营销活动对系统性能的要求,一般来说比常规业务高出很多;如果推广的效果比较好,流量可能会远超初始预期。基于此,系统应该能够支持较高的并发,并且在流量快速上升并超过容量规划时,能够及时、方便扩容。

2.  高可用

核心是提供尽可能好的性能支持,让更多人能够使用我们的产品。具体见高性能优化部分内容

3.  隔离性

营销活动不能影响常规业务;因为营销活动变动频繁,修改时应尽可能的避免影响到其他业务;前一次活动应该能够沉淀出一些内容,降低下一次类似的活动的实现成本。

4.  低耦合

根据上面的需求我们可以看到,营销活动旺旺与主业务有交集。营销活动的特点是变化频繁,定制化需求多,应尽量降低营销活动与常规业务的耦合性。

可以考虑通过旁支流程来解决此问题。例如,用户在app上操作以后奖励抽奖机会这个业务,将用户的行为作为事件,通过MQ消息向外广播,营销活动监听相关的MQ消息,根据MQ消息给用户奖励抽奖机会。

5.  防刷

在营销活动利益的驱动下,常常会有人找系统漏洞,钻系统空子,通过一些手段来刷系统奖品,影响营销效果。一般而言,有以下常规问题需要防范:

防恶意注册用户

防恶意调用接口

防奖品被少部分人获取

防用户误操作

 架构

高并发的核心思路是逐级分流,逐步分散流量。

高可用的核心思路是通过备份、限流、降级、熔断等手段提升可用性。

1.  整体思路

充分分流,通过缓存、队列、消息等手段将大流量逐步分散。

以空间换时间,通过缓存来提升每个请求的处理速度,提升系统并发量。

异步处理,分析并识别出可以异步处理的逻辑,将他们异步化。

分层逐级拦截非法请求,仅让有效的请求到达底层系统;尽可能让每一次写操作都能成功。

根据每个系统的服务能力,设定流量极限,流量超过极限值后进行限流。

 

2.  分阶段优化模型

为了达到最高的并发性能,需要对整个环节的各个环节进行优化。现实中往往通过如下的倒三角形模型来逐层优化。

8ad242c113e31024c2c04befc82853c6ab9e20eb

注意:这里不过多讲述概念性的内容,而是根据抽奖的需求讲述一些常规的方案;更多内容见博客《高并发技术》

客户端优化方案有:客户端(app、浏览器)缓存。

网络优化方案有:动静分离、静态化

服务端优化包括:缓存(硬盘、堆、分布式)、通信模型优化、异步化技术、线程池、DB存储优化。

响应优化包括:返回结果压缩。

3.  

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个用于构建Java应用程序的开源框架,它提供了很多便利的功能和特性,可以帮助我们实现并发的抽奖逻辑。 首先,我们可以使用Spring Boot的注解和组件来管理并发访问。通过使用@Async注解和ThreadPoolTaskExecutor,我们可以实现异步处理请求,降低响应时间并提并发能力。我们可以将抽奖逻辑封装在一个异步方法中,当有用户发起抽奖请求时,我们就会启动一个新的线程来处理该请求,这样可以确保系统能够同时处理多个请求,提抽奖的并发性能。 其次,我们可以使用缓存来优化抽奖逻辑。在并发场景下,数据库的读写压力很大,可能会导致系统性能下降。为了避免这种情况,我们可以使用Spring Boot集成的缓存框架,如Redis或Ehcache,将抽奖的相关数据缓存在内存中。这样可以减少对数据库的访问次数,加快响应速度,提并发能力。 另外,为了确保并发的抽奖逻辑的正确性,我们可以使用分布式锁来保护关键代码块。当多个用户同时发起抽奖请求时,我们需要确保每次只有一个用户能够成功执行抽奖操作,避免出现数据不一致的问题。我们可以使用Spring Boot提供的分布式锁框架,如Redisson或ZooKeeper,来实现此功能。 最后,为了实现并发的抽奖逻辑,我们还需要对系统进行压力测试和优化。通过使用一些性能测试工具,如JMeter,我们可以模拟大量的并发用户,测试系统的性能和稳定性。通过查看系统的性能指标,如吞吐量、响应时间和并发数,我们可以找到系统的瓶颈,并进行相应的优化,如增加服务器资源、调整数据库参数等,以提抽奖逻辑的并发能力。 总之,通过使用Spring Boot的异步处理、缓存、分布式锁和性能优化等功能和特性,我们可以很好地实现并发的抽奖逻辑,提系统的并发能力和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值