鲁斌 42450745 网站建设你需要网站建设

news/2025/9/22 23:31:14/文章来源:
鲁斌 42450745 网站建设,你需要网站建设,长安网站建设哪家好,织梦wap手机网站模板文章目录 场景分析方法的幂等分布式锁Redis实现分布式锁抢锁的设计思路 分布式锁案例 直击面试rocketmq什么时候重复消费消息丢失的问题消息在哪里丢失发送端确保发送成功并且配合失败的业务处理消费端确保消息不丢失rocketmq 主从同步刷盘 场景分析 分布式系统架构中,队列是分… 文章目录 场景分析方法的幂等分布式锁Redis实现分布式锁抢锁的设计思路 分布式锁案例 直击面试rocketmq什么时候重复消费消息丢失的问题消息在哪里丢失发送端确保发送成功并且配合失败的业务处理消费端确保消息不丢失rocketmq 主从同步刷盘 场景分析 分布式系统架构中,队列是分布式的,生产端是分布式集群,消费端也是分布式集群. 相当于有多个消费端同时监听队列,同时减库存,写入订单. 面试题:如何处理消息重复消费的问题. 重复消费大部分场景,需要解决的. 引入2个概念来解决: 幂等的业务方法,和消息的分布式锁. 方法的幂等 结论: 一个方法的一次业务逻辑调用和N次调用的结果是一致的,我们称这种方法就是幂等. 一旦重复消费,一定要把消费的业务逻辑方法(orderAdd)设计成幂等的. 幂等的方法 GET方法: 查询方法,天生幂等.DELETE方法: 删除方法,天生幂等.PUT方法: 修改,并不是天生幂等,需要设计 减少库存: update stock_tbl set stockstock-#{stock} where id#{id}(不是幂等)select * from stock_log where order_id#{orderId}(查询日志,判断是否已经见过库存了),没有数据 update stock_tbl set stockstock-#{stock} where id#{id},insert into stock_log (字段) values (订单id,商品减库存信息) (这样设计就幂等了,依然有问题) POST方法: 新增,并不是天生幂等,需要设计 新增订单: insert into order_tbl (order_id,order_item_id,count,user_id) values (各种属性);如果使用唯一属性校验,作用在order_id order_sn(编号).同一张订单,这个字段值是相同(幂等满足,没做幂等不满足) 当前orderAdd方法设计幂等的解决思路(之一) 使用订单id或者订单编号,**userId商品id(**这个只满足当前我们的案例特点,不满足实际场景.)查询订单,如果已经存在了,库存不减少,订单不增了,购物车不用删除了 Override public void orderAdd(OrderAddDTO orderAddDTO) {//幂等设计思路: 利用userId和commodityCode 查询,如果已经存在了订单,方法直接执行结束//如果结果不存在,减库存,生单,删除购物车int countorderMapper.selectExists(orderAddDTO);if (count0){log.debug(订单已经新增了);return;}StockReduceCountDTO countDTOnew StockReduceCountDTO();countDTO.setCommodityCode(orderAddDTO.getCommodityCode());countDTO.setReduceCount(orderAddDTO.getCount());// 利用Dubbo调用stock模块减少库存的业务逻辑层方法实现功能stockService.reduceCommodityCount(countDTO);// 2.从购物车中删除用户选中的商品(调用Cart模块删除购物车中商品的方法)// 利用dubbo调用cart模块删除购物车中商品的方法实现功能Order ordernew Order();BeanUtils.copyProperties(orderAddDTO,order);// 下面执行新增 假设insert是幂等的.orderMapper.insertOrder(order);log.info(新增订单信息为:{},order);cartService.cartDelete(orderAddDTO); }Select(select count(id) from order_tbl where user_id#{userId} and commodity_code#{commodityCode}) int selectExists(OrderAddDTO orderAddDTO);分布式锁 当前分布式消费架构 即使,将方法设计成幂等,这个架构中,消息重复消费 ,满足线程安全问题的所有因素 并发/多线程写操作共享数据 只要解决其中一点,线程安全问题就消失了. 并发多线程–串行 写操作– 避免写(不能满足当前案例,必须写) 共享数据–个体数据(不能满足,重复消费,重复订单是前提) 分布式线程安全问题的解决方案—分布式锁 错误思路: 引入synchronized同步锁,不能解决分布式场景下,多个进程的并发线程安全问题. 概念: 分布式场景下,多进程,多线程并发的抢锁机制. 抢到资源锁,执行业务逻辑,抢不到等待或者放弃执行.能够避免对同一个资源出现并发多线程操作的解决方案. 和synchronized的区别在于 synchronizeds本地锁.管理一个进程中的多线程,分布式锁是管理多个进程中的多线程. 分布式锁当前落地方案: redis setnx命令 Redis实现分布式锁 抢锁的设计思路 目标: 多线程执行业务之前,先判断执行权限,抢锁,抢到锁的才能执行业务,抢不到的不执行.(当前案例中,抢锁,然后执行的业务逻辑是:orderAdd) 抢锁如何执行?: setnx key “” key值如何设计?: 需要结合业务,设计key值(redis中最主要的功能,都关系到key值的设计),抢锁的逻辑中,满足是业务数据,满足重复消费的重复数据.就可以实现这个key值的设计. 消息Id是重复的. 当前业务流程设计缺陷: 如果有一个消费者抢到锁了,执行了业务方法.执行完成后,没有释放锁的机制.如果引入等待重抢的机制,由于抢到锁的没有释放,会导致死锁. 释放锁的逻辑引入 上述整改的流程中避免了死锁问题,但是存在删除失败导致死锁的问题. 所以,要保证del释放没有成功,在redis也一定不会长期保存. 兜底的解决死锁问题.基本不会出现死锁了. 为了解决误删除的问题,抢锁的时候setnx key value值设计成一个随机数. 随机数两个消费,多个消费者生成相同的可能性极低. 分布式锁案例 Component RocketMQMessageListener(topic business-order-topic,consumerGroup ${rocketmq.consumer.group},selectorExpression orderAdd) Slf4j public class OrderAddConsumerListener implements RocketMQListenerMessageExt {Autowiredprivate IOrderService orderService;Autowiredprivate StringRedisTemplate redisTemplate;Overridepublic void onMessage(MessageExt msg) {//拿到底层消息对象的bodybyte[] body msg.getBody();//尝试先解析成stringString orderJsonnew String(body, StandardCharsets.UTF_8);System.out.println(orderJson);OrderAddDTO orderAddDTOJSON.toJavaObject(JSON.parseObject(orderJson),OrderAddDTO.class);System.out.println(orderAddDTO);//1.生成锁的key值,生成当前这把锁的随机数//准备锁keyString msgKeyLockmsg:order:add:msg.getMsgId();//准备随机数 4 6 8位String randCodenew Random().nextInt(9000)1000;ValueOperationsString, String stringOps redisTemplate.opsForValue();try{//补充消息消费的抢锁机制//2.抢锁 setnx msgKeyLock randCode expire 10sBoolean tryLockSuccess stringOps.setIfAbsent(msgKeyLock, randCode, 10, TimeUnit.SECONDS);//3.判断 抢锁成功还是失败if(!tryLockSuccess){//3.2 失败了 可以等待5秒重新抢锁,也可以直接结束//尝试这里使用while编写等待5秒重新抢的逻辑log.info(有别人抢锁了,msgKey:{},value:{},msgKeyLock,randCode);return;}//3.1 成功了 执行orderAddorderService.orderAdd(orderAddDTO);}catch (CoolSharkServiceException e){//业务异常,说明订单新增业务性失败,比如库存没了log.error(库存减少失败,库存触底了:{},异常信息:{},orderAddDTO,e.getMessage());}finally {//释放锁 读以下锁的value值,等于当前生成value才释放String s stringOps.get(msgKeyLock);if (s!null s.equals(randCode)){//del msgKeyLockredisTemplate.delete(msgKeyLock);}}} }直击面试 rocketmq什么时候重复消费 在broker做扩展的时候,消息队列的消息,做扩展的时候,原本存储在原队列的消息,会进行rebalance重平衡.消费开始阶段 消费者consumer1 所在group1 绑定队列,push消费模式,使得消费者接受到了queue1 queue2的6条消息.消费过程,成功执行,即将返回确认. 总结:消费者并发消费的逻辑,同一组消费者绑定分布式队列,推送批量的消息在某个消费者还没有来得及消费,或者没来得及返回确认给rocketmq,队列发生了扩容缩容rocketmq会对队列中所有的消息做rebalance重平衡(消息重新分配给不同队列),消费者绑定也充平衡导致已经推送的但是未返回确认的消息,被发送给不同消费者多次. 消息丢失的问题 rocketmq kafka rabbitmq activemq都是队列.只要谈到其中一个. 重复消费的问题(方法必须设计成幂等,一旦设计成幂等,可能造成线程安全隐患,所以引入分布式锁)消息丢失如何处理. 面试题:消息丢失如何处理. 消息在哪里丢失 发送没成功,没有解决不成功的业务逻辑rocketmq保存的时候,断电,宕机,丢失消息(运行的时候,消息存储在内存)消费端丢失消息(没有成功处理消息,就直接返回success,并不是所有的消费逻辑都是先消费,再确认的,如果关注的是消费速度,不关注成功或者是否丢失,就可以这样处理) 发送端确保发送成功并且配合失败的业务处理 同步发送,接收发送结果,SEND_OK才结束. 客户端代码底层都有默认重试(retry 3 times).发送重试都失败了. 处理发送失败的逻辑. 发送到备用/失败的队列记录日志,将消息来源,目标和消息内容,详细记录,等待监控系统,维护人员来直接处理 消费端确保消息不丢失 一定是先消息费,在确认,消费失败,返回失败(rocketmq消费点位保持原有位置不变,同一个消费者组,会重新拿到消息) rocketmq 主从同步刷盘 同步刷盘(消息数据可靠性保证): 如果持久化内存消息数据到磁盘失败,发送结果没有成功. 异步刷盘: 只要内存接收到了生产端的消息数据,数据是否持久化到磁盘,都会给生产端发送成功接收信息. 主从的双机热备: broker可以配置主从,考虑数据可靠性,和性能,一般主master做同步刷盘,slave做异步刷盘.(都同步刷盘,100%保证消息只要到达rocketmq就不会丢失,但是性能不能保证.)

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

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

