3 抢红包系统

我们还是按照我们分析问题的方法论开展

一 场景分析
我们分析的是集体活动的抢红包,比如春晚,大型活动红包,需要在网页操作的抢红包

抢红包的问题也是多个人抢资源的问题,可以和秒杀进行比对。但是也有很多不同的地方。

  1. 用户打开抢红包界面,注意是1亿人在短时间内打开
  2. 比如春晚的时候为了节目效果,会不定时的发送红包,这么大的用户量我们肯定要做防刷。那么每次发红包的时候怎么及时通知到客户手机,改变页面的状态
  3. 用户抢红包动作的瞬间爆发
  4. 锁的问题
  5. 不能太浪费服务器资源的问题(毕竟发红包也不是天天发,能省多少服务器尽量少用多少服务器)

二 思考解决方案

  1. 我们上面说的第一点,用户打开抢红包软件的时候。资源加载的问题和我们说的秒杀一样,能在CDN上加速的就放到CDN上。

  2. 对应我们上面说的第二点红包状态分发的问题。我们上面也说了,抢红包是短时间的高并发行为,我们不能为这一个行为花费大量的硬件资源。如果有这个条件,我们把代理做好加机器就可以了。基于这个思想我们在架构上就需要一些优化的想法了。
    我们知道当春晚的主持人在台上说3、2、1 我们发个大红包的时候,工作人员点击发放红包,只是一个状态的改变,我们把红包可抢的状态置为1,同时有多台机器和发红包这个动作的服务器保持连接状态,这些机器的红包状态也置为1.同时用户手机和这些机器保持连接,我们就可以把发红包这个动作快速的给到用户的手机。这个中间状态的机器分为几层要多少机器我们需要根据实际的用户体量计算。相当于一个多叉树的分发机制。如下图所示:
    在这里插入图片描述

  3. 上面的第三点说的是流量瞬间爆发的问题,有人会想到MQ去削峰。但是如果是一台机器几千万的流量同时涌入,服务器也会瞬间崩掉,这个时候我们也要多态机器去处理这些请求。我们需要去考虑需要多少台机器能承载这些流量,在开发完成的时候还需要做压测。计算好这些,我们还要考虑代理服务器能不能承载的问题,代理服务器的多活问题(一般nginx+keepalive),如果是独立的机房部署用LVS(四层代理,通过修改局域网的协议包,实现转发,性能更好)是不是更好的选择,如果公司不差钱,用H5(银行喜欢用这个)是不是也可以,这些就涉及到技术选型的问题了.如果这个不能保障的时候,是不是需要在外面还套一层DNS轮询。基本上加上DNS轮询后面再转发到多态保活的代理服务器,多大的流量都能承载了。
    我们继续讲流量通过DNS和代理服务器之后的业务流程。我们知道1亿人抢几百万个红包必然很多人抢不到,我们在上一个话题中提到的可以通过不加锁的递增方案把已经不可能买到商品的人过滤掉大部分,我们在这里为了节约服务器资源也可以采用这个方案。
    我们继续考虑节约服务器资源的问题,后面进入到的用户也是一个可观的流量,这个时候我们就要考虑削峰的问题了,加上MQ,拉平流量峰值,MQ的消费端去处理相关的业务。这个时候我们又可以节约服务器的资源。
    继续优化我们的设计。 我们知道数学计算是非常消耗CPU的一件事,我们在计算每个人能抢到多少钱的时候就是消耗CPU的一个动作,可以考虑把相关的计算放到CPU性能好的机器去部署,其他的普通机器又能节约很多,为老板省钱也是架构师的一个职责。
    后面的业务就是转账等等一系列的业务流程我们还是要对服务进行水平拆分,但是经过我们前面一系列的骚操作以后,已经把这块业务的并发打下来了,做正常的分库分表相关的设计就可以了。如下图所示:
    在这里插入图片描述

  4. 上面说到的第四点锁的问题。为了红包不被多抢,我们在进入到领红包这个环节已经是用户抢红包的哦动作进入到mq之后的事情了,这个时候我们可以采用分布式锁(因为涉及到钱的问题,我们要保障分布式锁的高可用,比如我们用redis做分布式锁,假如redis挂了的问题),也可以采用CAS锁,这个要安全点毕竟涉及到钱(CAS最大的问题是ABA的问题,如果并发非常大的情况下不建议使用,他会一直ABA卡在那里)。因为我们经过了MQ并发已经被打下来了,用这个安全性会更高点。
    
  5. 上面说到的第五点,我们在前面阐述中已经考虑到了,不再细说。 我们还要注意我们的设计中MQ的高可用,单台MQ如果承载太多的请求信息会造成消息积压的问题,我们需要考虑会有多少消息积压的问题,要不要MQ要做分而治之的方案。

  6. 通过以上的阐述,仔细思考过的朋友们可能意识到,我们在做架构设计的时候需要考虑我们的业务场景,用户行为分析,业务场景中会有哪些操作,每个操作会遇到哪些问题。这个是我们做架构设计的普遍的方法论。如果我们能把这些做好,做技术选型的时候,即时我们对相关的技术没有深入的了解也可以通过查阅资料去了解。但是解决问题的思路是不变的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502738.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库中的并发控制

