首页 > 其他分享 >1.消息队列基础

1.消息队列基础

时间:2023-12-06 21:56:29浏览次数:30  
标签:队列 JMS 基础 RabbitMQ Kafka 消息 RocketMQ

什么是消息队列?

  可以把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。由于队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。

   参与消息传递的双方称为 生产者消费者 ,生产者负责发送消息,消费者负责处理消息。消息队列更多指的是各个服务以及系统内部各个组件/模块之前的通信,属于一种 中间件

消息队列有什么用?

通常来说,使用消息队列能为我们的系统带来下面三点好处:

  通过异步处理提高系统性能(减少响应所需时间):用户在发送请求之后,服务端立马返回响应给客户,一方面将请求写入消息队列,真正完成业务后再通知一次用户。

  削峰/限流:先将短时间高并发产生的事务消息存储在消息队列中,然后后端服务再慢慢根据自己的能力去消费这些消息,这样就避免直接把后端服务打垮掉。

  解耦:模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块影响较小,这样系统的可扩展性无疑更好一些

  实现分布式事务:

    分布式事务的解决方案之一就是 MQ 事务。

    RocketMQ、 Kafka、Pulsar、QMQ 都提供了事务相关的功能。事务允许事件流应用将消费,处理,生产消息整个过程定义为一个原子操作。

使用消息队列会带来哪些问题?

  • 系统可用性降低: 在加入 MQ 之前,不用考虑消息丢失或者说 MQ 挂掉等等的情况,但是,引入 MQ 之后就需要去考虑了。
  • 系统复杂性提高: 加入 MQ 之后,需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题。
  • 一致性问题: 消息队列带来的异步确实可以提高系统响应速度,但是,万一消息的真正消费者并没有正确消费消息,就会导致数据不一致的情况。

 

JMS 是什么?

  JMS(JAVA Message Service,java 消息服务)是 Java 的消息服务,JMS 的客户端之间可以通过 JMS 服务进行异步的消息传输。JMS(JAVA Message Service,Java 消息服务)API 是一个消息服务的标准或者说是规范,允许应用程序组件基于 JavaEE 平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。

  JMS 定义了五种不同的消息正文格式以及调用的消息类型,允许你发送并接收以一些不同形式的数据:

  • StreamMessage:Java 原始值的数据流
  • MapMessage:一套名称-值对
  • TextMessage:一个字符串对象
  • ObjectMessage:一个序列化的 Java 对象
  • BytesMessage:一个字节的数据流

  ActiveMQ(已被淘汰) 就是基于 JMS 规范实现的。

JMS 两种消息模型

# 点到点(P2P)模型

  队列模型

  使用队列(Queue)作为消息通信载体;满足生产者与消费者模式,一条消息只能被一个消费者使用,未被消费的消息在队列中保留直到被消费或超时。比如:我们生产者发送 100 条消息的话,两个消费者来消费一般情况下两个消费者会按照消息发送的顺序各自消费一半(也就是你一个我一个的消费。)

# 发布/订阅(Pub/Sub)模型

  发布订阅模型(Pub/Sub) 使用主题(Topic)作为消息通信载体,类似于广播模式;发布者发布一条消息,该消息通过主题传递给所有的订阅者。

 

AMQP 是什么?

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

  RabbitMQ 就是基于 AMQP 协议实现的。

 

JMS vs AMQP

对比方向JMSAMQP
定义 Java API 协议
跨语言
跨平台
支持消息类型 提供两种消息模型:①Peer-2-Peer;②Pub/sub 提供了五种消息模型:①direct exchange;②fanout exchange;③topic change;④headers exchange;⑤system exchange。本质来讲,后四种和 JMS 的 pub/sub 模型没有太大差别,仅是在路由机制上做了更详细的划分;
支持消息类型 支持多种消息类型 ,我们在上面提到过 byte[](二进制)

