java高并发实战<2>

news2024/11/20 12:26:10
##>>>  我们解决我们重复下单的问题
我们可以使用mysql 的唯一索引 ,在我们的数据库层面保证不能重复下单  我可以控制是唯一的
同一个用户 针对于同一个商品只可以买一个  

重复下单 优化
我们
>1.使用数据库唯一索引 一旦是 2个请求   因为mysql 有行级锁你后面的插入的话 其实就会报错
>2. 我们下订单成功后 我就会吧当前用户存入redis中,后面的请求 我就不会访问db

首先 第一 我们的秒杀列表以及秒杀详情 我们从redis缓存中查询了,我们也解决了重复下单的问题
以及超卖的问题 我们此时再基于jmeter查看我们的qps,
 
我们秒杀时候 浏览器--->controller--->servcice--->db
针对于一个秒杀商品比如说有5000的qps,有10个请求到达service(我们通过redis 的incr)
如果秒杀商品多的话,比如说 你一个场次的商品更多  请求会更多
##>
同一个时间太多请求过来了 我们此时要做一个流量 的削峰
我们使用mq 来对我们的请求的异步处理.我们异步下单



在这里插入图片描述

我们可以做集群处理 我们可以海量接受请求 不至于单个被打崩了
我们应用程序发送消息后  消息是异步的  不知道消息的执行结果
##> 
如何通知我们浏览器 的执行结果呢##>>>>>>>>>>
因为我们是bs 架构  是浏览器和服务器  服务器无法主动给浏览器推送消息的
浏览器要想获取服务器的响应信息,必须要发送http请求
##>>>>
我浏览器 它有一个定时器,周期性的执行我们的函数,比如说0.5s执行一次

我们可以采用mq 来实现 针对于一个商品有50个 请求, 有很多秒杀商品同时参与
一个秒杀商品我们放10个请求去操作我们的db, 呢么针对于同一个10点场次的秒杀商品 同时抢购的话
最终就会把我们的db打崩溃了
我们此时就需要做流量的削峰  我们会使用mq对我们的请求进行异步处理
我们可以在服务端做集群,去消费mq的消息
我们也可以在客户端做集群,都往mq 中发消息
我们使用mq来异步处理我们的下单请求,


异步下单之后我们要解决一些问题
1>contreooler---->servie---->dao===>数据库,
我们也仅仅吧我们的消息发送到mq了,但是我们并不知道我们消息的执行结果,

我怎么通知我用户的执行结果呢
因为我们是bs架构,只能浏览器发送数据到服务器。  服务器无法主动给浏览器推送消息的
我们有什么方案 让用户知道我们的下单结果
> 浏览器有定时功能 每隔0.5s 发个请求获取用户的订单结果

我们可以通过定时任务来循环获取这样的结果  但是 存在的问题就是 循环几次
时间多长一些呢

还有就是长连接的场景, 通过websocket 实现 服务器的推送


在这里插入图片描述

我们浏览器和服务器建立一个长连接  当你服务器有消息后会主动进行推送
我们可以使用websocket技术 来实现可以主动推送的效果
浏览器和websocket建了一个长连接

如果采用ajax 轮询的话,前面是你每隔一段时间发送请求 来建立连接 断开连接 来查询发送请求 
这里只是 我建立一次连接就可以了
我们websocket技术来实现推送的功能


1.发起秒杀的请求提示进入队列中的队列中存放phone信息),等待消息
2和websocket服务器建立长连接(把phone作为参数传递到websocket服务器)
3.websocket服务器需要进护客户的映射关系
4.消息给应用胺务器消费,可以获取到. phone和业务执行结果
5.调用websocket接口,根据传过来的phone找到映射关系拿到客户端的长连接引用6.通过这个长连接引用,给有户箦发送消息
4.消息给应用胺务器消费,可以获取到. phone和业务执行结果
5.调用websocket接口,根据传过来的phone找到映射关系拿到客户端的长连接引用6.通过这个长连接引用,给有户箦发送消息
我们异步下单 我们是不知道结果的 我们要吧处理结果告诉浏览器
>1.我们通过定时器 我们可以轮询不断的发送请求 来获取结果 
>2.一种我们使用websocket做长连接 有消息就会主动推送给客户端



websocket 只是一个服务器 可以建立长连接
我们可以实现类似于推送的效果
服务器可以主动发消息给浏览器
1.定时上架的功能
	>zk 只能让一个节点来执行
	>2. 我们使用xxjob 进行分片处理
我们做了缓存预热的设设置
将我们的秒杀列表以及秒杀详情 从redis中查询 提高了qps 并发
2>我们解决了超卖问题 
	我们基于乐观锁 加版本号的问题解决了超卖的问题
	但是大量请求进行update的时候  并不能修改库存,然而数据库的压力还是很大
