【消息队列高手课】- 基础篇

【消息队列高手课】- 基础篇

消息队列都有哪些选择:

  1. RabbitMQ – 特色:Exchange模块,开箱即用
  2. RocketMQ – 特色:低延迟和金融级的稳定性
  3. Kafka – 特色:海量,异步批量,”先攒一波再一起处理”
  4. ActiveMQ:队列模型和发布-订阅模型都支持
  5. ZeroMQ
  6. Pulsar – 特色:存储与计算分离

消息模型的种类?

1.队列模型

队列:先进先出的线性表。因为这个特性故而消息必须严格有序。按照什么顺序写到队列中就按照什么顺序读出去。

2.发布 – 订阅模型(Publish-Subscribe Pattern)

如果有多个消息者怎么办?使用发布-订阅模型解决这个问题

【消息队列高手课】- 基础篇

在发布-订阅模型中,消息的发送方称为发布者,消息的接收方称为订阅者,服务端存放消息的容器称为主题。发布者将消息发布到主题中,订阅者在接收消息之前需要先”订阅主题”,”订阅”在这里既是一个动作,同时,也可以认为是主题在消费的时的一个逻辑副本,每份订阅中,订阅者都能接收主题的所有消息。

队列模型和发布-订阅模型的最大区别是:一份消息数据能不能被消费多次。

RabbitMQ 的消息模型

RabbitMQ还是在坚持使用队列模型,Exchange模块放置在生产者和队列之间,生产者不关系发给哪个队列,而是把消息发送给Exchange模块,由Exchange上配置的策略决定将消息投递到哪些队列中。

【消息队列高手课】- 基础篇

同一份消息如果要被多个消费者消费,就需要配置Exchange将消息放入对个队列,每个队列中都会有一份完整的数据,为消费者提供服务

RocketMQ 的消息模型

RocketMQ使用的是标准的发布-订阅模型,但是,在 RocketMQ 也有队列(Queue)这个概念,队列的作用是什么呢?这里先说下消息队列的消费机制

消息队列的消费机制:

“请求 – 确认”机制,确保消息不会在传递过程中由于网络或者服务器故障丢失。

做法:在生产端,生产者先将消息发送给服务端,也就是Broker,服务端在收到消息并将消息写入主题或者队列后,会给生产者发送确认的响应。如果生产者没有收到服务端的确认或者收到失败额响应,则会重新发送消息;在消费端,消费者在收到消息并完成自己的业务逻辑后也会给服务端发送消费成功的确认,服务端只有收到消息确认后,才认为一条消息被成功消费,否则他就给消费者重新发送消息,直到对应的消费成功确认。这个机制保证了消息传递过程中的可靠性。

如何通过水平扩展消费者数量来提升消费端总体的消费性能?

每个主题包含多个队列,通过队列来实现多实例并行生产和消费。RocketMQ只保证队列上消息的有序性,主题层面是无法保证消息的严格顺序的。

RocketMQ中订阅者的概念是通过 消费组(Consumer Group) 来体现的。每个消费组消费主题中的一份完整消息,不同消费组之前消费进度彼此不受影响。消费组中包含多个消费者,一条消息只被一个消费者消费。

消费完的消息并不会立即删除,RocketMQ在队列中维护了一个消费位置(Consumer Offset)

Kafka的消息模型

Kafka的消息模型跟Rocket是完全一样的,也是发布订阅模型,只是 Kafka中的队列的名字为分区

另:消费者组和队列数没有关系。队列数量可以根据数据量和消费速度配置。

RocketMQ的分布式事务处理流程:

对于第4步中,如果commit失败,kafka的解决方案为直接抛出异常。

事务:4 个属性(ACID):原子性、一致性、隔离性、持久性

MQTT协议-三种传递消息时能够提供的服务质量标准:

  • At most once: 至多一次
  • At least once: 至少一次。
  • Exactly once:恰好一次。

预防消息积压如何处理:

  1. 发送端:增加每次发送消息的批量大小,增加并发
  2. 消费端:优化消费业务逻辑;水平扩容;增加消费端的并发数

特别需要注意的一点是,在扩容 Consumer 的实例数量的同时,必须同步扩容主题中的分区(也叫队列)数量,确保 Consumer 的实例数和分区数量是相等的。

课后题:

消费组和消息位置有关系,消费者和消费位置是没有关系的

如何实现单个队列的并行消费:

JMQ的实现思路:

当队列中有10条消息,对应的编号是0-9,当前的消费位置是5。同事来了3个请求来拉取消息,把编号为5、6、7的消息分别为3个消费者,每人一条。过了一段时间,3个消费成功的响应回来了,消费位置更为8.

