微信红包架构

文章目录

  • 包发抢拆
    • 抢红包——拆包算法——要解决并发问题
    • 那怎么做呢?——预分配红包
    • 预分配怎么实现呢?
    • redis集群解决日均百亿级
    • 但微信没有用预分配方案哦——内存消耗过大——cas
    • 查询红包领取记录会很频繁的查询,从redis中查询hash,这个操作会导致redis压力增大——多级缓存
    • 异地多活架构
    • 柔性降级方案
    • 海量数据存储架构

包发抢拆

在这里插入图片描述
二倍均值法拆包在这里插入图片描述

抢红包——拆包算法——要解决并发问题

加锁能解决问题,但肯定影响性能。

那怎么做呢?——预分配红包

支付完成后,在后台算好,暂存起来,有人抢的时候,直接拿就好了。

预分配怎么实现呢?

在这里插入图片描述
发红包的时候,把金额算好,把金额存进redis的list链表中,每次抢的时候,从list中拿,同时用hash结构来存一下谁抢了多少钱,就可以查询红包领取列表了。
但是,这样的方案支撑不了日均百亿级

redis集群解决日均百亿级

在这里插入图片描述
一个redis也就最多几万级并发。同时集群的运维也是问题(比如,某一个节点挂了怎么办?)

但微信没有用预分配方案哦——内存消耗过大——cas

redis用的是内存呀,对于微信来说,存储的东西太多了。
微信用的实时拆包——那怎么解决并发问题呢?
cas
在这里插入图片描述
第一次发红包的时候记录版本号,
CAS容易失败,会不会把cpu干烧?——我们可以在cas失败的时候休眠一下。
cas是在内存计算的,效率很高。
但redis不能原生支持cas操作,微信自研了ckV缓存框架,可以大致理解为支持cas的redis,不开源。

我们要实现的尽量要无锁、原子化,实时拆包。
我们可以采用类似的做法——lua脚本实现cas

在这里插入图片描述
在这里插入图片描述
Java脚本会有并发问题,改为lua脚本就没有并发问题了。
因为lua脚本执行的时候具有原子性,假如多个线程执行这段lua脚本,没关系,这三段lua脚本在redis中是单线程执行的。(redis直接在服务端执行,只需要一次IO,效率就高了)。

查询红包领取记录会很频繁的查询,从redis中查询hash,这个操作会导致redis压力增大——多级缓存

在这里插入图片描述
那么对于我们的集群架构,在多态web应用的机器上,更新某一台机器的数据,其他进程的数据就是老数据了,我们的hash数据可能不一致。
我们要同步数据,从产品角度来说,没有必要实时让客户看到最精准的红包领取列表,一直不更新也不行,那怎么做呢?——给ehcache设置一个较短的过期时间,过期了从redis中拿最新的。

异地多活架构

在这里插入图片描述
多机房异地部署肯定可以解决高可用问题,那公平性问题怎么解决?
(在深圳发,肯定深圳抢红包最快),怎么解决呢?
上海抢红包的时候,在上海的接入层,通过专线直接路由到深圳的红包系统,已经在极大的保障公平了,世界上没有绝对公平的事情。

柔性降级方案

我们最终可以使用mq将数据异步到db中去,那redis出问题了怎么办?这就涉及到柔性降级方案。

海量数据存储架构

redis的数据只放一天,最终的数据肯定还是要存到DB中去,那就又有问题了,一天几百亿的红包,mysql单表几千万就有性能问题了,那怎么设置存储的架构呢?落地到DB的存储怎么做,以及后面的查询怎么查询?

后面的这些都是广告了没什么硬东西

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

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

相关文章

软考易错题

一.数据库的设计过程,按照规范的设计方法,一般分为以下六个阶段: ①需求分析:分析用户的需求,包括数据、功能和性能需求; ②概念结构设计:主要采用E-R模型进行设计,包括画E- R图; ③逻辑结构设计:通过将E-R图转换成表&#xff…

android11 加入GMS后修改launcher图标顺序

使用的launcher \vendor\partner_gms\apps\SearchLauncher 使用的布局 vendor\partner_gms\apps\GmsSampleIntegration vendor\partner_gms\apps\GmsSampleIntegration\res_dhs_full\xml <folder title"string/google_folder_title" container"-101"…

DOS比较运算符及常用操作

目录 rem 比较运算符:事例批处理 数值计算与大小比较注释比较大小if语句while循环输出到屏幕输出到文本读取文本到剪切板删除文件暂停关闭回显 rem 比较运算符: EQU - 等于 NEQ - 不等于 LSS - 小于 LEQ - 小于或等于 GTR - 大于 GEQ - 大于或等于 例如 if not %in%2 goto 2 如…

Spring 之 MatchingStrategy

在Spring框架的上下文中&#xff0c;MatchingStrategy 特别指代处理URL路径匹配的方法策略。这是Spring MVC中一个关键的概念&#xff0c;用于决定HTTP请求的URL路径应当如何与控制器&#xff08;Controller&#xff09;中的请求映射&#xff08;RequestMapping&#xff09;进行…

Google Cloud 的 AI 超计算机架构的新增功能

跳转到内容 云 博客 解决方案与技术 生态系统 开发者与从业者 借助 Google Cloud 进行转型 联系销售人员 免费开始使用 计算 文章来自于谷歌云 Google Cloud 的 AI 超计算机架构的新增功能 2024 年 4 月 10 日 https://storage.googleapis.com/gweb-cloudblog-publish/images/…