3. 我们使用redis 的incr ,做缓存的预热扣减 目的减少进入数据库的人数
	if(remainCount<0){
     ## throw
   }
  4. 重复下单问题  我们使用数据库的唯一索引解决重复下单问题,在数据库中建立唯一索引
  	  2. 当秒杀抢购商品成功后 会将用户的user 存入redis中  用redis的set来判断当前用户的iphone 是不是抢购国
 5. 分析异步下单情况  一个商品落入service 有10个,但是同一场次有很多个商品,就会有50*10的请求同时落入到数据库中,  数据库压力会变大
		--使用mq进行异步处理
		同时我们也可以将客户端和服务端做集群 来提高我们系统的处理能力
		我们客户端是不知道你处理成功还是没有成功的
		>q1 使用ajax 轮询来查询
		>q2  我们可以使用websocket建立长连接
		
我们会通过mq 吧消息异步发送给我们的 应用service
我们异步消费的结果不知道怎么相应给我们客户端
我们可以使用webSocket 浏览器和服务器之间的长连接 实现浏览器和长连接的建立连接 实现消息推送

在这里插入图片描述

我们要在websocket服务端建立会话关系,websocket 服务端 有一个map集合  针对于我们的内容进行存储

建立连接之后 我们就可以通过websocket给客户端A 和客户端B 发送这样的消息
在map中寻找映射关系  然后再找到对应的session对象  进行通知到我们客户端

我们会吧消息异步发送给应用服务器,然后我们就会遇到问题,我们应用服务器不知道怎么通知到浏览器
>我们可以采用ajax 负责轮询
>我们可以采用websocket  相当于我浏览器和服务器之间可以建立长连接,我们可以实现浏览器和服务器建立连接之后怎么实现消息推送



我们bs结构服务端是没有办法主动发消息给客户端的,我们可以发请求响应 
或者 建立一个长连接 
我们基于这种方式实现了类似于服务端主动推送
 应对很多websocket连接 如何处理  单台机器很多websocket连接 对服务器的要求就会变大,
 我们可以在websocket 做集群,用ngixn 做转发  我们通过nginx 吧请求进行分发给websocket,基于hash进行分发
 

在这里插入图片描述

我们可以通过ngixn加集群的方式 来增加我们的能力, 应用程序端通过mq进行通知
找到就可以通知 找不到就不用通知了

Q2 我们客户端和服务器建立连接之后  如果没有主动关闭我们的窗口(连接一直存在)
我们建立好通道后  不发消息  连接会一直存在
我们可以采用客户端心跳的方式,发送心跳机制,来判断你客户端是否还存活
我要有心跳机制来检测你那些机器下线了,下线了就给他剔除了,类似于我们注册中心
付费的服务  我们可以采用付费的平台  goEasy

我们把应用改成了异步下单的这种方式, 我们要把下单改成异步mq下单,封装mq消息进行分发

我们改成了异步下单,我们之前相当于5000个请求打到服务端来,我们的目的是为了减少请求直接打到我们的
service,使用mq进行缓冲请求,
如果消费速度很慢的话我们可以设置集群

/
我们可以将秒杀成功或者秒杀失败的消息放入到mq  打个标签
10个库存 我多点了1个 只卖了9个  
这就是我们成功或者失败我们都要发送消息的

在这里插入图片描述

p120

在这里插入图片描述

springboot整合websocket,当我们建立连接之后把映射关系维护,map是县城不安全的
我们都操作同一个map的话,会出现线程不安全的问题,所以我们会用conneHashMap

在这里插入图片描述

我们通过事件的方式帮我们响应
我们找到我们的token来继续session发送消息

在这里插入图片描述

我们通过token就可以找到会话对象,然后把消息发送过去
我们可以通过websocket实现服务器向浏览器的主动推送
我们bs结构服务端是没有办法主动发消息给客户端的,我们可以发请求响应 
或者 建立一个长连接 
我们基于这种方式实现了类似于服务端主动推送
q1 应对很多websocket连接,我们该如何处理,单台机器很多websocket连接,对服务器的性能要求就很高

我们可以在websocket做集群,用nginx做转发,  我们通过nginx把请求进行分发给websocket,基于hash进行分发

在这里插入图片描述

我们可以通过ngixn加集群的方式 来增加我们的能力, 
应用程序端通过mq进行通知找到就可以通知 找不到就不用通知了


我们客户端和服务器建立连接之后  如果没有主动关闭我们的窗口(连接一直存在)
我们建立好通道后  不发消息  连接会一直存在

1>我们定时给客户端发送心跳包 心跳机制  我服务端怎么知道客户端是否还健康
我们可以采用心跳机制来判断 客户端是否还存在