总结:

  • AMQP 为消息定义了线路层(wire-level protocol)的协议,而 JMS 所定义的是 API 规范。在 Java 体系中,多个 client 均可以通过 JMS 进行交互,不需要应用修改代码,但是其对跨平台的支持较差。而 AMQP 天然具有跨平台、跨语言特性。
  • JMS 支持 TextMessageMapMessage 等复杂的消息类型;而 AMQP 仅支持 byte[] 消息类型(复杂的类型可序列化后发送)。
  • 由于 Exchange 提供的路由算法,AMQP 可以提供多样化的路由方式来传递消息到消息队列,而 JMS 仅支持 队列 和 主题/订阅 方式两种。

RPC 和消息队列的区别

RPC 和消息队列都是分布式微服务系统中重要的组件之一,下面我们来简单对比一下两者:

  • 从用途来看:RPC 主要用来解决两个服务的远程通信问题,不需要了解底层网络的通信机制。通过 RPC 可以帮助我们调用远程计算机上某个服务的方法,这个过程就像调用本地方法一样简单。消息队列主要用来降低系统耦合性、实现任务异步、有效地进行流量削峰。
  • 从通信方式来看:RPC 是双向直接网络通讯,消息队列是单向引入中间载体的网络通讯。
  • 从架构上来看:消息队列需要把消息存储起来,RPC 则没有这个要求,因为前面也说了 RPC 是双向直接网络通讯。
  • 从请求处理的时效性来看:通过 RPC 发出的调用一般会立即被处理,存放在消息队列中的消息并不一定会立即被处理。

RPC 和消息队列本质上是网络通讯的两种不同的实现机制,两者的用途不同,万不可将两者混为一谈。

 

分布式消息队列技术选型

# 常见的消息队列有哪些?

Kafka是 LinkedIn 开源的一个分布式流式处理平台,已经成为 Apache 顶级项目,早期被用来用于处理海量的日志,后面才慢慢发展成了一款功能全面的高性能消息队列。

流式处理平台具有三个关键功能:

  1. 消息队列:发布和订阅消息流,这个功能类似于消息队列,这也是 Kafka 也被归类为消息队列的原因。
  2. 容错的持久方式存储记录消息流:Kafka 会把消息持久化到磁盘,有效避免了消息丢失的风险。
  3. 流式处理平台: 在消息发布的时候进行处理,Kafka 提供了一个完整的流式处理类库。

Kafka 是一个分布式系统,由通过高性能 TCP 网络协议进行通信的服务器和客户端组成,可以部署在在本地和云环境中的裸机硬件、虚拟机和容器上。

在 Kafka 2.8 之前,Kafka 最被大家诟病的就是其重度依赖于 Zookeeper 做元数据管理和集群的高可用。在 Kafka 2.8 之后,引入了基于 Raft 协议的 KRaft 模式,不再依赖 Zookeeper,大大简化了 Kafka 的架构,让你可以以一种轻量级的方式来使用 Kafka。

如果要使用 KRaft 模式的话,建议选择较高版本的 Kafka,因为这个功能还在持续完善优化中。Kafka 3.3.1 版本是第一个将 KRaft(Kafka Raft)共识协议标记为生产就绪的版本。

 

RocketMQ 是阿里开源的一款云原生“消息、事件、流”实时数据处理平台,借鉴了 Kafka,已经成为 Apache 顶级项目。

RocketMQ 的核心特性(摘自 RocketMQ 官网):

  • 云原生:生与云,长与云,无限弹性扩缩,K8s 友好
  • 高吞吐:万亿级吞吐保证,同时满足微服务与大数据场景。
  • 流处理:提供轻量、高扩展、高性能和丰富功能的流计算引擎。
  • 金融级:金融级的稳定性,广泛用于交易核心链路。
  • 架构极简:零外部依赖,Shared-nothing 架构。
  • 生态友好:无缝对接微服务、实时计算、数据湖等周边生态。

根据官网介绍:

