Java基础之《mq》

2023-11-17

一、你的项目中有哪些地方用到mq
1、使用mq异步发送优惠券
2、使用mq异步发送短信
3、使用mq异步扣库存(秒杀)
总之将执行比较耗时的代码操作,交给mq异步实现接口
4、贷款项目
使用mq异步审核贷款金额
用户提交自己的信息,后台根据用户的信息,计算贷款的金额
他会拿你的信息去很多接口查下:名下有没有公司+5w,名下有没有房产+5w,花呗信用分+5w
最后计算出贷款金额后,发送短信通知

主流mq有rabbitmq、kafka、rocketmq
activemq没必要学了
kafka和rocketmq思想本质比较相似,rabbitmq与他们的整个架构模型区别较大
如果是电商或者抗高并发,建议用kafka或者rocketmq

二、为什么需要使用mq——mq架构的特性
1、异步处理(多线程和mq)
多线程:缺点是消耗cpu资源,适合于小项目
2、mq和队列模型比较相似
请求发送到生产者
生产者发送一个msg到mq的队列
消费者从mq服务端拉取到消息
3、实现解耦
同步执行:落库、发送短信、发送优惠券,是在同一个jvm中执行的
异步mq:发送短信和发送优惠券是在单独的一个jvm,和会员服务落库是完全分开的。如果会员服务宕机了,消费者照样可以发送短信
4、流量削峰(mq可以实现抗高并发)
单个线程执行时间很长,那么高并发情况下,请求都阻塞在队列里。mq可以让单个线程执行的时间大大减少
贷款 app
用户端----提交用户信息:学历、蚂蚁信用分等
-----------------------------------------------
服务端----先将用户数据插入数据库中----10毫秒
单独封装msg消息投递到我们mq异步计算贷款金额
-----------------------------------------------
调用第三方接口
蚂蚁信用分 > 700分 +5w
调用企业信息网接口 名下有公司 +5w
调用学历接口 本科 +5w

三、mq与多线程实现异步的区别
1、多线程方式实现异步可能会消耗到我们的cpu资源,可能会影响到我们业务线程执行,会发生cpu竞争的问题
2、mq方式实现异步是完全解耦,适合于大型互联网项目
3、小的项目可以使用多线程实现异步,大项目建议使用mq实现异步

四、mq如何避免消息堆积的问题
1、产生背景
生产者投递消息的速率与我们消费者消费的速率完全不匹配
2、生产者投递消息的速率 > 消费者消费的速率
导致我们消息会堆积在mq服务器中,没有及时的被消费者消费,所以就会产生消息堆积的问题
3、注意的是:rabbitmq消费者消费我们的消息,如果成功的话,消息会被立即删除
kafka或者rocketmq消息消费如果成功的话,消息是不会立即被删除
4、解决办法
A、提高消费者消费的速率(对我们的消费者实现集群)
    10万条消息,消费者每次只取一条消息消费
B、消费者应该批量式获取消息,减少网络传输的次数
    每次取10条或者100条消息
5、对kafka或rocketmq将消息理解为就是我们的日志,根据offset去获取消息

五、mq如何保证消息不丢失
1、mq服务器端
消息持久化到硬盘(刷盘)
2、生产者
ACK机制(消息确认机制),发送msg消息给mq服务器端,mq服务器端如果能够成功的将消息刷盘到硬盘存放的话,那么它会及时的响应一个应答
确保我们的消息投递到mq服务器端
3、生产者投递消息,mq宕机了如何处理
如果mq服务器端宕机了,producter会把msg消息记录在redis、mysql中,用定时任务重发
4、消费者
必须确认消费成功
rabbitmq中:确认后才会将该消息删除
rocketmq或者kafka中:确认后才会提交offset
5、死信队列属于备胎队列