我要有心跳机制来检测那些机器下线了  下线就可以剔除掉
类似于我们的注册中心
付费的服务  我们可以采用付费的平台  goEasy
 这样我们的流程就改成了异步下单的流程了,我们之前是相当于5000个服务同时打过来
 我们的目的是为了减少请求,直接打到service和直接打到数据库中
 我们使用Mq作为流量的缓冲, 对于消费过慢的的话我们可以采用集群的方式
 我们可以将秒杀成功或者秒杀失败的消息放入到mq  打个标签

在这里插入图片描述

同时我们需要监听失败还有超时取消的mq  因为我们失败之后我们需要将redis缓存进行加1 处理

我最终把消息推送给前端  异步下单后我们怎么排查我们的错误

预库存回补  我要做库存回补    因为我此时要做预库存回补


当我们成功后 我们会发延迟消息  当我们成功后如果没有支付我们会
## 支付超时的订单
过了10分钟还没有支付,我们要取消我们的订单 做库存回补
orderInfo.canalOrder() 根据订单编号判断是否有没有超时 
超时我们就取消订单




###############>>>>>>>>>>>>>>>>>
我们秒杀的逻辑   异步下单  我们是否要进行压测  我们加入mq 的目的是为了缓解并发的压力
异步下单的逻辑  比如说我们使用mq  redis  延时队列 tag 的过滤监听  websocket 的通知
>>>>>>>>.订单下单完毕后 我们要进行支付
我们可以依靠与支付宝的SDK 来做支付  依托于支付宝的沙箱环境

1.Q1 网站支付的流程 2.内网穿透
2,事务 spring是怎么感知我们的事物的  或者分布式事务

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

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

相关文章

Turnitin揭露AI写作痕迹,是否会影响论述是重复率?

Turnitin&#xff08;www.checktoo.com&#xff09;为学术界提供了便捷的服务&#xff0c;以确保论文的原创性和学术诚信。然而&#xff0c;许多学生和研究人员在使用Turnitin时&#xff0c;常常会想Turnitin查论文AI率和重复率之间的关系。那么&#xff0c;使用Turnitin查重论…

CCF-GESP 等级考试 2023年9月认证C++四级真题解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 第 1 题 ⼈们所使⽤的⼿机上安装的App通常指的是&#xff08; &#xff09;。 A. ⼀款操作系统B. ⼀款应⽤软件C. ⼀种通话设备D. 以上都不对 正确答案&#xff1a;B. ⼀款应⽤软件 解析&#xff1a;App是"…

【Python实战】使用postman测试flask api接口

cookie_demo.py # -*- coding: utf-8 -*- """ Time : 2024/5/28 17:14 Author : 娜年花开 File : cookie_demo.py Desc : 需求&#xff1a;用户需要先登陆&#xff0c;登陆之后&#xff0c;通过Cookie来判断是不是能够访问登录后的接口userinfo &quo…

机器学习扩展包MLXtend绘制分类模型决策边界

公众号&#xff1a;尤而小屋编辑&#xff1a;Peter作者&#xff1a;Peter 大家好&#xff0c;我是Peter~ 继续更新机器学习扩展包MLxtend的文章。本文介绍如何使用MLxtend来绘制与分类模型相关的决策边界decision_regions。 导入库 导入相关用于数据处理和建模的库&#xff…

OpenCV-最小外接圆cv::minEnclosingCircle

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 函数原型 void minEnclosingCircle(InputArray points, Point2f& center, float& radius); 参数说明 InputArray类型的…

22 - 游戏玩法分析 IV(高频 SQL 50 题基础版)

22 - 游戏玩法分析 IV 考点&#xff1a; 聚合函数 # 日期相加 date_add(min(event_date),INTERVAL 1 DAY) select round(count(distinct player_id)/(select count(distinct player_id) from Activity),2) fraction fromActivity where-- 如果日期加一天的数据能在表中…

探索800G数据中心的高速布线解决方案

随着技术的快速进步&#xff0c;数据中心正以前所未有的速度迅速发展。虽然100G和400G数据中心已经普及&#xff0c;但800G数据中心正逐渐流行并展现出增长趋势。由于对高速数据传输的需求呈指数级增长&#xff0c;因此需要高效、可靠的线缆连接解决方案。本文将介绍800G数据中…

Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库

Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库 目录 Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库 一、简单介绍 二、scikit-learn 基础 1、安装 scikit-learn 2、导入 scikit-learn 3、数据准备 4、数据分割 5、训练模…

党史馆3d网上展馆

在数字化浪潮的推动下&#xff0c;华锐视点运用实时互动三维引擎技术&#xff0c;为用户带来前所未有的场景搭建体验。那就是领先于同行业的线上三维云展编辑平台搭建编辑器&#xff0c;具有零基础、低门槛、低成本等特点&#xff0c;让您轻松在数字化世界中搭建真实世界的仿真…

