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知识点汇总的更多相关文章

  1. nginx几个知识点汇总

    WHY? 为什么用Nginx而不用LVS? 7点理由足以说明一切:1 .高并发连接: 官方测试能够支撑 5 万并发连接,在实际生产环境中跑到 2 - 3 万并发连接数.?2 .内存消耗少: 在 3 万 ...

  2. python全栈开发 * 10知识点汇总 * 180612

    10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表⽰接收任意内容) (1)动态位置参数def eat(*args): print(a ...

  3. 清华大学OS操作系统实验lab1练习知识点汇总

    lab1知识点汇总 还是有很多问题,但是我觉得我需要在查看更多资料后回来再理解,学这个也学了一周了,看了大量的资料...还是它们自己的80386手册和lab的指导手册觉得最准确,现在我就把这部分知识做 ...

  4. c++ 函数知识点汇总

    c++ 函数知识点汇总 swap函数 交换两个数组元素 比如 swap(a[i],a[j]); 就是交换a[i] 和 a[j] 的值 strcpy() 复制一个数组元素的值到另一个数组元素里 strc ...

  5. 前端开发 JavaScript 干货知识点汇总

    很多初学的朋友经常问我,前端JavaScript都需要学习哪些东西呀?哪些是JavaScript的重点知识啊? 其实做前端开发工程师,所有的知识点都是我们学习必备的东西,只有扎实的技术基础才是高薪的关 ...

  6. BBS项目知识点汇总

    目录 bbs项目知识点汇总 一. JavaScript 1 替换头像 2 form表单拿数据 3 form组件error信息渲染 4 添加html代码 5 聚焦操作 二 . html在线编辑器 三 . ...

  7. Java面试知识点汇总

    Java面试知识点汇总 置顶 2019年05月07日 15:36:18 温柔的谢世杰 阅读数 21623 文章标签: 面经java 更多 分类专栏: java 面试 Java面试知识汇总   版权声明 ...

  8. 离散数学 II(最全面的知识点汇总)

    离散数学 II(知识点汇总) 目录 离散数学 II(知识点汇总) 代数系统 代数系统定义 例子 二元运算定义 运算及其性质 二元运算的性质 封闭性 可交换性 可结合性 可分配性 吸收律 等幂性 消去律 ...

  9. ECMAScript版本知识点汇总

    ECMAScript版本知识点汇总 ES5 btoa.atob 对参数进行base64格式编码.解码 /** * btoa() * base64编码 * @param {string} str * @ ...

随机推荐

  1. numpy中的广播

    目录 广播的引出 广播的原则 数组维度不同,后缘维度的轴长相符 数组维度相同,其中有个轴为1 参考: 广播的引出  numpy两个数组的相加.相减以及相乘都是对应元素之间的操作. import num ...

  2. 20181207_Second_小结

    1. 上下 200*200 盒子的重叠,切记用 absolute 绝对定位 为最佳解决方案 2. 移动端多使用 粘连布局 <!DOCTYPE html> <html> < ...

  3. (97)Wangdao.com_第三十天_触摸事件

    触摸事件 只有触摸屏才会引发这一类事件 触摸事件 和 鼠标事件 同时触发,即使这个时候并没有用到鼠标. 这是为了让那些只定义鼠标事件.没有定义触摸事件的代码,在触摸屏的情况下仍然能用. 如果想避免这种 ...

  4. Go语言基础之time包

    Go语言基础之time包 时间和日期是我们编程中经常会用到的,本文主要介绍了Go语言内置的time包的基本用法. Go语言中导入包 Go语言中使用import关键字导入包,包的名字使用双引号(”)包裹 ...

  5. Vue 前端面试题

    Vue 前端面试题 1. 说一下 Vue 的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合“发布者 - 订阅者”模式的方式,通过 Object.defineProperty() ...

  6. centos7 openfiles问题

    集群环境有几台新增的机器,尝试修改open files的时候,按照平常的操作就是修改/etc/security/limits.conf和/etc/security/limits.d/90-nproc. ...

  7. extundelete数据恢复

    需要安装的依赖包: 1. e2fsprogs软件包已安装2. e2fsprogs-libs软件包已安装3. e2fsprogs-devel软件包已安装4. gcc软件包已安装5. gcc-c++ 软件 ...

  8. Spring Boot web简介及原理 day04

    一.SpringBoot创建web开发(三部曲) 1.快速构建SpringBoot项目,并以jar包的形式构建 2.选择对应的功能模块 (选定场景,配置少量的配置就可运行,不配置有默认值) 3.编写自 ...

  9. Spring Boot(三):AOP&日志操作&异常处理

    一.AOP:HttpAspect.java 二.操作日志 在HttpAspect.java中调用org.slf4j.Logger.org.slf4j.LoggerFactory 三.异常处理 1.定义 ...

  10. 001-zookeeper 简介-paxos算法,zk简介,特点

    一.概述 大数据体系概述 1.1.什么是zookeeper 是Google的Chubby一个开源的实现,是Hadoop的分布式协调服务 它包含一个简单的原语集,分布式应用程序可以基于他实现同步服务,配 ...