相关文章

郑州手机网站制作公司网站开发校园经历范文

第一章 成为一个很厉害的人(持续输入,反复练习) 为什么要学习及如何学习 1、自毁趋势(熵增),故需要能量输入(负熵流) //引申:水往低处流是趋势,学习是逆趋势。 2、持续输入能量(物质和信息),…

专业简历制作网站模板怎么做网站怎么引入广告挣钱

1.项目说明 背景: 着网络技术的不断发展,人们的消费观念在不断变化,消费手段也变得错综复杂。很多人都在困扰,钱到底花在了那里。 目的: 为了解决很多人的钱花在哪了的困扰,我们组决定制作一个消费账单…

多商家在线客服系统 - 客服用户表设计方案

gofly.v1kf.com vx: llike620 ​ 设计分析与建议 针对多商家在线客服系统的客服用户表设计,我分析了您提供的原始设计并提出以下优化建议: 优化要点​​安全增强​​:密码存储改用更安全的bcrypt算法(增加salt字段…

九月22号

今天在课上完成了测试代码的分解 研究了一下原码,补码和反码。原码符号位 + 真值。最高位(最左边的一位)表示符号,0 代表正数,1 代表负数。其余位表示这个数的绝对值。而正数的反码与其原码相同。负数的反码是:其…

购物网站开发教程中文版网络公司可以做哪些业务

Color Image Histograms and equalization with OpenCV - FreedomVC

唐山哪个公司可以制作网站frontpage可以做网站吗

cmd窗口运行jar程序时,在cmd窗口点击了一下,如果你选中了(页面会有个白色的选中内容),java程序就会暂停,这是只有按一下鼠标右键或着CtrlC才能取消选中,程序才会继续运行,如果java程…

罗田企业网站建设wordpress个人博客实战

在Unity中,使用键盘ADWS键控制物体移动,通过鼠标左键控制物体旋转,鼠标中键控制物体缩放是再常见不过的方法。 方法如下: using System.Collections; using System.Collections.Generic; using UnityEngine;public class MoveCo…

海口商城网站建设投资公司注册需要多少钱

文章目录 YUM 升级 PHP71. 查看当前 PHP 信息2. YUM 安装 PHP73. 查看 PHP 版本4. 启动PHP-FPM YUM 升级 PHP7 参考地址:网站地址 参考地址:网站地址 1. 查看当前 PHP 信息 # 查看 PHP 版本信息 php -v# 查看 yum 源中 PHP 信息 yum list | grep php2. …

hao123网站源码制作2015最新仿网站服务器建设

前言 我们之前阐述的内容都是在文件打开的前提下, 但是事实上不是所有文件都是被打开的, 且大部分文件都不是被打开的(也就是文件当前并不需要被访问), 都在磁盘中进行保存. 那这些没有被(进程)打开的文件, 也是需要被管理的! 对于这部分文件核心工作之一是能够快速定位文件…

烟台做网站建设电话建筑工程网络软件

随着全球贸易的不断发展,我国与印度之间的贸易往来也日益频繁。作为两个人口最多的国家之一,中国和印度之间的货物运输需求不断增长。为了满足这一需求,印度货代专线应运而生,为进出口商提供高效、可靠的货物运输服务。本文将探索…

字体模板素材免费下载网站seo优化系统哪个好

文章目录 Arrow, 一个六边形的 Python 时间库第一部分:背景介绍第二部分:库是什么?第三部分:如何安装这个库?第四部分:库函数使用方法第五部分:场景应用第六部分:常见Bug及解决方案第…

网站设计师待遇怎样在凡科网站做网页

// 执行 // 使用你自己的服务器IP与登录账户 export USER_AT_HOST"服务器账户名服务器IP" // PUBKEYPATH是你公钥的路径 export PUBKEYPATH"$HOME/.ssh/id_rsa.pub"ssh-copy-id -i "$PUBKEYPATH" "$USER_AT_HOST"

江苏做网站怎么收费阿里云怎么购买域名

更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程刷题面经求职讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进…

网站开发需求文档怎么写赣州市开发小程序

来源 | 编程技术宇宙责编 | 晋兆雨头图 | 付费下载于视觉中国背景曾经,我面试的时候有两个最怕的。一怕问算法,二怕问高并发。算法这个,自从刷了不少LeetCode,发现还是有套路可循的,虽不敢说算法能力有多强&#xff0c…

深圳品牌建网站网络网站建设公司排名

上篇博文介绍了如何在LINQPad中输出StreamInsight查询结果。这篇文章将主要介绍StreamInsight基础查询操作中的过滤部分。 测试数据准备 为了方便测试查询,我们首先准备一个静态的测试数据源:var weatherData new[] {new { Timestamp new DateTime(201…

网站seo策划方案案例分析个人手机app免费制作

一、继承(Inheritance) 1. 概述 继承是面向对象编程的一种特性,允许我们定义一个类(称为子类或派生类)以继承另一个类(称为超类或基类)的功能。 2. 语法格式 public class Zi extends Fu {/…

网站开发方法简答题大型旅游网站源码 织梦

中国上海,2021年12月21日——今日,由工业和信息化部国际经济技术合作中心(工信部国合中心)与施耐德电气主办的“绿色智能制造创赢计划”第二季总决赛在上海举办。经过半年多的加速营培训、场景探访与联合方案开发,最终…

python做电商网站南通网站公司网站

“我在使用Excel表格工作时,需要插入一些行来填写数据。但是我不知道应该如何操作,有没有朋友可以支支招呀?” Excel是办公室工作中不可或缺的工具,它强大的数据处理能力使得工作变得高效。因此很多用户在使用电脑时或许都会用到E…

免费发做网站最全的wordpress 中文手册

1、有时候需要用到c的一些特性,封装,类等等。 2、研究一下如何更改之前c工程的内容,实现混合编程。 操作 1、keil设置 2、要重新建立一个main文件,后缀名是cpp,cpp才能调用cpp. 后面如果要用到c特性的,需要…

让自己的网站收录网站推广与维护有什么不同

Word的”交叉引用“和”插入题注“快捷键设置 在MSWord2021中,可以自定义设置快捷键。方法如下:文件-选项-自定义功能区-键盘快捷方式(自定义)。具体过程如图所示。 最后,按照上述流程将插入题注(Insert…