范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

RabbitMq如何实现流量削峰?(一)

  搭建环境:springBoot + maven + RabbitMQ 3.8.14 + Erlang 23.2.7
  注意:安装时rabbitMq和erlang版本号必须 对应,以免引起不必要的bug。
  1、应用场景
  应用解耦:当要调用远程系统时候,当存在订单系统和库存系统时,订单系统下单,库存系统需要收到订单后库存减一,这时候如果系统宕机,会造成订单丢失,吧订单消息发入mq,库存系统再去mq消费,就能解决这一问题。异步消费:传统的模式:用户下单—>邮件发送—>短信提醒,三个步骤全部完成,才能返回用户消费成功,因为后面两个步骤完全没有必须是当前时间完成,可以用户下单成功后,直接发送给mq,返回给用户消费成功,之后邮件发送和短信提醒,可以其他时间段来消费发送给用户。流量削峰:大型双11活动时候,0点有上亿并发,这时候数据库并不能承载那么大的数据冲击,而专门为高并发设计的mq可以承受住海量的请求,发送给mq,存储成功后,再消费。
  2、流量削峰
  本文主要介绍流量削峰实例,先创建两个表get_redpack和send_redpack。
  CREATE TABLE send_redpack( 	 id int not null AUTO_INCREMENT,      user_id varchar(32) not null comment "发红包用户",      money decimal(10,2) not null comment "红包金额",      unit_money decimal(10,2) not null comment "单个红包金额",      total int not null comment "红包个数",      remain int not null comment "红包剩余个数",      send_date datetime not null comment "发红包时间",      primary key(id) ); INSERT INTO send_redpack(user_id,money, unit_money,total,remain,send_date) VALUES("001",10000.00,10.00,1000,1000,now()); 	 CREATE TABLE get_redpack( 	id int not null AUTO_INCREMENT, 	user_id varchar(32) not null comment "抢红包用户", 	send_redpack_id int not null comment "发红包记录id", 	money decimal(10,2) not null comment "抢的红包金额", 	get_date datetime not null comment "抢红包时间", 	primary key(id) );
  本人用的是mac电脑brew安装的rabbitMq,启动rabbitMq用brew services strat rabbitmq,启动之后访问: http://localhost:15672/
  登入的账号密码用guest,登入后可以在admin里面添加一个admin管理员,配置权限,在queues里面创建一个队列redpack,​供项目发用户ID到队列中。
  ​编辑
  ​编辑上面的流程处理完之后,就可以在springboot项目中引入rabbitMq包,配置文件,及其新建上面表的实体类。
                        org.springframework.boot             spring-boot-starter-amqp             # ----- RabbitMq -------- # spring.rabbitmq.virtual-host=/ spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=admin spring.rabbitmq.password=admin
  /**  * 抢红包  *  * @author keying  * @date 2021/6/22  */ @Data public class GetRedpack {     /**      *      */     private Integer id;      /**      * 抢红包用户      */     private String userId;      /**      * 发红包用户      */     private String sendRedpackId;      /**      * 抢的红包金额      */     private BigDecimal money;      /**      * 抢红包时间      */     private Date getDate; }
  /**  * 发红包  * @author keying  * @date 2021/6/22  */ @Data public class SendRedpack {     /**      *      */     private Integer id;      /**      * 发红包用户      */     private String userId;      /**      * 红包金额      */     private BigDecimal money;      /**      * 单个红包金额      */     private BigDecimal unitMoney;      /**      * 红包个数      */     private Integer total;      /**      * 红包剩余个数      */     private Integer remain;      /**      * 发红包时间      */     private Date sendDate;  }
  下面先写provider生产者的代码,进入接口发送红包,发送100个,然后把收红包的用户id发给mq:
  /**  * 生产者  *  * @author keying  * @date 2021/6/22  */ @RestController @Slf4j @RequestMapping("/provider") public class ProviderController {      @Resource     private RabbitMqService rabbitMqService;      @RequestMapping("/send_redpack")     public void sendRedpack(){         for (int i = 0; i < 100; i++) {             rabbitMqService.sendRedpack(i);         }      }  }   @Resource     private RabbitTemplate rabbitTemplate;      @Override     public void sendRedpack(int i) {         rabbitTemplate.convertAndSend("redpack", i);     }
  然后写消费者代码,用@rabbitListener监听queue,队列就是刚刚在mq管路页面创建的redpack,定义的发红包用户为001,为了方便测试,在代码里写死,给消费者的类加一个@Component的注解,交给spring容器管理,消费逻辑大致就是:
  1、先查看红包剩余数,大于0则继续,否则结束。
  2、吧红包剩余数-1.
  3、抢红包信息存入get_redpack表,存储抢红包详情。
  /**  * 消费  *  * @author keying  * @date 2021/6/22  */ @Component @Slf4j public class ConsumerRabbitMq {      @Resource     private RabbitMqMapper rabbitMqMapper;      private static final String sendUserId = "001";     /**      * 需在RabbitMQ中手动创建redpack 队列,否则报错      * @param message      */     @RabbitListener(queues = "redpack")     public void getRedpack(String message){         log.info("接收的消费红包人员: {}", message);         try {             //查询红包剩余个数是否大于0             int remain = rabbitMqMapper.getRemain(sendUserId);             if(remain > 0) {                 //扣减红包个数                 int result = rabbitMqMapper.deleteOne(sendUserId);                 if(result > 0) {                     //3.新增用户抢红包记录                     GetRedpack getRedpack = new GetRedpack();                     getRedpack.setUserId(message);                     getRedpack.setSendRedpackId(sendUserId);                     getRedpack.setGetDate(new Date());                     getRedpack.setMoney(new BigDecimal("10"));                     rabbitMqMapper.insertGetRedpack(getRedpack);                 }              }             //异步通知用户抢红包成功         } catch (Exception e) {             log.error("处理抢单异常:" + e.getMessage());             throw new RuntimeException("处理抢单异常");         }     } }
  附上三个sql…
                 update send_redpack set remain = remain-1 where user_id = #{sendUserId}                    insert into get_redpack (user_id,send_redpack_id,money,get_date)         values (#{userId},#{sendRedpackId},#{money},#{getDate})     
  重点、重点、重点、注意点事项(重要的事要说三遍),踩坑总结:
  1、安装时候,rabbitMq和erlang版本号对应一致。
  2、springboot集成rabbitMq,guest只能登入localoal,远程ip,需要创建admin用户,用admin用户登入。
  最后,看到这里的读者,喜欢的话安排一波(点赞,收藏,关注),原创不易,每周定期分享编程笔记。
  ​

靠科技创新穿越经济周期,联想能不能成?科技巨头正在集体过冬,这是今年新鲜却又不意外的新常态,最直观的感受来自裁员。今年以来,包括微软奈飞Meta推特PaypalSnap等全球知名科技企业裁员冻结招聘辞退高管的信息屡见报16元张的卡,二手标价近20万!厂商曾被王思聪怼近日,腾讯旗下腾竞体育运营的英雄联盟职业联赛(以下简称LPL)因一张张LPL选手卡出圈。从知名选手各大卡社的直播间,到电竞解说游戏玩家们的社交动态,拆卡成为了必聊话题。其中,有人直DRX夺冠后,浅聊一下Deft和Faker在LCK的地位随着DRX战队,以四号种子的身份,苦战五局艰难击败了Faker率领的T1战队之后!英雄联盟S12全球总决赛,就正式宣告结束了。DRX夺冠后,不仅战队解锁了多个成就,连Deft也解锁房地产核弹级利好,相关概念股(104只全整理)股票代码股票简称所属概念000002。SZ万科A融资融券深股通央视财经50转融券标的超级品牌冰雪产业富时罗素概念富时罗素概念股装配式建筑标普道琼斯A股同花顺漂亮100住房租赁物业管波司登,百年品牌,提价再降价出售,是要倒闭的节奏今日,波司登淘宝旗舰店被曝先提价再打折话题引发热议。我们都知道,波司登作为羽绒服界的杠把子,有着好几十年的历史。波司登创始于1976年,专注于羽绒服研发设计制作,每一件羽绒服至少经胜者教育张益铭每秒都在更新的年代要守护好孩子最根本的竞争力有时候不是孩子不优秀,是我们太着急了。在这个更新速度以天计算的年代,家长们似乎总是在焦虑,总是在担心自己的孩子今天少学一点知识,下回考试分数低了一点,未来就会错过好学校输掉好人生。博士妈妈自闭症孩子干预不必千里奔波,这7点更重要VOL2904前段时间,我们发布文章博士妈妈儿子确诊重度自闭症5年后,有人劝我生二胎。文中的博士妈妈任职于一所大学,某系副主任。她的儿子今年6岁,患有重度典型低智商型的自闭症。机构9岁男童因这个动作险遭截指!近期很多孩子都爱做,家长要警惕看到娃手上长倒刺,很多家长的第一反应就是娃缺啥了。去网上一查,会蹦出很多信息,告诉你孩子这是缺少维生素了,要赶紧补,不补就会越来越严重。还有一些相关的新闻,说孩子因为手上长了倒刺差宝宝辅食添加要科学,牢记十不吃原则,不然会影响孩子发育文菁妈记得以前下乡讲课的时候,一个妈妈说给孩子添加辅食的时候,刚好自己平时有打果汁的习惯,妈妈喝果汁的时候,孩子眼睁睁地看着,妈妈就顺手喂了两口给孩子。妈妈榨的果汁里面有苹果,梨,南京鲁某掌撸男童事件,我就想对王家说一句话,莫要赶狗入穷巷上两天发生在江苏南京被同学欺负的孩子爸爸上门掌撸男童事件想必大家或多或少都有些耳闻。其实小朋友之间的打打闹闹本来没什么,但据说鲁某的儿子已经不是第一次被这个同学施暴了。有人爆出了医她露胸怎么了?还不是实力打了网友脸娱评大赏就在前几天,第33届飞天奖颁奖典礼落下帷幕。热依扎凭借电视剧山海情中李水花一角,获得飞天奖优秀女演员。当天跟她一同提名的人包括周迅闫妮孙俪和童瑶,每一个都是实力强劲的对手。
亲兄弟姐妹之间,贫富差距悬殊,作为条件好的那个应该怎么做?我的家有兄弟姐妹8人,7个儿子,1个女儿,女儿是最小的。这样的家庭,在中国的解放初期,即50年代来说,真是英雄的父母了。父亲是务农的,还是早期入党的中国共产党员,帮助当地的游击队,哪些助听器需要做耳模?由于小孩子的耳朵生长发育的问题,一般都是选择佩戴耳背机,做耳模,可随耳朵生长变化更换,又方便又经济。耳模既起到固定的作用又能避免普通耳塞不密封产生的啸叫,特别是大功率耳背机最容易发事业单位编制分为哪几种?哪种事业单位待遇最好?感谢悟空邀请。目前,我国的事业单位编制主要分为以下几种一是参照公务员法管理的事业单位(简称参公单位),这种事业单位承担部分行政职能,招录任用晋升以及工资待遇等各方面都是参照公务员法40岁左右的男人适合佩戴什么样的手表,皮质表带和钢质表带哪个合适一些,价位多少呢?谢邀!这个问题看各人的爱好。记得我在职时,为纪念k8飞机定型投入批生产,我们全体职工每人都发了块专用纪念手表。记得当时钢质表带或皮质表带可由自已挑选。但实践证明不论新老职工还是男女从六安走出来的明星有哪些?六安位于安徽省的西部,又称皋城。从六安走出来的明星有不少,有演员,有歌手,还有童星。下面小编来列举一下从安徽六安走出来的明星有哪些。1姜潮姜潮,1991年出生,安徽省六安市金寨县梅思维导图软件哪个好?推荐两款我最常的思维导图软件,都是国产软件,分别是网页版和安装版。No。1百度脑图软件功能易用指数推荐指数个人觉得这款软件是百度公司少有的优秀产品,以至于不像是百度的风格。在国内,