速通RabbitMQ的五种常见消费模型

目录

  • 引言
  • 1. 简单队列模型(Simple Queue Model)
    • 优缺点及适用场景
    • 代码示例
  • 2. 工作队列模型(Work Queue Model)
    • 优缺点及适用场景
    • 代码示例
  • 3. 发布/订阅模型(Publish/Subscribe Model)
    • 优缺点及适用场景
    • 代码示例
  • 4. 路由模型(Routing Model)
    • 优缺点及适用场景
    • 代码示例
  • 5. 主题模型(Topic Model)
    • 优缺点及适用场景
    • 代码示例

引言

RabbitMQ是一个流行的消息队列中间件,它确保了不同应用程序之间的可靠消息传递。由于其高性能、轻量级和灵活性,RabbitMQ在许多应用程序中被广泛使用,例如异步任务处理、负载均衡、事件通知 等。在RabbitMQ中,消息的生产和消费是通过一系列的消费模型来管理的。每个消费模型都有不同的特点和应用场景,可以帮助开发人员构建高效的消息传递系统。本文将深入介绍RabbitMQ的五种常见消费模型,包括简单队列模型、工作队列模型、发布/订阅模型、路由模型和主题模型,删除线格式 并探讨它们各自的优缺点和适用场景。希望此文能帮助你更好地理解RabbitMQ消费模型并在实践中达到更好的效果。

在这里插入图片描述

1. 简单队列模型(Simple Queue Model)

简单队列模型是最基础的RabbitMQ模型。它包括单个生产者和单个消费者。生产者将消息发送到一个队列中,然后消费者从队列中读取消息并处理。这种模式不适用于多个消费者或消息广播,因为一旦消息被一个消费者接收,它就会从队列中删除。

优缺点及适用场景

  • 优点

实现简单,易于理解和部署。
可以提供一些基本的可靠性保证,例如消息确认和持久化。

  • 缺点

不支持并发消费。
不支持多个消费者共同消费一个队列。

  • 适用场景

单生产者和单消费者之间的点对点通信。
系统中只有一个进程或线程可以处理消息。
例如,一个后端服务向另一个后端服务发送消息,或者一个客户端将任务发送给服务器

代码示例

Connection connection = factory.newConnection();
Channel channel = connection.createChannel();// 声明队列
String queueName = "simpleQueue";
channel.queueDeclare(queueName, false, false, false, null);// 发送消息
String message = "Hello, RabbitMQ!";
channel.basicPublish("", queueName, null, message.getBytes("UTF-8"));
System.out.println("Sent message: " + message);// 接收消息
boolean autoAck = true;
Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println("Received message: " + message);}
};
channel.basicConsume(queueName, autoAck, consumer);

2. 工作队列模型(Work Queue Model)

工作队列模型允许多个消费者协同地从一个队列中接收、处理和分发消息。在这种模型中,消息被平均分配给不同的消费者。当一个消费者正在处理一个消息时,它不能接收新的消息。这确保了公平的分布和消费,同时在不同的消费者之间进行负载均衡

优缺点及适用场景

  • 优点

支持多个消费者处理同一个队列中的消息。
消费负载均衡,每个消费者最多处理一条消息。
通过设置并发数,可以实现更高的消息吞吐量。

  • 缺点

没有消息路由的动态性。
如果有消息时,所有的消费者都会在接收到该消息后进行同样的处理,无法根据具体情况进行消息的划分,而且消息被平均分配,不能根据消息的重要性和紧急性进行处理。

  • 适用场景

需要在多个工人之间分配任务的应用程序,例如异步任务处理或负载均衡。

代码示例

// 创建连接和通道
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();// 声明队列
String queueName = "workQueue";
channel.queueDeclare(queueName, false, false, false, null);// 发送消息
String message = "Hello, RabbitMQ!";
channel.basicPublish("", queueName, null, message.getBytes("UTF-8"));
System.out.println("Sent message: " + message);// 设置每个消费者在接收到确认前只能处理一条消息
channel.basicQos(1);// 接收消息
boolean autoAck = false;
Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println("Received message: " + message);// 手动发送消息确认channel.basicAck(envelope.getDeliveryTag(), false);}
};
channel.basicConsume(queueName, autoAck, consumer);

3. 发布/订阅模型(Publish/Subscribe Model)

发布/订阅模型允许一个生产者向多个消费者广播一条消息。在这种模型中,生产者将消息发送到一个交换机中,然后这个交换机将消息路由到所有与之绑定的队列。每个队列对应一个消费者,可以独立地处理这个队列中的消息。

优缺点及适用场景

  • 优点

支持广播式消息发布和订阅。
与其他应用程序解耦,生产者和消费者不需要知道对方的存在和细节。

  • 缺点

不支持消息路由的动态性。
没有消息过滤机制,每个订阅者都会收到所有的消息。

  • 适用场景

需要将消息通知多个消费者的应用程序,例如事件通知或新闻发布。

代码示例

