MQ知识点汇总
1. MQ是什么
2. MQ能做什么
3. 消息模式
4. 使用MQ的时候需要注意什么
5. 常用MQ
6. MQ的不足
7. 什么时候不适用MQ
8. MQ的组成
9. MQ的关注点
1. MQ是什么
MQ 是message queue ,消息队列,也叫消息中间件、消息总线,是一种跨进程的通信机制,用于上下游传递消息。遵守JMS(java message service)规范的一种软件。数据库因为历史原因,横向扩展是一件非常复杂的工程,所有我们一般会尽量把流量都挡在数据库之前。不管是无限的横向扩展服务器,还是纵向阻隔到达数据库的流量,都是这个思路。阻隔直达数据库的流量,缓存组件和消息组件是两大杀器。
2. MQ能做什么
1)数据驱动的任务依赖:
例如:task2在task1执行完成后才能执行,存在依赖关系
2)解耦:上游不关心执行结果
例如:注册成功后发邮件
3)上游关注执行结果,但执行时间很长
例如:微信支付成功的回调
4)限流(削峰)
5)通知
6)数据分发
a. 注册后我们可能需要做很多初始化的操作,如:调用邮件服务器发送邮件、调用促销服务赠送优惠劵、下发用户数据到客户关系系统等。
那么这时候我们将这些操作去监听MQ,当用户注册成功过后,通过MQ通知其他业务进行操作。确保注册用户的性能。
b. 后台发布商品的时候,商品数据需要从数据库中转换成搜索引擎数据(基于elasticsearch),那么我们应该将商品写入数据库后,
再写入到MQ,然后通过监听MQ来生成elasticsearch对应的数据。
c. 用户下单后,24小时未支付,需要取消订单。以前我们可能是定时任务循环查询,然后取消订单。实际上,我更推荐类似延迟MQ的方式,
避免了很多无效的数据库查询,将一个MQ设置为24小时后才让消费者消费掉,这样很大程度上能减轻服务器压力。
d. 支付完成后,需要及时的通知子系统(进销存系统发货,用户服务积分,发送短信)进行下一步操作,但是,支付回调我们都是需要保证
高性能的,所以,我应该直接修改数据库状态,存入MQ,让MQ通知子系统做其他非实时的业务操作。这样能保证核心业务的高效及时。
7)分布式事务
8)日志处理:
kafka日志处理
3. 消息模式
1)点对点模式和发布订阅模式:是否可以重复消费
a. P2P模式:
P2P模式包含三个角色:消息队列(Queue),发送者(Sender),接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者
从队列中获取消息。队列保留着消息,直到他们被消费或超时。
b. Pub/sub模式:
包含三个角色:主题(Topic),发布者(Publisher),订阅者(Subscriber) 。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
2)推模式和拉模式:消息的更新者
a. 推(push)模式是一种基于C/S机制、由服务器主动将信息送到客户器的技术。
b. 拉(pull)模式与推模式相反,是由客户器主动发起的事务。
4. 使用MQ的时候需要注意什么
1)消息必达:
a. 消息收到先落地
b. 消息超时、重传、确认保证消息必达
2)幂等性:
a. 上半场:MQ-client生成inner-msg-id,保证上半场幂等。这个ID全局唯一,业务无关,由MQ保证。
b. 下半场:业务发送方带入biz-id,业务接收方去重保证幂等。这个ID对单业务唯一,业务相关,对MQ透明。
结论:幂等性,不仅对MQ有要求,对业务上下游也有要求。
3)高效延时消息,包含两个重要的数据结构:
a. 环形队列,例如可以创建一个包含3600个slot的环形队列(本质是个数组)
b. 任务集合,环上每一个slot是一个Set<Task>
环形队列是一个实现“延时消息”的好方法,开源的MQ好像都不支持延迟消息,不妨自己实现一个简易的“延时消息队列”,
能解决很多业务问题,并减少很多低效扫库的cron任务。
4)削峰填谷
a. MQ-client提供拉模式,定时或者批量拉取,可以起到削平流量,下游自我保护的作用(MQ需要做的)
b. 要想提升整体吞吐量,需要下游优化,例如批量处理等方式(消息接收方需要做的)
5. 常用MQ
6. MQ的不足:
1)系统更复杂,多了一个MQ组件
2)消息传递路径更长,延时会增加
3)消息可靠性和重复性互为矛盾,消息不丢不重难以同时保证
4)上游无法知道下游的执行结果,这一点是很致命的
7. 什么时候不适用MQ
1)上游实时关注执行结果
8. MQ的组成:
1)生产者
2)消费者
3)队列
4)路由
9. MQ的关注点:
1)发布订阅
2)消息优先级
3)消息有序
4)持久化
5)消息过滤
6)消息可靠性:主从,同步双写,异步双写
7)消息低延迟(RocketMQ 使用长轮询 Pull 方式,可保证消息非常实时,消息实时性丌低亍 Push)
8)At least Once(是指每个消息必须投递一次)
9)Exactly Only Once:发送消息阶段,不允许収送重复的消息;消费消息阶段,不允许消费重复的消息。
10)Broker的Buffer满了怎么办?
11)回溯消费
12)消息堆积
13)分布式事务
14)定时消息
15)消息重试
消息通道对并发的支持以及在性能上的表现;消息通道是否充分地考虑了错误处理;对消息安全的支持;以及关于消息持久化、灾备(fail over)与集群等方面的支持。
参见:https://www.cnblogs.com/xuyatao/p/6864109.html
https://www.cnblogs.com/joylee/p/8916460.html
https://blog.csdn.net/KingCat666/article/details/78660535
MQ知识点汇总的更多相关文章
- nginx几个知识点汇总
WHY? 为什么用Nginx而不用LVS? 7点理由足以说明一切:1 .高并发连接: 官方测试能够支撑 5 万并发连接,在实际生产环境中跑到 2 - 3 万并发连接数.?2 .内存消耗少: 在 3 万 ...
- python全栈开发 * 10知识点汇总 * 180612
10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表⽰接收任意内容) (1)动态位置参数def eat(*args): print(a ...
- 清华大学OS操作系统实验lab1练习知识点汇总
lab1知识点汇总 还是有很多问题,但是我觉得我需要在查看更多资料后回来再理解,学这个也学了一周了,看了大量的资料...还是它们自己的80386手册和lab的指导手册觉得最准确,现在我就把这部分知识做 ...
- c++ 函数知识点汇总
c++ 函数知识点汇总 swap函数 交换两个数组元素 比如 swap(a[i],a[j]); 就是交换a[i] 和 a[j] 的值 strcpy() 复制一个数组元素的值到另一个数组元素里 strc ...
- 前端开发 JavaScript 干货知识点汇总
很多初学的朋友经常问我,前端JavaScript都需要学习哪些东西呀?哪些是JavaScript的重点知识啊? 其实做前端开发工程师,所有的知识点都是我们学习必备的东西,只有扎实的技术基础才是高薪的关 ...
- BBS项目知识点汇总
目录 bbs项目知识点汇总 一. JavaScript 1 替换头像 2 form表单拿数据 3 form组件error信息渲染 4 添加html代码 5 聚焦操作 二 . html在线编辑器 三 . ...
- Java面试知识点汇总
Java面试知识点汇总 置顶 2019年05月07日 15:36:18 温柔的谢世杰 阅读数 21623 文章标签: 面经java 更多 分类专栏: java 面试 Java面试知识汇总 版权声明 ...
- 离散数学 II(最全面的知识点汇总)
离散数学 II(知识点汇总) 目录 离散数学 II(知识点汇总) 代数系统 代数系统定义 例子 二元运算定义 运算及其性质 二元运算的性质 封闭性 可交换性 可结合性 可分配性 吸收律 等幂性 消去律 ...
- ECMAScript版本知识点汇总
ECMAScript版本知识点汇总 ES5 btoa.atob 对参数进行base64格式编码.解码 /** * btoa() * base64编码 * @param {string} str * @ ...
随机推荐
- 输入、输出与Mad Libs 游戏
name1=input('请输入一个名字:') name2=input('再输入一个名字:') time1=input('请输入一段时间:') print('{},是傻子,{},{}找不到小栗旬'.f ...
- Selenium 3----WebDriver常用方法
在学会定位元素的基础上,进行元素的操作. WebDriver常用方法: clear(): 清除文本. send_keys (value): 模拟按键输入. click(): 单击元素. submit( ...
- vue----分级上传
<template> <div class="page"> <div id="filePicker">选择文件</di ...
- apache-2.4.6 mod_bw-0.92 实现限速上传或下载
下载 mod_bw wget http://ivn.cl/files/source/mod_bw-0.92.tgz 解压到mod_bw tar -zxvf mod_bw-0.92.tgz -C mo ...
- EE4218 / EE4216 Faculty of Science and Engineering
Faculty of Science and EngineeringDepartment of Electronic and ComputerEngineeringEnd of Semester As ...
- LeetCode 242 Valid Anagram 解题报告
题目要求 Given two strings s and t , write a function to determine if t is an anagram of s. 题目分析及思路 给出两个 ...
- MongoDB安全使用指引
MongoDB社区版有三大主要安全措施,分别是安全认证.角色授权和TLS/SSL传输加密.当然除此之外,定期做数据库备份,也是很好的安全防范手段.另外,本文还将对一些提升MongoDB安全性的细节做阐 ...
- pc端 页面 显示在手机 一行控制适配问题
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
- python做数据驱动
python代码如下: import unittestfrom openpyxl import load_workbookfrom openpyxl.styles import Fontfrom op ...
- HBase JavaAPI
一.概念 1.对HBase JavaAPI的概述: 01.hbase使用java语言编写,自然支持java编程 02.支持CRUD操作 03.JavaAPI包含了所有的hbase的shell,甚至比这 ...