Apache RocketMQ 自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨,RocketMQ 已经成为业内共识的金融级可靠业务消息首选方案,被广泛应用于互联网、大数据、移动互联网、物联网等领域的业务场景。

  RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件,它最初起源于金融系统,用于在分布式系统中存储转发消息。

RabbitMQ 发展到今天,被越来越多的人认可,这和它在易用性、扩展性、可靠性和高可用性等方面的卓著表现是分不开的。RabbitMQ 的具体特点可以概括为以下几点:

  • 可靠性: RabbitMQ 使用一些机制来保证消息的可靠性,如持久化、传输确认及发布确认等。
  • 灵活的路由: 在消息进入队列之前,通过交换器来路由消息。对于典型的路由功能,RabbitMQ 己经提供了一些内置的交换器来实现。针对更复杂的路由功能,可以将多个交换器绑定在一起,也可以通过插件机制来实现自己的交换器。这个后面会在我们讲 RabbitMQ 核心概念的时候详细介绍到。
  • 扩展性: 多个 RabbitMQ 节点可以组成一个集群,也可以根据实际业务情况动态地扩展集群中节点。
  • 高可用性: 队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队列仍然可用。
  • 支持多种协议: RabbitMQ 除了原生支持 AMQP 协议,还支持 STOMP、MQTT 等多种消息中间件协议。
  • 多语言客户端: RabbitMQ 几乎支持所有常用语言,比如 Java、Python、Ruby、PHP、C#、JavaScript 等。
  • 易用的管理界面: RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点等。在安装 RabbitMQ 的时候会介绍到,安装好 RabbitMQ 就自带管理界面。
  • 插件机制: RabbitMQ 提供了许多插件,以实现从多方面进行扩展,当然也可以编写自己的插件。感觉这个有点类似 Dubbo 的 SPI 机制
 

如何选择?

对比方向概要
吞吐量 万级的 ActiveMQ 和 RabbitMQ 的吞吐量(ActiveMQ 的性能最差)要比十万级甚至是百万级的 RocketMQ 和 Kafka 低一个数量级。
可用性 都可以实现高可用。ActiveMQ 和 RabbitMQ 都是基于主从架构实现高可用性。RocketMQ 基于分布式架构。 Kafka 也是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
时效性 RabbitMQ 基于 Erlang 开发,所以并发能力很强,性能极其好,延时很低,达到微秒级,其他几个都是 ms 级。
功能支持 Pulsar 的功能更全面,支持多租户、多种消费模式和持久性模式等功能,是下一代云原生分布式消息流平台。
消息丢失 ActiveMQ 和 RabbitMQ 丢失的可能性非常低, Kafka、RocketMQ 和 Pulsar 理论上可以做到 0 丢失。
总结:
  • ActiveMQ 的社区算是比较成熟,但是较目前来说,ActiveMQ 的性能比较差,而且版本迭代很慢,不推荐使用,已经被淘汰了。
  • RabbitMQ 在吞吐量方面虽然稍逊于 Kafka、RocketMQ 和 Pulsar,但是由于它基于 Erlang 开发,所以并发能力很强,性能极其好,延时很低,达到微秒级。但是也因为 RabbitMQ 基于 Erlang 开发,所以国内很少有公司有实力做 Erlang 源码级别的研究和定制。如果业务场景对并发量要求不是太高(十万级、百万级),那这几种消息队列中,RabbitMQ 或许是你的首选。
  • RocketMQ 和 Pulsar 支持强一致性,对消息一致性要求比较高的场景可以使用。
  • RocketMQ 阿里出品,Java 系开源项目,源代码我们可以直接阅读,然后可以定制自己公司的 MQ,并且 RocketMQ 有阿里巴巴的实际业务场景的实战考验。
  • Kafka 的特点其实很明显,就是仅仅提供较少的核心功能,但是提供超高的吞吐量,ms 级的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展。同时 Kafka 最好是支撑较少的 topic 数量即可,保证其超高吞吐量。Kafka 唯一的一点劣势是有可能消息重复消费,那么对数据准确性会造成极其轻微的影响,在大数据领域中以及日志采集中,这点轻微影响可以忽略这个特性天然适合大数据实时计算以及日志收集。如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。
       

 

 

