当前位置: 首页 > news >正文

RabbitMQ、RocketMQ、Kafka常见消息队列不得不知道的事

众所周知,目前的分布式系统中MQ已经成为了不可缺少的一部分,今天就来分析一下常见的消息队列以及他们的使用场景

1. 什么是消息队列

消息队列,一般我们会简称它为MQ(Message Queue)。消息队列是一种帮助开发人员解决系统间异步通信的中间件,常用于解决系统解耦和请求的削峰平谷的问题。
消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。比如生产者发送消息1,2,3…对于消费者就会按照1,2,3…的顺序来消费。
在这里插入图片描述

2.消息队列的应用场景

  • 应用解耦:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;
  • 异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;
  • 限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况
  • 消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理,增加系统的可扩展性

3. 消息队列的两种模式

3.1 点对点模式

点对点模式下包括三个角色

  • 消息队列
  • 发送者 (生产者)
  • 接收者(消费者)

每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,可以放在内存中也可以持久化,直到他们被消费或超时。
在这里插入图片描述
点对点模式特点:

  • 每个消息只有一个消费者,一旦被消费,消息就不再在消息队列中;
  • 发送者和接收者间没有依赖性,发送者发送消息之后,不管有没有接收者在运行,都不会影响到发送者下次发送消息;
  • 接收者在成功接收消息之后需向队列应答成功,即发送回执ack,以便消息队列删除当前接收的消息;

3.2 发布/订阅模式

发布/订阅模式下包括三个角色:

  • 角色主题(Topic)
  • 发布者(Publisher)
  • 订阅者(Subscriber)

消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被多个订阅者消费
在这里插入图片描述
发布/订阅模式特点:

  • 每个消息可以有多个订阅者;
  • 发布者和订阅者之间有时间上的依赖性
  • 为了消费消息,订阅者必须保持在线运行。

4. 消息队列实现机制

4.1 JMS

  • JMS(JAVA Message Service,Java消息服务)是一个Java平台中关于面向消息中间件的API
  • 允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息
  • 是一个消息服务的标准或者说是规范,是 Java 平台上有关面向消息中间件的技术规范
  • 便于消息系统中的 Java 应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口,简化企业应用的开发。
  • JMS 消息机制主要分为两种模型:PTP 模型和 Pub/Sub 模型

4.2 AMQP

AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。

4.3 JMS VS AMQP

在这里插入图片描述

常见的消息队列产品

RabbitMQ

RabbitMQ 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。

ActiveMQ

ActiveMQ是由Apache出品,ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能

RocketMQ

RocketMQ出自 阿里公司的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进,消息可靠性上比 Kafka 更
好。RocketMQ在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理等

Kafka

Apache Kafka是一个分布式消息发布订阅系统。它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),之后成为Apache项目的一部分。Kafka系统快速、可扩展并且可持久化。它的分区特性,可复制和可容错都是其不错的特性。
在这里插入图片描述
总结:

  • 中小型软件公司:
    建议选RabbitMQ.一方面,erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便。但是也有一个问题,虽然RabbitMQ是开源的,国内又有几个能定制化开发erlang的程序员呢?不考虑rocketmq和kafka的原因是,一方面中小型软件公司不如互联网公司,数据量没那么大,选消息中间件,应首选功能比较完备的,所以kafka排除。不考虑rocketmq的原因是,rocketmq是阿里出品,如果阿里放弃维护rocketmq,中小型公司一般抽不出人来进行rocketmq的定制化开发,因此不推荐。
  • 大型软件公司:
    大型软件公司,具备足够的资金搭建分布式环境,也具备足够大的数据量。针对rocketMQ,大型软件公司也可以抽出人手对rocketMQ进行定制化开发,毕竟国内有能力改JAVA源码的人,还是相当多的。至于kafka,根据业务场景选择,如果有日志采集功能,肯定是首选kafka了。

5 各中间件介绍

kafka

RabbitMQ

RocketMQ

相关文章:

  • 简单工厂模式、工厂模式、抽象工厂模式(含C++代码)
  • 自动化测试之路 —— Appium输入及模拟手势
  • 使用聚类(K-means)分析方法对骑手进行分类标签定义
  • Z-Score模型的进阶版:Zeta模型
  • 从零开始配置vim(20)——模糊查询
  • 【CSAPP】现代操作系统前几章
  • React全家桶
  • 聊一聊密钥交换
  • 安装 ZooKeeper 并配置服务
  • 【时间序列】时间序列预测基本方法:移动平均(SMA,EMA,WMA)
  • 电脑重装系统开机后运行慢怎么办
  • [高性能] 关于如何高效的往本地写入视频
  • 【C++】string类
  • 一级建造师考试大纲要改版了?对2022年的考试有影响吗?
  • CSS 伪类选择器 last-child 和 last-of-type 的区别
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 77. Combinations
  • AngularJS指令开发(1)——参数详解
  • Angular数据绑定机制
  • Apache的80端口被占用以及访问时报错403
  • chrome扩展demo1-小时钟
  • java8 Stream Pipelines 浅析
  • Java方法详解
  • LeetCode算法系列_0891_子序列宽度之和
  • React+TypeScript入门
  • 跨域
  • 如何在 Tornado 中实现 Middleware
  • 问题之ssh中Host key verification failed的解决
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • (1)(1.11) SiK Radio v2(一)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (二)fiber的基本认识
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (六)Hibernate的二级缓存
  • (三)模仿学习-Action数据的模仿
  • (一)为什么要选择C++
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • ... 是什么 ?... 有什么用处?
  • .net Stream篇(六)
  • .NetCore项目nginx发布
  • .net程序集学习心得
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .Net转前端开发-启航篇,如何定制博客园主题
  • ?.的用法
  • @Data注解的作用
  • [001-03-007].第07节:Redis中的管道
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [android学习笔记]学习jni编程
  • [Angular 基础] - 指令(directives)
  • [English]英语积累本
  • [kimi笔记]为什么csc.exe不可以双击运行