RabbitMQ 入门(二)基本结构和消息模型

news2024/11/25 8:33:18

一、RabbitMQ的基本结构、角色和消息模型

MQ的基本结构:

RabbitMQ中的一些角色:

- publisher:生产者
- consumer:消费者
- exchange个:交换机,负责消息路由
- queue:队列,存储消息
- virtualHost:虚拟主机,隔离不同租户的exchange、queue、消息的隔离

RabbitMQ官方提供了5个不同的Demo示例,对应了不同的消息模型:

1.Basic Queue(基本消息队列)  简单队列模型  ‌简单模式‌:在这种模式下,生产者将消息发送到队列,消费者监听队列并消费消息。消息被消费后,会自动从队列中删除。这种模式的优点是简单易懂,但缺点是如果消费者处理消息的速度慢,可能会导致消息处理不及时。

2.Work queues(工作消息队列) ,也被称为(Task queues),任务模型。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息。  工作队列模型 ,一个生产者将消息分发给多个消费者。当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多,无法及时处理。此时就可以使用work 模型,多个消费者共同处理消息处理,速度就能大大提高了。‌工作模式‌:在这种模式下,多个消费者竞争同一个队列中的消息,谁先获取到消息谁就处理该消息。这种模式适用于处理高并发的情况,但需要注意避免多个消费者处理同一消息的问题。

发布订阅(Publish、 Subscribe) ,又根据交换机类型不同分为三种:

Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!

3.Fanout Exchange(广播)
发布/订阅模型 ,生产者发布消息,多个消费者同时收取