// 创建连接和通道
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();// 声明交换器
String exchangeName = "publishSubscribeExchange";
channel.exchangeDeclare(exchangeName, "fanout");// 创建随机队列并绑定到交换器
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, exchangeName, "");// 发送消息
String message = "Hello, RabbitMQ!";
channel.basicPublish(exchangeName, "", null, message.getBytes("UTF-8"));
System.out.println("Sent message: " + message);// 接收消息
boolean autoAck = true;
Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println("Received message: " + message);}
};
channel.basicConsume(queueName, autoAck, consumer);

4. 路由模型(Routing Model)

路由模型允许生产者根据路由键将消息发送到指定的队列中。在这种模型中,交换机会将消息路由到与它所绑定的队列匹配的路由键的队列中。消费者可以从这些队列中接收和处理消息。

优缺点及适用场景

  • 优点

支持基于路由键的动态消息路由。
可以根据消息的类型、内容和优先级选择发送给哪个队列,支持消息的定向投递。

  • 缺点

需要提前配置好交换机和队列之间的绑定关系。
支持的路由逻辑有限,只能通过路由键进行匹配。

  • 适用场景

需要根据某些特定属性或条件将消息路由到相应队列的应用程序,例如日志记录或按优先级处理任务。

代码示例

// 创建连接和通道
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();// 声明交换器
String exchangeName = "routingExchange";
channel.exchangeDeclare(exchangeName, "direct");// 绑定队列到交换器,并指定路由键
String queueName = "routingQueue";
String routingKey = "important";
channel.queueDeclare(queueName, false, false, false, null);
channel.queueBind(queueName, exchangeName, routingKey);// 发送消息
String message = "Important message!";
channel.basicPublish(exchangeName, routingKey, null, message.getBytes("UTF-8"));
System.out.println("Sent message: " + message);// 接收消息
boolean autoAck = true;
Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println("Received message: " + message);}
};
channel.basicConsume(queueName, autoAck, consumer);

5. 主题模型(Topic Model)

主题模型是路由模型的扩展,它可以实现更灵活的消息路由和分发。在这种模型中,生产者可以使用通配符匹配来匹配路由键。交换机会将消息路由到与它所绑定的队列匹配的路由键的队列中。消费者可以从这些队列中接收和处理消息。

优缺点及适用场景

  • 优点

支持更灵活、更具体的消息路由和过滤。
可以使用通配符匹配路由键,实现更复杂的消息匹配和分发。

  • 缺点

高度配置化和复杂化,需要额外配置主题模式下的应用程序逻辑。
在一些场景下,通配符匹配路由键可能会导致性能问题。

  • 适用场景

需要根据消息内容的模式将消息路由到不同队列的应用程序,例如按标签或关键字分发和处理不同的任务。

代码示例

// 创建连接和通道
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();// 声明交换器
String exchangeName = "topicExchange";
channel.exchangeDeclare(exchangeName, "topic");// 绑定队列到交换器,并指定匹配模式
String queueName = "topicQueue";
String routingKeyPattern = "com.example.*";
channel.queueDeclare(queueName, false, false, false, null);
channel.queueBind(queueName, exchangeName, routingKeyPattern);// 发送消息
String routingKey = "com.example.news";
String message = "Important news!";
channel.basicPublish(exchangeName, routingKey, null, message.getBytes("UTF-8"));
System.out.println("Sent message: " + message);// 接收消息
boolean autoAck = true;
Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println("Received message: " + message);}
};
channel.basicConsume(queueName, autoAck, consumer);

总的来说,不同的消息队列模型适用于不同的场景和需求。简单队列模型适合于点对点通信;工作队列模型适用于任务分配和负载均衡;发布/订阅模型适用于消息广播和解耦;路由模型适用于动态消息路由和选择性投递;主题模型适用于灵活的消息路由和过滤。根据具体的业务需求和系统架构,合理选择适用的消息队列模型可以提高系统的可扩展性、可靠性和性能。
如果您还有其他问题,我将非常乐意回答!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/101814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

08. 机器学习- 线性回归

文章目录 线性回归 LINEAR REGRESSION 从本次课程开始,大部分时候我将不再将打印结果贴出来了,因为太占用篇幅。小伙伴可以根据我的输出执行敲一遍代码来进行学习和验证。 同样是为了节省篇幅,我也不会再一行行那么仔细的解释代码了&#xff…

Springcloud中间件-----分布式搜索引擎 Elasticsearch

该笔记是根据黑马程序员的课来自己写了一遍的,b站有对应教程和资料 第一部分 第二部分 第三部分 预计看完跟着练习5小时足够 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能&#xff…

提升战斗力!吃鸡行家分享顶级游戏干货,助你轻松拿下绝地求生

作为吃鸡行家,我们都知道,在绝地求生中提高战斗力至关重要。今天我来分享一些独特的干货,帮助你成为顶级的吃鸡玩家,并分享一些方便吃鸡作图、装备皮肤库存展示和查询的技巧。 首先,让我们来谈谈绝地求生作图工具推荐。…