六、mq如何保证消息顺序一致性问题
产生背景:
mq服务器集群或者mq采用分区架构模型存放消息,每个分区对于一个消费者消费消息
1、大多数项目是不需要保证mq消息顺序一致性的问题,因为它本身是异步的。只有在一些特定的场景可能会需要,比如mysql与redis实现异步同步数据
先投递insert
再投递update
再投递delete
分区1拿到insert
分区2拿到update
分区3拿到delete
消费者1先拿到delete,消费者2拿到update,消费者3拿到insert
2、所有消息需要投递到同一个mq服务器,同一个分区模型中存放,最终被同一个消费者消费,核心原理:设定相同的消息key,根据相同的消息key计算hash存放在同一个分区中
一个topic主题下,区分不同的tag
3、如果保证了消息顺序一致性有可能降低我们消息消费的速率
4、解决办法
指定相同的消息key
核心办法:消息一定要投递到同一个mq,同一个分区模型,最终被同一个消费者消费
根据消息key计算%分区模型

七、mq如何保证消息幂等性问题
1、消费者获取消息,如果消费消息失败,mq服务器则会间隔的形式实现重试策略
2、怎么知道消息消费成功还是消费失败
如果消费失败了,消费者会发送一个通知给mq服务器端,mq服务器端会重试
每个msg都有一个全局唯一id
查询id在数据库是否已经存在
3、重试过程中,需要保证业务幂等性问题,保证业务不能够重复执行
4、我们可以通过全局的消息id,提交查询如果该业务逻辑已经执行过,则不会重复执行
5、我们也需要在数据库的db层面需要保证幂等性问题,唯一主键约束,乐观锁等