字符串的格式化输出、索引和切片以及7个常用的函数的使用

1.字符串的格式化输出: f-string 是一种方便的字符串格式化方式&#xff0c;可以直接在字符串中嵌入变量。2. name "Alice" age 30 print(f"My name is {name} and I am {age} years old.") 2.索引和切片: 索引和切片是用来访问字符串中的特定字符或…

Blob对象实现文件下载

首先&#xff0c;要有下载按钮 <a download onClick{()> downloadAttentment(data)}>下载</a>其次&#xff0c;定义下载function // 此处去处理 blob 对象 const downloadStreamByATag (data, suffix, name) > {if (suffix void 0) { suffix xls; }if (…

Python数据结构与算法(1):将序列分解为单独的变量

问题 现在有一个包含 N 个元素的元组或者是序列&#xff0c;怎样将它里面的值解压后同时赋值给 N 个变量&#xff1f; 解决方案 任何的序列&#xff08;或者是可迭代对象&#xff09;可以通过一个简单的赋值操作来分解为单独的变量。 唯一的要求就是变量的总数和结构必须与序…

JAVASE 数组相关知识

递归 A方法调用B方法&#xff0c;我们很容易理解 递归就是:A方法调用A方法&#xff0c;即自己调用自己 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解&#xff0c;递归策略只需少量的程序就可…

一个人可能代表一群人

最近有个小伙伴问他是做货代的&#xff0c;怎么能找到自己的客户&#xff1f;刚看到这个问题的时候&#xff0c;觉得这个不属于自己的范围&#xff0c;因为自己不是做货代的&#xff0c;怎么知道他们怎么工作&#xff0c;怎么去搜索客户呢&#xff1f; 但是仔细想来&#xff0…

【Java EE】日志框架(SLF4J)与门面模式

文章目录 &#x1f340;SLF4j&#x1f333;门面模式(外观模式)&#x1f338;门面模式的定义&#x1f338;门面模式的模拟实现&#x1f338;门面模式的优点 &#x1f332;关于SLF4J框架&#x1f338;引入日志门面 ⭕总结 &#x1f340;SLF4j SLF4J不同于其他⽇志框架,它不是⼀个…

跟TED演讲学英文:AI isn‘t as smart as you think -- but it could be by Jeff Dean

AI isn’t as smart as you think – but it could be Link: https://www.ted.com/talks/jeff_dean_ai_isn_t_as_smart_as_you_think_but_it_could_be Speaker: Jeff Dean Jeffrey Adgate “Jeff” Dean (born July 23, 1968) is an American computer scientist and software…

【服务器部署篇】Linux下快速安装Jenkins

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

微前端micro-app 子应用 调用父应用方法

参考&#xff1a;micro-app官方文档 场景描述 父应用存储一套vuex数据&#xff0c;其中包含登录信息token等&#xff0c;登录信息透传给子应用使用。 当子应用中的接口返回“登录失效”时&#xff0c;需要清空父应用vuex中的登录相关信息&#xff0c;并且跳转到登录页面。 原…

网站建设企业网站优化

近年来&#xff0c;随着互联网的迅速发展&#xff0c;企业网站已经成为了企业展示自我形象与实力的重要载体之一。然而&#xff0c;单单拥有一个美观、简洁的企业网站并不能让企业在竞争激烈的市场中脱颖而出。因此&#xff0c;在建设企业网站的过程中&#xff0c;我们需要将企…

【前端】对象的常用处理函数(深浅拷贝)

前言 浅拷贝会创建一个新对象&#xff0c;但只复制了原始对象的第一层属性&#xff0c;而不是递归地复制整个对象的所有嵌套属性。因此&#xff0c;新对象中的嵌套对象仍然是原始对象中嵌套对象的引用。这意味着修改新对象中的嵌套对象会影响原始对象中的相应嵌套对象 深拷贝…

C++常用的输入输出方法(ACM模式)

文章目录 前言一、输入输出方法1、cin2、getline()3、getchar() 二、算法案例1、一维数组1.1 输入固定长度1.2长度不固定 2、固定二维数组3、以非空格隔开的元素输入3、常见数据结构定义以及输入3.1 链表 前言 C中的输入输出函数有很多&#xff0c;我们本章只针对大部分算法题…

上位机图像处理和嵌入式模块部署(树莓派4b开机界面程序自启动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们学习了如何在树莓派4b上面开发qt&#xff0c;也学习了如何用/etc/rc.local启动控制台程序&#xff0c;那今天我们继续学习一下如何利用树莓…

docker compose安装redis

一、安装准备 在docker hub查看redis镜像版本。查看地址如下&#xff1a; Dockerhttps://hub-stage.docker.com/_/redis/tags 二、拉取docker镜像 我这里用redis:6.2.14版本&#xff0c;先拉取镜像。命令如下&#xff1a; docker pull redis:6.2.14 查看刚刚下载的镜像&am…

链表的从尾到头打印(递归)

目录 链表的从尾到头打印&#xff08;递归&#xff09; 链表的从尾到头打印&#xff08;递归&#xff09; 递归打印链表 #include <bits/stdc.h> using namespace std;void coutls(list<int>::iterator iter, list<int>::iterator node_end){if (iter!node…