目录

  • 一、ActiveMQ
  • 二、Kafka
  • 三、RabbtiMQ
  • 四、RocketMQ
    • 组成部分
  • 五、四者比较
  • 六、MQ带来的问题
    • 如何保证消息不丢失?
    • 如何保证消息不被重复消费?
    • 如何保证消息消费的顺序性?
    • 大量消息堆积怎么处理?
    • 消息过期怎么处理?
  • 七、使用MQ优缺点

一、ActiveMQ

ActiveMQ是一个完全支持JMS 1.1和J2EE 1.4规范的JMS Provider实现。JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。

JMS消息通常有两种类型:
1.点对点(Point-to-Point):在点对点的消息系统中,消息分发给一个单独的使用者,点对点消息往往与队列关联。
2.发布//订阅(Publish/Subscribe):发布/订阅消息系统支持一个事件驱动模型,消息生产者和消费者都参与消息的传递。该类消息一般与特定的主题关联。


二、Kafka

Kafka是一种分布式的,基于发布/订阅的消息系统。Kafka开发语言为Scala,支持跨平台。

Kafka的基本概念
1.Broker:消息中间件处理节点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群。
2.Topic:一类消息,例如page view日志/click日志等都可以以topic的形式存在,Kafka集群能够同时负责多个topic的分发。
3.Partition:topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。
4.Segment:partition物理上由多个segment组成。
5.offset:每个partition都由一系列有序的/不可变的消息组织,这些消息被连续的追加到partition中。partition中的每个消息都有一个连续的序列号叫做offset,用于partition唯一标识一条消息。

ActiveMQ与Kafka的区别

对比点 ActiveMQ Kafka
接口协议 遵循JMS规范,各语言支持较好 没有遵循标准MQ接口协议,使用较为复杂
吞吐量 较低,磁盘随机读写 较高,磁盘顺序读写
游标位置 Active来管理,无法读取历史数据 客户端自己管理,不乐意甚至重新读一遍也行
HA机制 主从复制,竞争锁的方式来选举新的主节点 和hadoop系列产品一样,由zk管理所有节点

1.ActiveMQ的优势是功能全,安装简单,需要的资源Kafka少,两台ActiveMQ就能满足服务高可用。

2.Kafka是一个性能怪兽,简单配置就轻松可以达到10W TPS。


三、RabbtiMQ

RabbitMQ是一个高级消息队列协议,Advanced Message Queuing Protocol(AMQP)的开源实现,由以高性能、可伸缩性出名的Erlang写成。
RabbitMQ内部结构及每个直接的联系

  • Message

消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。

  • Publisher

消息的生产者,也是一个向交换器发布消息的客户端应用程序。

  • Exchange

交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。

  • Binding

绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。

  • Queue

消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。

  • Connection

网络连接,比如一个TCP连接。

  • Channel

信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。

  • Consumer

消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。

  • Virtual Host

虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。

  • Broker

表示消息队列服务器实体。

AMQP协议主要有3个组件:
交换器(Exchange):它是发送消息的实体
队列(Queue):它是接收消息的实体
绑定器(Bind):将交换器和队列连接起来,并且封装消息的路由信息

Exchange类型
Direct Exchange直连交换机

Topic Exchange主题交换机

Fanout Exchange 广播交换机

特点:
1.可靠性
2.灵活的路由
3.消息集群
4.高可用
5.多种协议
6.多语言客户端
7.管理界面
8.跟踪机制
9.插件机制


四、RocketMQ

组成部分

Producer
消息生产者,生产者的作用就是将消息发送到 MQ,生产者本身既可以产生消息,如读取文本信息等。也可以对外提供接口,由外部应用来调用接口,再由生产者将收到的消息发送到 MQ。

Producer Group
生产者组,简单来说就是多个发送同一类消息的生产者称之为一个生产者组。在这里可以不用关心,只要知道有这么一个概念即可。

Consumer
消息消费者,简单来说,消费 MQ 上的消息的应用程序就是消费者,至于消息是否进行逻辑处理,还是直接存储到数据库等取决于业务需要。

Consumer Group
消费者组,和生产者类似,消费同一类消息的多个 consumer 实例组成一个消费者组。

Topic
Topic 是一种消息的逻辑分类,比如说你有订单类的消息,也有库存类的消息,那么就需要进行分类,一个是订单 Topic 存放订单相关的消息,一个是库存 Topic 存储库存相关的消息。