网络架构介绍

1 网络 7 层架构 7 层模型主要包括: 1. 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由 1、0 转化为电流强弱来进行传输,到达目的地后在转化为1、0…

深度学习DAY3:激活函数

激活函数映射——引入非线性性质 h (Σ(W * X)b) yσ(h) 将h的值通过激活函数σ映射到一个特定的输出范围内的一个值,通常是[0, 1]或[-1, 1] 1 Sigmoid激活函数 逻辑回归LR模型的激活函数 Sigmoid函数&#xff0…

深度学习_2_数据处理

import os是一个Python的内置模块,用于与操作系统进行交互。通过导入os模块,你可以使用其中提供的函数和方法来执行各种与操作系统相关的任务。 import osos.makedirs(os.path.join(.., date), exist_okTrue)##将创建一个名为date的文件夹,位…

LeetCode【279】完全平方数

题目: 思路: https://www.acwing.com/solution/leetcode/content/114877/ 1、给定数字,是由若干个完全平方数组合而成,求使用的最小的完全平方数的个数,如果这些完全平方数已知,则完全等同于百元百鸡问题…

VIM指令

vim的工作模式 vim一般有6种工作模式。 普通模式:使用vim打开一个文件时默认模式,也叫命令模式,允许用户通过各种命令浏览代码、滚屏等操作。 插入模式:也可以叫做编辑模式,在普通模式下敲击 i 、a 或 o 就进入插入模…

UE5.3.1 无法创建C++ 工程问题解决方法

UE5.3.1 创建C工程提示DONET问题,直接下载最新版本的NET8.0的SDK安装即可解决! 下载地址:下载 .NET 8.0 SDK (v8.0.100-rc.2) - Windows x64 Installer

Java基于SpringBoot的高校招生系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 简介系统设计思路1 数据库设计2 系统整体设计 系统详细设计1系统功能模块2. 管理员功能模块3学生…

camera bringup介绍

目录 camera bringup需要做什么 camera硬件包括 camera硬件连接关系 camera使用的通信接口 camera sensor cmos sensor 色彩滤镜 sensor输出的分辨率 曝光控制-快门 曝光控制-曝光时间 曝光时间如何控制 曝光控制-帧率 曝光控制-增益 手动曝光 手动设置曝光-长曝…

bootz启动 Linux内核过程总结

一. bootz启动Linux uboot 启动 Linux内核使用bootz命令。当然还有其它的启动命令,例如,bootm命令等等。 前面几篇文章分析 bootz命令启动 Linux内核的过程中涉及的几个重要函数。 bootz启动 Linux内核过程中涉及的全局变量images_凌肖战的博客-CSDN博…

springboot json在线转换为实体类

json字符串映射到一个实体类。 这里有一个在线转换工具 http://www.bejson.com/json2javapojo/new/ 截图如下:

html与css知识点

html 元素分类 块级元素 1.独占一行,宽度为父元素宽度的100% 2.可以设置宽高 常见块级元素 h1~h6 div ul ol li dl dt dd table form header footer section nav article aside 行内元素 1.一行显示多个 2.不能设置宽高,宽高由元素内容撑开 常见行内…

Yocto Project 编译imx-第1节(下载和编译)

Yocto Project 编译imx-第1节(下载和编译) 前言说明参考文章版本说明Ubuntu 系统说明和建议必备软件安装设置Git用户名和密码解决git报错使用FastGithub 获取repo获取Yocto项目设置Yocto源获取Yocto版本(https://source.codeaurora.org废弃&a…

记录用命令行将项目打包成war包

记录用命令行将项目打包成war包 找到项目的pom.xml 在当前路径下进入cmd 输入命令 mvn clean package 发现报错了 Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project MMS: Error assembling WAR: webxml attribute is req…

排序算法-快速排序法(QuickSort)

排序算法-快速排序法(QuickSort) 1、说明 快速排序法是由C.A.R.Hoare提出来的。快速排序法又称分割交换排序法,是目前公认的最佳排序法,也是使用分而治之(Divide and Conquer)的方式,会先在数…

统计子岛屿的数量

统计子岛屿 题目描述 给你两个 m x n 的二进制矩阵 grid1 和 grid2 ,它们只包含 0 (表示水域)和 1 (表示陆地)。一个 岛屿 是由 四个方向 (水平或者竖直)上相邻的 1 组成的区域。任何矩阵以外…

【STM32单片机】防盗报警器设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器,使用按键、动态数码管、蜂鸣器、指示灯、热释电人体红外传感器等。 主要功能: 系统运行后,默认处于布防状态,D1指示灯…

Excel 规范录入数据

文章目录 录入日期录入百分比 快捷键: tab:向右切换单元格 enter:向下切换行 shift tab:向左切换单元格 shiftenter:向上切换行 录入日期 输入今天的日期的快捷键:Ctrl ; 输入当时的时间的快捷键&a…