八、mq与redis如何保证数据一致性问题
方案1:直接删除redis缓存(适合于小项目)
修改mysql数据
清除redis缓存
方案2:基于mq异步同步更新(代码量大)
更新mysql
投递msq消息
消费者异步同步到redis中
方案3:基于canal框架订阅binlog同步(重点)
canal服务器端(伪装成mysql从节点)订阅到binlog文件
当我们mysql主节点binlog文件发生了变化,则会给canal服务器
canal客户端监听canal服务器端,canal服务器将binlog文件转化成json格式给mq
消费者订阅我们mq实现异步的形式将数据同步给redis
1、jvm --- redis --- mysql
1)jvm先查询redis,redis没有,查询mysql
2)mysql有数据,再存到redis中
2、redis是副本数据,通过思想:最终一致性,只要是做数据同步不可能是实时同步的(网络抖动)
1)mysql从 --订阅binlog文件--> mysql主
2)mysql从 <--同步binlog文件-- mysql主
3、两个思想
强一致性:不允许有脏读(分布式领域中不可能)
最终一致性:短暂的数据延迟
4、产生背景
在分布式领域中同步数据,很难保证强一致性策略,都是采用最终一致性思想
短暂的数据延迟是允许的,但是最终数据要保证一致性
一般延迟10-30毫秒

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java基础之《mq》 的相关文章

  • 【一】第一个java程序详解

    第一个java程序详解 一 前言 二 创建并编写java源代码的文件 创建java源代码文件 更改文件后缀 java代码的结构 三 编译执行 编译 执行 四 总结 五 附 java关键字 一 前言 通过之前上一节 开篇 Java语言介绍及环
  • 动力节点老杜java基础视频笔记第一章 学前准备 (1)

    课堂截图 为什么使用截图工具 在听课的过程中 有的时候老师操作的比较快 通过截图的方式将老师的操作保存下来 以便后期的操作 另外截图之后的图片也可以用于笔记的记录 在笔记当中最好采用图文并茂的方式 这样更加利于知识的回顾 使用哪个截图工具
  • MVC发展历程及思想

    两种web应用程序的开发模式 model 1 JSP JavaBean JSP负责 页面显示 页面跳转 调用Javabean处理数据 处理请求 JavaBean负责 数据封装保存 数据处理逻辑 适用场景 model 1 方式适合开发业务逻辑
  • JAVA中的while do-while循环以及for循环的深刻理解 入门 小白必看

    循环 循环 循环 循环的作用 提出问题为什么需要循环 解决问题循环的出现 while 前序 循环 while循环的语法与流程以及细节 do while 后序循环 do while循环的语法和流程 while和do while 之间的区别 f
  • java数组学习

    2021 2 2 数组 一维数组的使用 1 一维数组的声明和初始化 2 如何调用数组的指定位置的元素 3 如何获取数组的长度 4 如何遍历数组 5 数组元素的默认初始化值 6 数组的内存解析 package day01 import jav
  • Java中变量的作用域【Java基础】

    最近在看 Thinking in Java 想把Java基础再巩固一下 在博客上遇到的以前没注意到的知识点或者较难的知识点记录下来 与大家分享 Java中的基本类型变量的作用域为 int x 1 变量x的作用域只在大括号内 System o
  • 【java基础】 方法,实参和形参,方法的重载,签名,递归

    目录 方法概念及使用 实参和形参的关系 重要 方法的重载 方法签名 简单了解 递归 简单介绍 方法概念及使用 方法就是一个代码片段 类似于 C 语言中的 函数 作用 是能够模块化的组织代码 当代码规模比较复杂的时候 做到代码被重复使用 一份
  • JAVA获取类的类对象的三种方式

    自定义一个类 MyClass 并声明该类的对象 class MyClass MyClass mClass1 new MyClass 1 2 3 在上面说过 Class 类的构造方法是私有的 只有 java 虚拟机可以调用该方法创建该类的对象
  • java Map集合

    目录 一 介绍 二 HashMap 三 TreeMap 四 LinkedHashMap 一 介绍 Java中的Map是一种键值对的集合数据类型 用于存储无序的 不重复的键值对 它提供了快速的查找和访问功能 可以根据键来获取值 常见的Map实
  • [透彻]为什么要前后端分离?

    前后端分离的意义 前后端分离 已成为互联网项目开发的业界标准使用方式 前后端分离 会为以后的大型分布式架构 弹性计算架构 微服务架构打下坚实的基础 核心思想 前端页面调用后端的restuful api接口 并使用json数据进行交互 服务器
  • 进制及进制转换详解。原码、反码、移码,补码区别介绍。(通俗易懂)

    目录 前言 一 十进制 n进制 进制转换详解 1 先说说什么是进制 2 二进制介绍 3 十进制 n进制 进制转换详解 重点 十进制 gt n进制 2 8 16 n进制 2 8 16 gt 十进制 非十进制间的互相转化 二 原码 反码 移码
  • POI解析word\pdf中表格

  • 重试机制的实现(4m,10m,10m,1h,2h,6h,15h)

    项目场景 由于我们现在所做的项目有有很多的外放接口供代理商调用 但是有些接口的响应并不是实时返回的 此时我们就需要使用回调接口的方式 将信息响应给代理商 在这期间可能会出网络不稳定等其他情况 导致回调接口调用失败 所以需要特定的回调重试机制
  • 对接百度api的工具类:Base64Util,FileUtil,HttpUtil

    对接百度api的工具类 Base64Util FileUtil HttpUtil package com baidu ai aip utils Base64 工具类 public class Base64Util private stati
  • springboot跳转页面

    SpringBoot里面只有src目录 在src main resources下面有两个文件夹 static 和 templates springboot默认static中放静态页面 而templates中放动态页面 themleaf和fr
  • Java学习13:面向对象-多态(Polymorphism)内存分析图解

    1 概述 多态是Java面向对象三大特征之一 多态 Polymorphism 顾名思义 即对象具有多种形态 具体而言 是编译时类型 运行时类型 编译时类型 由声明时的类型决定 一般是父类 运行时类型 由实际对应的对象类型决定 具体是哪个子类
  • 求一个数组的最大值最小值及其下标

    求一个数组的最大值最小值及其下标 思路 假定一个数为最大值 如果有个数比假定的最大值还大 那么该数就为最大值 最小值同理 使用for循环 public class MaxMin public static void main String
  • JAVA 8 新特性及使用

    1 前言 2019年9月19日java13已正式发布 感叹java社区强大 经久不衰 由于国内偏保守 新东西总要放一放 让其他人踩踩坑 等稳定了才会去用 并且企业目的还是赚钱 更不会因为一个新特性去重构代码 再开发一套程序出来 甚者国内大多
  • 设计模式(2)

    2 2 结构型模式 结构型模式一共有七种 其中 适配器模式和装饰模式统称为包装模式 装饰模式和代理模式的类图基本相同 但目的不同 这些有相似目的或者有相似结构的模式需要对其概念辨析清楚 才能较好地掌握 下面将对结构型模式分别进行介绍 2 2
  • java连接oracle出现ORA-12505错误

    问题 sqlplus可以连接 但java连接报错 ORA 12505 ORA 12505 TNS listener does not currently know of SID given in connect descr 解析 原因 数据

随机推荐