• java高并发实战<2>


    ##>>>  我们解决我们重复下单的问题
    我们可以使用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是怎么感知我们的事物的  或者分布式事务
    
  • 相关阅读:
    ubuntu下jupyter notebook设置远程访问
    【多线程】Thread 类 详解
    redis6.0源码分析:字典扩容与渐进式rehash
    【Kafka】(1)基础知识汇总
    【无标题】在feign post中,如何发送 form-url-encoded 数据
    java基于mvc的高校教师科研信息管理系统
    对3D建模师,你到底了解多少?
    营收再涨,瑞幸翻身把歌唱?
    windows消息机制
    【Java系列】Java 简介
  • 原文地址:https://blog.csdn.net/weixin_43689953/article/details/139216874