4.Topic Exchange(主题 )Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key`的时候使用通配符!主题模式‌:主题模式是路由模式的一种变体,它使用通配符来匹配路由键,使得消息可以发送到多个队列中。这种模式增加了消息的灵活性,但也需要小心设计通配符规则以避免不必要的消息匹配。

5.Direct Exchange(路由 )

‌路由模式‌:在这种模式下,生产者将消息发送到交换机,交换机根据路由键将消息路由到特定的队列中,只有绑定了相应路由键的队列才能接收消息。这种模式适用于需要根据不同业务场景处理不同消息的情况。

 

二、入门案例 (基本消息队列)

简单队列模式的模型图:

官方的HelloWorld是基于最基础的消息队列模型来实现的,只包括三个角色:

- publisher:消息发布者,将消息发送到队列queue
- queue:消息队列,负责接受并缓存消息
- consumer:订阅队列,处理队列中的消息

工程包括三部分:

- mq-demo:父工程,管理项目依赖
- publisher:消息的发送者
- consumer:消息的消费者

基本消息队列的消息发送流程:

1. 建立connection

2. 创建channel

3. 利用channel声明队列

4. 利用channel向队列发送消息

publisher代码如下:

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Test;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class PublisherTest {
    @Test
    public void testSendMessage() throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("192.168.150.101");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("rbmq");
        factory.setPassword("123456");
        // 1.2.建立连接
        Connection connection = factory.newConnection();

        // 2.创建通道Channel
        Channel channel = connection.createChannel();

        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.发送消息
        String message = "hello, rabbitmq!";
        channel.basicPublish("", queueName, null, message.getBytes());
        System.out.println("发送消息成功:【" + message + "】");

        // 5.关闭通道和连接
        channel.close();
        connection.close();

    }
}

基本消息队列的消息接收流程:

1. 建立connection

2. 创建channel

3. 利用channel声明队列

4. 定义consumer的消费行为handleDelivery()

5. 利用channel将消费者与队列绑定

consumer代码如下:

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class ConsumerTest {

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("192.168.150.101");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("rbmq");
        factory.setPassword("123456");
        // 1.2.建立连接
        Connection connection = factory.newConnection();

        // 2.创建通道Channel
        Channel channel = connection.createChannel();

        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.订阅消息
        channel.basicConsume(queueName, true, new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                // 5.处理消息
                String message = new String(body);
                System.out.println("接收到消息:【" + message + "】");
            }
        });
        System.out.println("等待接收消息。。。。");
    }
}

演示测试成功。

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

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

相关文章

初步认识torch自定义算子

此篇为PyTorch 自定义算子:复现CPU和CUDA版的二维卷积的代码详解 这篇是为了展示setup在构建简单的cpp算子的使用 1.环境配置 整体结构如下图所示 pytorch_cpp_helper.hpp中准备了CPU版卷积需要的头文件 pytorch_cuda_helper.hpp和common_cuda_helper.hpp是cuda…

板级支持包构建1

开发板:STM32h743xi 编程软件:Keil 项目:GPIO外设操作(彩色LED灯) 学习打卡:Day2 学习地址:【野火】STM32 HAL库开发实战指南 教学视频 手把手教学STM32全系列 零基础入门CubeMXHAL库&#xff0…

jQuery——自定义jQuery插件

1、扩展jQuery(将$看成对象)的工具方法 $.extend(object) min(a,b) 返回较小的值 max(c,d) 返回较大的值 leftTrim() 去掉字符串…

9.4 栅格图层符号化山体阴影渲染

9.4 栅格图层符号化山体阴影渲染-CSDN博客 目录 前言 山体阴影渲染 QGis设置为山体阴影 二次开发代码实现山体阴影 总结 前言 介绍栅格图层数据渲染之山体阴影渲染说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps 山体阴影渲染 以“3420C_2010_327_…

leetcode二叉树(一)-理论基础

本节主要参考代码随想录:代码随想录 题目分类 二叉树的种类 满二叉树 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。 这棵二叉树为满二叉树,也可以说深…

产品设计——应用架构

我的理解应用架构是业务架构的落地,微服务架构下平台的应用架构设计,实质是根据业务来明确应用微服务的边界。因此业务不同,应用架构图也不同。但是基本框架应该相差不大。 其划分原则莫过于高内聚、低耦合。这个跟接口设计是一致的。我们总是…

MySQL数据库安装手册

MySQL数据库安装手册 MySQL数据库的下载与安装 在上一小节我们已经简单了解了数据库与一些相关概念 没看上一节的同学戳这里 接下来我们首先需要学会如何下载和安装数据库 1 MySQL数据库的版本 目前MySQL官网为我们提供了两个版本,一个是社区版本,…

<<迷雾>> 第11章 全自动加法计算机(4)--带地址译码器的内存模型 示例电路

地址译码器 info::操作说明 书中没有给出具体的实现电路. 这里根据电路特性采用自定义逻辑实现. 关于 “自定义逻辑”, 可参考此链接的说明: https://book.xiaogd.net/usage-of-circuitjs/circuitjs-custom-logic.html 这里本质上就是利用两个 2-4 译码器分别控制读和写. 注: 在…

Linux进程控制(3)(进程程序替换2 -- 微型shell)

目录 补充 一.引入 二.自助微型shell 1:输出一个命令行 2:获取用户命令字符串 3:命令行字符串的分割 4:先试着执行一下命令 5:关键点:需要在执行命令前检查是否为内建命令 其他: 三&…

JSONAJAX

JSON&&AJAX 一、JSON 1.1 json简介 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,而且很多语言都提供了对 json 的支持(包括 C, C, C#, J…

常用的devops工具集成方法

常用的devops工具集成方法涵盖了软件开发和运维的各个方面,从版本控制到自动化构建、测试、部署和监控。这些工具的有效集成可以帮助团队提高协作效率,减少沟通障碍,实现快速、高质量的软件交付。以下是对这些工具集成方法的具体介绍&#xf…

双核DSP芯片的内存管理

总体框图 总的来说,在这款DSP芯片上,RAM分成了四种不同的类型: 专用RAM: CPU专用的内存,其他主机无法访问。 双核共享RAM: CLA和CPU共享内存,双方都可以对内存地址进行访问 MSGRAM: CLA和CPU之间传递数据的…

【自动驾驶汽车通讯协议】I2C(IIC)总线通讯技术详解

文章目录 0. 前言1. I2C简介2.I2C的工作原理2.1 硬件要求:2.2 半双工通信: 3. 通信时序4. 其他特性4.1 通信速率4.2 抗干扰措施4.3 注意事项 5. 在自动驾驶汽车中的应用5.1 I2C操作模式5.2 I2C的用途 6. 总结 0. 前言 按照国际惯例,首先声明&…

Spring Boot知识管理系统:创新与实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常适…

【含开题报告+文档+PPT+源码】基于人脸识别的课堂考勤系统的设计与实现

开题报告 随着科技的不断发展,人脸识别技术已经逐渐渗透到各个领域,包括教育领域。传统的课堂考勤方式通常依赖于学生签到或教师手动记录,这种方式存在着许多不足之处,例如容易出现人为错误、耗费时间和资源等。为了解决这些问题…

机器学习:强化学习中的探索策略全解析

引言 在机器学习的广阔领域中,强化学习(Reinforcement Learning, RL)无疑是一个充满魅力的子领域。它通过智能体与环境的交互,学习如何在特定的任务中做出最优决策。然而,在这个过程中,探索(ex…

linux 配置ssh免密登录

一、 cd /root/.ssh/ #不存在就创建mkdir /root/.ssh ssh-keygen #连续按4个回车 ll二、将公钥发送到目标服务器下 #公钥上传到目标服务器 ssh-copy-id root192.168.31.142 #回车完也是要输入密码的 #测试一下免密登录: ssh root192.168.31.142 成功

二、后台管理系统布局菜单可拖动

前两天产品提出了一个需求,说后台管理系统的左边菜单的名称字数过多,遮挡了。希望能让客户能够看到全部的名称,给左侧菜单增加一个可拖动的功能,经过我的研究,这个功能最终也做出来了,先看效果,…

IDEA之手动添加作者信息

IDEA不能像eclipse一样,直接使用/**注释快捷键在类上带出作者信息。 解决方案: 手动添加自定义作者注释快捷键 /*** Author: TroubleBoy* Date: $DATE$* Description: TODO*/ 6.编辑日期变量,设置变量DATE的Expression为date() 7.应用Java…

Nacos的相关资料

目录 Nacos的Mysql文件: custom.env文件: 执行的Docker命令: 从 GitHub 官方仓库下载 Nacos:https://github.com/alibaba/nacos Nacos的Mysql文件: -- --------------------------------------------------------…