Message
Message 是消息的载体。一个 Message 必须指定 topic,相当于寄信的地址。Message 还有一个可选的 tag 设置,以便消费端可以基于 tag 进行过滤消息。也可以添加额外的键值对,例如你需要一个业务 key 来查找 broker 上的消息,方便在开发过程中诊断问题。

Tag
标签可以被认为是对 Topic 进一步细化。一般在相同业务模块中通过引入标签来标记不同用途的消息。

Broker
Broker 是 RocketMQ 系统的主要角色,其实就是前面一直说的 MQ。Broker 接收来自生产者的消息,储存以及为消费者拉取消息的请求做好准备。

Name Server
Name Server 为 producer 和 consumer 提供路由信息。

yaml文件配置

rocketmq:name-server: 192.168.22.99:9876producer:retry-next-server: trueretry-times-when-send-async-failed: 3retry-times-when-send-failed: 3send-message-timeout: 10000mq:topic:data-request-log: p_md-data-request-log_testdata-config-cache: p_md-data-cache_testconsumer-group:data-config-cache: c_md-data-cache_test

五、四者比较


六、MQ带来的问题

四种MQ共性的问题

如何保证消息不丢失?

原因:

  • 消息生产者没有成功发送到MQ Broker。
  • 消息发送给MQ Broker后,Broker宕机导致内存中的消息数据丢失。
  • 消费者消费到了消息,但是没有处理完毕就出现异常导致丢失。

解决:

  • 消息发送者发送给MQ Broker后,MQ Broker给生产者确认收到
  • MQ收到消息后进行消息持久化
  • 消费者收到消息处理完毕后手动进行ack确认
  • MQ收到消费者ack确认后删除持久化的消息

如何保证消息不被重复消费?

原因:根本原因是网络不可达

  • 发送时消息重复

当一条消息已被成功发送到服务端,此时出现了网络闪断,导致服务端对客户端应答失败。如果此时生产者意识到消息发送失败并尝试再次发送消息,消费者后续会受到两条内容相同的消息。

  • 消费时消息重复

消息消费的场景下,消息已投递到消费者并完成业务处理,当消费方给MQ服务端反馈应答的时候网络闪断。为了保证消息至少被消费一次,MQ服务端将在网络恢复后再次尝试投递之前已被消费方处理过的消息,此时消费者就会收到两条内容相同的消息。

解决:

  • 消息发送者发送消息时携带一个全局唯一的消息id
  • 消费者获取消费后先根据id在redis/db中查询是否存在消费记录
  • 如果没有消费过就正常消费,消费完毕后写入redis/db
  • 如果消息消费过就直接舍弃

如何保证消息消费的顺序性?

消息有序指的是可以按照消息的发送顺序来消费。
如何保证?
全局顺序消息,生产者:MQ:消费者=1:1:1
局部顺序消息

  • 生产者将同一组消息发送到单个队列
  • 多个消费者并行对消息进行消费
  • Queue通过分段锁保证消息消费的顺序性

大量消息堆积怎么处理?

原因:

  • 消费方消费出现故障,如网络故障

解决:

  • 将堆积消息分发到更大容量的MQ集群
  • 增加消费方节点并行消费

消息过期怎么处理?

原因:

  • 消息设置了过期时间
  • 消费方消费出现故障,导致消息一直未被处理,消息就会过期。

解决:

  • 设置死信队列,接受过期消息
  • 消费死信队列的过期消息,记录日志
  • 重新查询过期消息发送到MQ

七、使用MQ优缺点

优点:
削峰 解耦 异步
不足:

  • 系统可用性降低
  • 系统复杂度提高
  • 一致性问题

参考
ActiveMQ和RabbitMQ区别
1.ActiveMQ与RabbitMQ二者的queue有什么区别?
ActiveMQ的queue只允许一个生产者和一个消费者,RabbitMQ的queue允许多个生产者和多个消费者。
2.ActiveMQ与RabbitMQ二者的topic有什么区别?
ActiveMQ的topic会将同一个消息发送给所有订阅的消费者,RabbitMQ的queue只将同一个消息发送给所有订阅的消费者之一。