MineAdmin 前端打包后,访问速度慢原因及优化

前言&#xff1a;打包mineadmin-vue前端后&#xff0c;访问速度很慢&#xff0c;打开控制台&#xff0c;发现有一个index-xxx.js文件达7M&#xff0c;加载时间太长&#xff1b; 优化&#xff1a; 一&#xff1a;使用文件压缩&#xff08;gzip压缩&#xff09; 1、安装compre…

【乐吾乐3D可视化组态编辑器】数据接入

数据接入 本文为您介绍3D数据接入功能&#xff0c;数据接入功能分为三个步骤&#xff1a;数据订阅、数据集管理、数据绑定 编辑器地址&#xff1a;3D可视化组态 - 乐吾乐Le5le 数据订阅 乐吾乐3D组态数据管理功能由次顶部工具栏中按钮数据管理打开。 在新弹窗中选择数据订阅…

【C/C++】IO流

目录 前言&#xff1a; 一&#xff0c;C语言的I/O流 二&#xff0c;C的I/O流 2-1&#xff0c;C标准IO流 2-2&#xff0c;IO流的连续输入 前言&#xff1a; “流”即是流动的意思&#xff0c;是物质从一处向另一处流动的过程&#xff0c;是对一种有序连续且具有方向性的数据…

【计算机网络】初识IP协议

前言 IP协议&#xff0c;可谓是程序猿必备的基础功之一&#xff0c;这不仅仅是因为IP协议为面试的常客&#xff0c;更是因为IP协议为整个网络协议中最重要、最常被人接触的一种协议。例如IP地址就几乎为所有人所熟知的一种概念&#xff0c;无论是浏览网页、聊天、打游戏&#x…

网络编程: 高级IO与多路转接select,poll,epoll的使用与介绍

网络编程: 高级IO与多路转接select,poll,epoll的使用与介绍 前言一.五种IO模型1.IO的本质2.五种IO模型1.五种IO模型2.同步IO与异步IO3.IO效率 二.非阻塞IO1.系统调用介绍2.验证代码 三.select多路转接1.系统调用接口2.写代码 : 基于select的TCP服务器1.封装的Socket接口2.开始写…

HarmonyOS NEXT星河版之自定义List下拉刷新与加载更多

文章目录 一、加载更多二、下拉刷新三、小结 一、加载更多 借助List的onReachEnd方法&#xff0c;实现加载更多功能&#xff0c;效果如下&#xff1a; Component export struct HPList {// 数据源Prop dataSource: object[] []// 加载更多是否ingState isLoadingMore: bool…

WebGIS常用技术体系记录

1、数据下载 &#xff08;1&#xff09;OSM下载开源矢量数据&#xff0c;数据较全&#xff0c;但是质量一般&#xff1b; &#xff08;2&#xff09;地理空间数据云下载DEM影像&#xff1b; &#xff08;3&#xff09;datav下载行政区 http://datav.aliyun.com/tools/atlas/…

了解Maven,并配置国内源

目录 1.了解Maven 1.1什么是Maven 1.2快速创建一个Maven项⽬ 1.3Maven 核⼼功能 1.3.1项⽬构建 1.3.2依赖管理 1.4Maven Help插件 2.Maven 仓库 2.1中央仓库 2.2本地仓库 3.Maven 设置国内源 1.查看配置⽂件的地址 2.配置国内源 3.设置新项⽬的setting 1.了解Ma…

【iOS】Runtime

文章目录 前言一、Runtime简介二、NSObject库起源isaisa_t结构体cache_t的具体实现class_data_bits_t的具体实现 三、[self class] 与 [super class]四、消息发送与转发五、Runtime应用场景 前言 之前分part学习了Runtime的内容&#xff0c;但是没有系统的总结&#xff0c;这篇…

自然语言处理(NLP)—— 主题建模

1. 主题建模的概念 主题建模&#xff08;Topic Modeling&#xff09;是一种用于发现文档集合&#xff08;语料库&#xff09;中的主题&#xff08;或称为主题、议题、概念&#xff09;的统计模型。在自然语言处理和文本挖掘领域&#xff0c;主题建模是理解和提取大量文本数据隐…

vue-$set修改深层对象的值

背景&#xff1a; 点击编辑按钮&#xff0c;打开修改预算的抽屉&#xff0c;保存后更新此行数据的预算&#xff0c;以前是调接口刷新表格&#xff0c;这次的数据是由前端处理更新&#xff0c;由于数据层级比较深&#xff0c;使用$set来修改两层嵌套对象 使用方法&#xff1a; …