标签:队列,JMS,基础,RabbitMQ,Kafka,消息,RocketMQ
From: https://www.cnblogs.com/cjhtxdy/p/17880569.html

相关文章

  • python的基础1
    基础笔记1.int转整数的时候不能转字符串:int('123'),这样会直接报错。但是使用flost的时候是可以转成小数的,但是也只能是由数字组合的字符串才可以,里面不能包含除了数字之外的所有的字符2.相除的时候,有小数点的是用/,不需要小数的时候使用//(小数点后的直接舍弃)3.全部转换为大写,判......
  • 【python基础之数据类型的内置方法】--- 数据类型的内置方法
    title:【python基础之数据类型的内置方法】---数据类型的内置方法date:2023-12-0120:54:06updated:2023-12-0620:30:00description:【python基础之数据类型的内置方法】---数据类型的内置方法cover:https://home.cnblogs.com/u/dream-ze/【一】八大基......
  • 第4章. 队列(Queue)
    队列(Queue)一、队列的基本概念队列是一种特殊的线性表,只能在头尾两端进行操作队尾(rear):只能从队尾添加元素,一般叫做enQueue,入队队头(front):只能从队头移除元素,一般叫做deQueue,出队先进先出的原则,FIRSTINFIRSTOUT,FIFO二、队列的接口设计intsize();//元素的数......
  • 2023-2024 20231313《计算机基础与程序设计》第十一周学习总结
    2023-202420231313《计算机基础与程序设计》第十一周学习总结作业速达作业课程班级链接作业要求计算机基础与程序设计第十一周学习总结作业内容计算机科学概论第15,16章《C语言程序设计》第10章并完成云班课测试,计算机网络,网络拓扑,云计算,网络安全,Web,HTML,CSS,Jav......
  • WhatsApp消息群发脚本编写代码分享
    随着社交媒体的普及,WhatsApp已经成为全球使用最广泛的聊天应用之一,它不仅方便用户之间进行实时沟通,还支持消息群发功能。通过编写WhatsApp消息群发脚本,我们可以自动化发送消息,提高工作效率,本文将分享一些基础源代码,帮助你了解如何编写WhatsApp消息群发脚本。一、了解WhatsAppAPI在......
  • DDR内存基础知识
    一、DDR基础知识1.几个频率(1)核心频率:真实运行频率。(2)倍增系数:DDR通过数据预取技术放大速率,每代ddr倍率是固定的,ddr=2,ddr2=4,ddr3=8,ddr4=8,ddr5=16(3)有效频率;厂商标注的频率,可以理解为数据传输速率。厂商也想逐步淡化其它频率的概念,只让我们记住有效频率。其实......
  • Rabbitmq队列
    rabbitmq消息中间件-消息队列异步开发语言erlang爱立信公司1.安装pythonrabbitMQmodule 1pip3installpika关闭防火墙1serviceiptablesstop关闭防火墙2.实现最简单的队列通信send端:1#send端2importpika34credentials=pika.PlainCredent......
  • 2023-2024-1 20231320 《计算机基础与程序设计》第十周学习总结
    2023-2024-120231320《计算机基础与程序设计》第十周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2022-2023-1计算机基础与程序设计第十周作业)这个作业的目标<自学《计算机基础与......
  • 基础介绍
    基本概念简介Kafka是由Apache开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。对于像Hadoop一样的日志数据和离线分析系......
  • 拒绝算法推荐,使用rss订阅消息与新闻!
    算法推荐的弊端就不说了借用RSSHub镜像网站如果你实在不会,又或者觉得麻烦,那你还可以搭其他网友的“便车”。我收集了 9 个公开的 RSShub镜像网站,它们用的都是用自己的服务器,所以在流量方面也不会有问题。服务器1 :https://rsshub.rssforever.com 服务器2 :https://rss......