【消息中间件】MQ家族相关推荐

  1. (十四)消息中间件MQ详解及四大MQ比较

    一.消息中间件相关知识 1.概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流 ...

  2. 消息中间件MQ的学习境界和路线

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  3. 总结篇:消息中间件MQ的学习境界和路线

    在<深入理解Java类加载机制,再也不用死记硬背了>里我提到了对于一门语言的"会"的三个层次.本篇将以知识地图的形式展现学习消息中间件MQ各个层次要掌握的内容. 知识地 ...

  4. 消息中间件MQ及ActiveMQ介绍

    前言 本篇文章会首先介绍MQ的概念,及核心概念及核心设计来理解出为什么需要消息中间件,消息中间间的作用,然后会接着介绍常用的activeMq的安装,以及在spring中集成,一些比较常用的命令. 无论 ...

  5. 【消息中间件MQ系列】消息队列之ActiveMQ、RocketMQ、RabbitMQ、Kafka不得不说的秘密

    热门系列: [消息中间件MQ系列]RabbitMQ安装与使用,并与SpringBoot整合 程序人生,精彩抢先看 目录 1.消息队列/消息中间件介绍 1.1 消息中间件是什么 1.1.1 消息中间件的 ...

  6. 消息中间件MQ知识概括

    消息中间件MQ知识概括 MQ简介 MQ与RPC JMS MQ协议 MQ方案对比 消息消费方式 MQ简介 MQ的产品种类和对比: MQ就是消息中间件.MQ是一种理念,ActiveMQ是MQ的落地产品.不 ...

  7. 微服务 消息中间件MQ

    微服务 消息中间件MQ 1. MQ的定义 2. MQ的作用 3. MQ的特点 4. MQ消费方式 5. 常用MQ对比分析 1. MQ的定义 MQ就是消息中间件.面向消息的中间件(message-ori ...

  8. 消息中间件学习总结(19)——生产案例:消息中间件 MQ 如何处理消费失败的消息?

    1.消息中间件在生产系统中的使用 下图是一个非常典型的生产环境的问题,很多公司都会在生产系统里使用MQ,即消息队列.也就是说,一个系统跟另外一个系统之间进行通信的时候,假如系统A希望发送一个消息给系统 ...

  9. 【消息中间件MQ分享】

    WAHT ? 什么是MQ      生产消费模型 生产消费模型: 生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者 ...

最新文章

  1. Netty整合SpringMVC,实现高效的HTTP服务请求
  2. html,css,js小实例,CSS和JavaScript脚本实例
  3. 解决页面换行因标点符号不能出现在每一行的开头,导致提前换行,中间出现空隙的问题
  4. 180.4. WebSphere Commerce Engerprise 7.0 Feature Pack 2.iso
  5. 在ASP.NET Core应用程序中使用分布式缓存
  6. 经典C语言程序100例之九六
  7. 大数据_Spark框架_快速上手_word count 案例-功能实现---Spark工作笔记0007
  8. solr6.6 导入 文本(txt/json/xml/csv)文件
  9. c语言编译器IDE有iOS,C语言编译器和IDE的选择
  10. 软件工程 | 第三章 需求分析
  11. android信鸽推送demo_腾讯信鸽推送(java版)
  12. 对区块链技术的一些思考
  13. ASEMI快恢复二极管US1M参数,US1M恢复时间,US1M压降
  14. 【CVPR2021】OCR文本检测MOST解读
  15. PHP实现图片合并功能(根据群用户头像生成群logo图片)
  16. python抠图精确到发丝_ps抠图有一些发丝怎么扣
  17. python编程代码-python编程代码
  18. 计算机自动连续进行数据处理是因为什么,现代计算机之所以能自动连续进行数据处理是因为什么...
  19. 计算机游戏的作文,电脑游戏作文3000字初一_查字典作文网
  20. Fedora/CentOS安装Komorebi动态壁纸

热门文章

  1. python里输入3.14*2会出现数据报错_Python程序员的30个常见错误
  2. SparkSQL_JOIN 倾斜优化_1.broadcastJOIN 2.broadcast 3.数据膨胀 详解
  3. 计算机所有u口都不读u盘,U盘不被电脑识别,不要扔掉!解决方法!收藏!
  4. 左神算法笔记(一)时间复杂度
  5. 大部分工业机器人都采用二级计算机控制,焊接机器人示教器解读.ppt
  6. BUUCTF:爱因斯坦
  7. iOS 使用UITextField隐藏键盘
  8. SDL Trados 2019 和 SDL Trados 2021 最新版本的下载地址 (2021年七月更新)
  9. 德龙X5000导航升级包下载
  10. java 海鲜超市项目_基于jsp的海鲜超市管理-JavaEE实现海鲜超市管理 - java项目源码...