并发操作带来的数据不一致性 1、并发控制:为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确调度 并发控制的主要技术有:封锁、时间戳、乐观控制法、多版本并发控制等 并发操作带来的数据不一致性: ① 丟失修改:两个事务 T1 和 T2 读入同一数据…

ArcGIS Server 10.2授权文件过期处理

新的一年,arcgis server授权过期了,服务发不不了。查看ecp授权文件,原来的授权日期就到2024.12.31日。好吧,这里直接给出处理方法。 ArcGIS 10.2安装时,有的破解文件中会有含一个这样的注册程序,没有的话&…

学英语学压测:02jmeter组件-测试计划和线程组ramp-up参数的作用

📢📢📢:先看关键单词,再看英文,最后看中文总结,再回头看一遍英文原文,效果更佳!! 关键词 Functional Testing功能测试[ˈfʌŋkʃənəl ˈtɛstɪŋ]Sample样…

MCGS学习记录

软件包 用户窗口 主窗口 元件:工具箱->输入框上面 数据对象 在工作台的实时数据库可以新增数据对象 理解为中间变量,控件改变其值,控件监测其值做出变化 基本属性 设定变量名和初始值 指针化? 变化时自动保存初始值&#x…

【网络协议】IPv4 地址分配 - 第一部分

文章目录 十进制与二进制网络如何被寻址地址类型网络地址广播地址主机地址 如何确定网络和主机部分的位数?网络中的主机数量与前缀号的关系计算每个前缀的主机数量公式 子网掩码二进制与操作(Binary ANDing)与操作(AND Operation&…

数据挖掘——集成学习

数据挖掘——集成学习 集成学习Bagging:有放回采样随机森林 BoostingStacking 集成学习 集成学习(Ensemble learning)方法通过组合多种学习算法来获得比单独使用任何一种算法更好的预测性能。 动机是为了提高但分类器的性能 Bagging&…

ansible-性能优化

一. 简述: 搞过运维自动化工具的人,肯定会发现很多运维伙伴们经常用saltstack和ansible做比较,单从执行效率上来说,ansible确实比不上saltstack(ansible使用的是ssh,salt使用的是zeromq消息队列[暂没深入了解]),但其实…

NLP CH10 问答系统复习

1. 专家系统 特点 问题聚焦:限定在特定领域。数据结构化:使用结构化的领域知识。数据库支持:后台有一个数据库,保存系统可提供的各种数据。查询机制:用户提问时,系统将问题转换为 SQL 查询语句&#xff0…

vite6+vue3+ts+prettier+eslint9配置前端项目(后台管理系统、移动端H5项目通用配置)

很多小伙伴苦于无法搭建一个规范的前端项目,导致后续开发不规范,今天给大家带来一个基于Vite6TypeScriptVue3ESlint9Prettier的搭建教程。 目录 一、基础配置1、初始化项目2、代码质量风格的统一2.1、配置prettier2.2、配置eslint2.3、配置typescript 3、…

【2025年最新】OpenWrt 更换国内源的指南(图形界面版)

在上一篇文章中我们讲解了如何使用命令行更换国内源,如果你没有终端工具,或者不喜欢命令行,那么图形界面方式将会是更简单有效的方式。 命令行版本:【2025年最新】OpenWrt 更换国内源的指南(命令行)-CSDN博客 为什么选择通过图形…

uni-app:实现普通选择器,时间选择器,日期选择器,多列选择器

效果 选择前效果 1、时间选择器 2、日期选择器 3、普通选择器 4、多列选择器 选择后效果 代码 <template><!-- 时间选择器 --><view class"line"><view classitem1><view classleft>时间</view><view class"right&quo…

NVIDIA DLI课程《NVIDIA NIM入门》——学习笔记

先看老师给的资料&#xff1a; NVIDIA NIM是 NVIDIA AI Enterprise 的一部分&#xff0c;是一套易于使用的预构建容器工具&#xff0c;目的是帮助企业客户在云、数据中心和工作站上安全、可靠地部署高性能的 AI 模型推理。这些预构建的容器支持从开源社区模型到 NVIDIA AI 基础…

深度学习中的步数指的是什么

Lora微调的截图如下: 在深度学习中,步数(steps) 是指模型参数更新的次数。每次参数更新通常对应一个或多个批次的梯度计算和优化器更新。以下是计算总步数的方法以及步数的具体含义: 1. 步数的计算公式 总步数(Total Optimization Steps)可以通过以下公式计算: [ \te…

【可实战】测试用例组成、用例设计方法、用例编写步骤、测试用例粒度、用例评审(包含常见面试题)

一、测试用例组成 &#xff08;一&#xff09;测试用例的组成 用例编号&#xff0c;模块&#xff0c;测试点&#xff08;测试标题&#xff09;&#xff0c;优先级&#xff0c;前提条件&#xff0c;测试步骤&#xff0c;期望结构&#xff0c;实际结果并不是每一项都必须&#…

Redis两种主要的持久化方式是什么?

Redis支持两种主要的持久化方式&#xff0c;它们分别是RDB&#xff08;Redis Database Snapshotting&#xff09;和AOF&#xff08;Append Only File&#xff09;。以下是这两种持久化方式的详细介绍&#xff1a; 一、RDB&#xff08;Redis Database Snapshotting&#xff09; …

【强化学习】演员评论家Actor-Critic算法(万字长文、附代码)

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

《新概念模拟电路》-电流源电路

电流源电路 本系列文章主要学习《新概念模拟电路》中的知识点。在工作过程中&#xff0c;碰到一些问题&#xff0c;于是又翻阅了模电这本书。我翻阅的是ADI出版的&#xff0c;西安交通大学电工中心杨建国老师编写的模电书。 本文主要是基于前文《新概念模拟电路》-三极管的基础…

Linux下编译安装PETSc

本文记录在Linux下编译安装PETSc的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、安装依赖 1.1 安装oneAPI 参见&#xff1a;Get the Intel oneAPI Base Toolkit , Get the Intel oneAPI HPC Toolkit 1.2 安…

初学vue3心得

这几年经济形势不好,国外对程序员的要求一直都是全栈,国内也慢慢要求通才,作为一名后端算法工程师,最近在学vue3,以下是最近学习的一点心得: 所有的npm install命令前面一定要改成cnpm install,提高速度 在main.js中引入了import "element-plus/dist/index.css";这…

【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 4:MHE表示能力

目录 1 MHE的表示能力2 基于Frobenius-范数的低秩逼近3 基于CE的低秩近似 论文&#xff1a;Multi-Head Encoding for Extreme Label Classification 作者&#xff1a;Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位&#xff1a;山东大学 代码&#xff1a;h…