若是6、7回来了,5响应一直回不来,5就是一个消息空洞。为了避免5把这个队列卡住,先把5这个消息,复制到一个特殊重试队列中,然后依然把消费位置更新为8,继续消费。再有消费者来拉消息,优先把重试队列中的消息给消费者。

并行消费原理:

开启并行消费后,队列是否上锁,由单队列最大并行数来控制

当客户端拉取消息时,服务端计算此队列上没有ack的消息总数,如果总数没有超过单队列的最大并行数,可以从后续位置积蓄拉取消息。

Original: https://www.cnblogs.com/fengtingxin/p/14243268.html
Author: 冯廷鑫
Title: 【消息队列高手课】- 基础篇

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/589262/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java之线程池深度剖析

    1.线程池的引入引入的好处:1)提升性能。创建和消耗对象费时费CPU资源2)防止内存过度消耗。控制活动线程的数量,防止并发线程过多。使用条件:假设在一台服务器完成一项任务的时间为T…

    Java 2023年5月29日
    072
  • SSM整合(Spring+SpringMVC+Mybatis)

    IDEA创建一个webapp工程 选择骨架创建 1、Spring整合Mybatis 让Spring容器去管理 SqlSessionFactory对象 让Spring容器去创建并管理…

    Java 2023年6月8日
    063
  • Tomcat线程池的深入理解

    1.工作机制: Tomcat启动时如果没有请求过来,那么线程数(都是指线程池的)为0; 一旦有请求,Tomcat会初始化minSpareThreads设置的线程数; 2.线程池作用…

    Java 2023年5月30日
    077
  • Sonarquber-docker安装教程

    本文安装 Sonarqube是基于docker-compose的安装教程,安装 Sonarqube前需安装docker和docker-compose 因为sonarqube采用el…

    Java 2023年6月8日
    0114
  • flink dataStream count

    背景: 批(有界流)模式下,需要统计处理总数据条数如果使用 DataSetApi,可通过 .count()直接获取:本文主要描述 DataStream如何获取总条数 思路: 当 D…

    Java 2023年6月16日
    075
  • java常见面试题及答案

    1.什么是Java虚拟机?为什么Java被称作是”平台无关的编程语言”? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编…

    Java 2023年5月29日
    046
  • Java AbstractQueuedSynchronizer(AQS)

    AbstractQueuedSynchronizer 为 java.util.concurrent.locks 包下的一个抽象类,简称 AQS( 抽象队列同步器)。 并发包(JUC…

    Java 2023年5月29日
    0100
  • 设计模式——单例模式

    引言 今天来谈谈设计模式中的单例模式,温故知新,以免生疏。 软件设计领域的四位世界级大师Gang Of Four (GoF):Erich Gamma,Richard Helm,Ra…

    Java 2023年6月8日
    0104
  • JavaWeb开发——软件国际化(动态元素国际化)

    软件国际化的第二个部分,就是动态元素国际化。 数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。Jav…

    Java 2023年5月29日
    072
  • Springboot+MDC+traceId日志中打印唯一traceId

    原文:https://www.jb51.net/article/225488.htm 目录 为什么需要这个traceId 2.通过MDC设置traceId 2.1 使用filter…

    Java 2023年5月30日
    083
  • 回溯法实现全排序Ⅰ

    给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: &…

    Java 2023年6月16日
    081
  • dubbo和springCloud

    Dubbo 高性能的java RPC框架 架构 init:初始化 async:异步 sync同步 0:需要容器启动例如Tomcat 1:注册ip端口以及一些东西到注册中心 2:订阅…

    Java 2023年6月13日
    061
  • 50道Redis高频面试题(13-20)

    十三、线上Redis持久化策略一般如何设置 如果对性能要求较高,在master最好不要做持久化,可以在某个slave开启aof备份数据,策略设置为每秒同步一次即可。 十四、一次线上…

    Java 2023年6月9日
    062
  • Error: Invalid or corrupt jarfile SpringBootTemplate.jar

    当在尝试将SpringBoot打包成为Jar文件, 丢到linux服务器去运行的时候, 尝试在windows自带的CMD窗口命令行中运行jar文件的时候, 遇到了这样的问题. 错误…

    Java 2023年5月29日
    064
  • Java项目启动时执行指定方法的几种方式

    Java项目启动时执行指定方法的几种方式 1.使用 @PostConstruct,作用于方法上面。 @Component public class PostConstruct { …

    Java 2023年5月29日
    092
  • SpringCloud微服务实战——搭建企业级开发框架(三十四):SpringCloud + Docker + k8s实现微服务集群打包部署-打包配置

    SpringCloud微服务包含多个SpringBoot可运行的应用程序,在单应用程序下,版本发布时的打包部署还相对简单,当有多个应用程序的微服务发布部署时,原先的单应用程序部署方…

    Java 2023年6月9日
    054
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球