首页 > 其他分享 >RabbitMQ 入门(二)基本结构和消息模型

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

时间:2024-10-13 10:43:17浏览次数:7  
标签:入门 队列 模型 factory RabbitMQ 路由 消息 import channel

一、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("等待接收消息。。。。");
    }
}

 

演示测试成功。

标签:入门,队列,模型,factory,RabbitMQ,路由,消息,import,channel
From: https://www.cnblogs.com/kongsq/p/18461970

相关文章

  • HTML入门教程一口气讲完!(下)\^o^/
    HTML表单HTML 表单和输入HTML表单用于收集不同类型的用户输入。在线实例创建文本字段(Textfield)本例演示如何在HTML页面创建文本域。用户可以在文本域中写入文本。创建密码字段本例演示如何创建HTML的密码域。(在本页底端可以找到更多实例。)HTML表单......
  • 三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
    本文深入探讨Transformer模型中三种关键的注意力机制:自注意力、交叉注意力和因果自注意力。这些机制是GPT-4、Llama等大型语言模型(LLMs)的核心组件。通过理解这些注意力机制,我们可以更好地把握这些模型的工作原理和应用潜力。我们不仅会讨论理论概念,还将使用Python和PyTorch从零开......
  • 开源呼叫中心:大模型与在线客服
    FreeIPCC开源呼叫中心:大模型与在线客服:重塑客户服务的新篇章在当今数字化时代,客户服务已成为企业竞争的关键要素之一。随着人工智能技术的飞速发展,大模型(LargeLanguageModels,LLMs)正在逐步改变在线客服的面貌,为企业与客户之间的沟通搭建起更为高效、智能的桥梁。大模型,以......
  • 关于matlab灰箱模型的应用及代码
    灰箱模型(Grey-BoxModel)是指在建模过程中,我们对系统的内部结构有一定的了解,但信息不完全充分。这种模型结合了白箱模型(系统内部结构完全已知)和黑箱模型(系统内部结构完全未知)的特点。在MATLAB中,灰箱模型的估计通常涉及到系统的物理规律,并通过实验数据来估计模型中的未知参数。......
  • RabbitMQ简介及安装类
    RabbitMQ概述-MQ介绍RabbitMQ是一个开源的消息代理和队列服务器,它支持多种消息协议,并且可以轻松地与多种编程语言和框架集成。RabbitMQ是使用Erlang语言编写的,因此它具有高并发和高可用性的特点。以下是RabbitMQ的一些关键特性和概念消息代理(MessageBroker)RabbitMQ充当消......
  • Python从0到100(六十三):Python OpenCV-入门基础知识
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......
  • datawhale-大模型攻防比赛实践-第一次行动
    最近刚好是在写智能信息安全的教程,最后一章准备讲内容安全,里面有一节探讨大模型安全的内容,刚好可以拿比赛的内容当案例。首先,可以通过modelscope平台获得GPU使用权限。然后你就可以跑baseline了我这里试着跑了一下,如果是GPU版本就比较流畅,CPU会被卡死。但是呢,一天就只能提交一次......
  • Web前端开发入门学习笔记之CSS 39-40 --新手超级友好版- 文本颜色字体篇
       Foreword写在前面的话: 大家好,我是一名刚开始学习HTML的新手。这篇文章是我在学习html过程中的一些笔记和心得,希望能和同样在学习HTML的朋友们分享。由于我的知识有限,文章中可能存在错误或不准确的地方,欢迎大家在评论区提出建议和指正。我非常期待大家的反馈,以便我能......
  • 机器学习中的模型设计与训练流程详解
    目录前言1.模型设计1.1数据特性分析1.2计算资源限制1.3应用场景需求2.模型训练2.1训练集与验证集的划分2.2损失函数的选择2.3模型参数更新3.优化方法3.1梯度下降法3.2正则化方法4.模型测试4.1性能评估指标4.2模型的泛化能力5.模型选择5.1数据规模与......
  • 【面试经验】滴滴大模型面经
    本人只做点业务数据sft,做的更加偏向于粗糙业务,直接被拷打麻了,望佬看到可以给我指点一下现在有一个非常完备的sft指令集,你只能选择1w条,你如何选择数据来使模型的能力更加提升+完备?我们知道sft的时候尽量不要注入知识给模型,因为只希望sft可以提升模型的指令遵循的能力,注入......