RabbitMQ基础知识

一.什么是RabbitMQ

      RabbitMQ是一个开源的、高性能的消息队列系统,用于在应用程序之间实现异步通信。它实现了AMQP(Advanced Message Queuing Protocol)协议,可以在分布式系统中传递和存储消息。

     消息队列是一种将消息发送者和接收者解耦的机制。发送者将消息发送到队列中,然后接收者从队列中获取消息并进行处理。这种方式可以提高系统的可靠性、扩展性和灵活性。

    RabbitMQ使用生产者-消费者模型,其中生产者将消息发送到队列中,消费者从队列中获取消息并进行处理。它支持多种消息传递模式,如发布/订阅、路由、主题等。

    RabbitMQ具有很高的性能和可靠性,可以处理大量的消息,并具有故障恢复机制,以确保消息不会丢失。它还提供了可扩展性和灵活的配置选项,可以根据需要调整系统的吞吐量和延迟。

    RabbitMQ广泛应用于各种领域,如金融、电子商务、电信、物联网等,用于构建分布式系统、异步处理、事件驱动架构等。

二.RabbitMQ的作用是什么 

     RabbitMQ是一个消息队列中间件,其作用是实现异步通信。它可以在不同的应用程序之间传递消息,使得应用程序能够解耦,以提高系统的可伸缩性和可靠性。

   具体来说,RabbitMQ可以将消息发送到一个队列中,并立即返回给发送者,而不需要等待消息被处理。其他应用程序可以从该队列中获取消息,并进行处理。这种异步通信模式使得应用程序能够以自己的节奏进行处理,并且不会直接依赖于其他应用程序的可用性。

   RabbitMQ支持多种消息传递模式,包括点对点方式(one-to-one)、发布/订阅方式(one-to-many)和请求/应答方式(request/reply)。这些模式使得开发者能够根据特定的需求选择合适的模式来实现消息的传递。

   RabbitMQ的主要作用是提供一种可靠的异步通信机制,使得不同的应用程序能够进行解耦和高效地进行消息传递。

三.RabbitMQ的模型

      RabbitMQ的模型基于以下几个重要的概念:

生产者(Producer)

    负责创建和发送消息到RabbitMQ中的Exchange。生产者将消息发送到Exchange,Exchange根据一定的规则将消息路由到绑定的队列。

消息(Message)

     消息是生产者发送给RabbitMQ的基本数据单元。它包含了要传输的数据以及相关的元数据,例如消息的ID、优先级、时间戳等。

Exchange:

    Exchange是消息的接收和分发中心。它接收生产者发送的消息,根据预定义的规则将消息路由到一个或多个绑定的队列中。Exchange有四种类型:direct、fanout、topic和headers,不同的类型规定了不同的消息路由规则。

队列(Queue)

     队列是消息的存储区域,用于存放Exchange分发的消息。消费者从队列中获取消息进行处理。每个消息都会被发送到一个或多个队列中,消息在队列中按照先进先出的原则进行处理。

消费者(Consumer)

    负责从队列中获取消息并进行处理。消费者向RabbitMQ注册自己监听的队列,当有消息到达队列时,消费者会接收并处理消息。

绑定(Binding)

    绑定是Exchange和队列之间的关系。它定义了Exchange将消息路由到哪些队列中。绑定可以指定路由规则,例如根据消息的关键字、标签等进行路由。

RabbitMQ支持多种消息模型,下面是一些常见的消息模型:

  1. 点对点模型:也被称为队列模型,消息发送者发送消息到一个队列,消息接收者从队列中获取消息。每个消息只能被一个接收者消费。

  2. 发布/订阅模型:消息发送者将消息发送到一个交换机(exchange),交换机将消息广播给所有绑定到它的队列,每个队列都有一个接收者。

  3. 主题模式:类似于发布/订阅模型,但是消息发送者可以指定一个主题(topic),接收者可以使用通配符来订阅感兴趣的主题。

  4. RPC模型:Remote Procedure Call(远程过程调用)模型,允许应用程序之间进行远程调用。客户端发送请求到RPC队列,服务端接收请求并处理,然后将结果返回给客户端。

四.RabbitMQ的优势       

   RabbitMQ的优势包括:

  • 灵活性:RabbitMQ支持多种消息传递模式,包括点对点、发布/订阅、工作队列等,能够满足不同应用场景的需求。
  • 可靠性:RabbitMQ使用消息确认机制,确保消息的可靠传递。它还支持持久化消息和镜像队列,提高了消息的可靠性和可用性。

  • 扩展性:RabbitMQ支持横向扩展,可以通过添加多个服务器来增加消息处理的能力。它还支持集群模式,提供了高可用性和负载均衡的能力。

  • 消息优先级:RabbitMQ支持消息优先级,可以根据消息的重要性进行优先处理。

  • 插件机制:RabbitMQ提供了丰富的插件机制,可以扩展其功能,如支持消息转发、消息过滤、消息持久化等。

  • 多语言支持:RabbitMQ支持多种编程语言,包括Java、Python、Ruby、C#等,可以方便地与不同语言的应用程序进行集成。

  • 开源和社区支持:RabbitMQ是开源软件,拥有活跃的社区支持,用户可以获取到大量的文档、示例代码和社区帮助。

五.RabbitMQ的基本使用         

      在Spring Boot项目中使用RabbitMQ,需要添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

    然后,创建一个配置类来配置RabbitMQ连接和队列等信息:

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    private static final String QUEUE_NAME = "my-queue";

    @Bean
    public Queue queue() {
        return new Queue(QUEUE_NAME, false);
    }

    @Bean
    public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
                                                    MessageListenerAdapter listenerAdapter) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames(QUEUE_NAME);
        container.setMessageListener(listenerAdapter);
        return container;
    }

    @Bean
    public MessageListenerAdapter listenerAdapter(RabbitMQReceiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }

}

     接下来,创建一个消息接收者类:

import org.springframework.stereotype.Component;

@Component
public class RabbitMQReceiver {

    public void receiveMessage(String message) {
        System.out.println("Received message: " + message);
    }

}

     最后,在你需要发送消息的地方,注入一个RabbitTemplate对象,然后使用convertAndSend方法发送消息:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class RabbitMQSender {

    private RabbitTemplate rabbitTemplate;

    @Autowired
    public RabbitMQSender(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void sendMessage(String message) {
        rabbitTemplate.convertAndSend("my-queue", message);
        System.out.println("Sent message: " + message);
    }

}

这样,你就完成了RabbitMQ的基本使用。当消息发送时,RabbitMQ会将消息发送到队列中,然后接收者会从队列中接收并处理消息。

在一个完整的Spring Boot项目中,你可以使用RabbitMQSender发送消息,然后RabbitMQReceiver接收并处理消息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务雪崩问题及解决方案

雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 微服务之间相互调用&#xff0c;因为调用链中的一个服务故障&#xff0c;引起整个链路都无法访问的情况。 如果服务提供者A发生了故障&#xff0c;当前的应用的部分业务…

剑指offer

1、排序算法 0、排序算法分类 1、直接插入排序 基本思想 直接插入排序的基本思想是&#xff1a;将数组中的所有元素依次跟前面已经排好的元素相比较&#xff0c;如果选择的元素比已排序的 元素小&#xff0c;则交换&#xff0c;直到全部元素都比较过为止。 算法描述 1、从…

ubuntu系统没有网络图标的解决办法

参考文章:https://blog.csdn.net/qq_56922632/article/details/132309643 1. 执行关闭网络服务的命令&#xff0c;关闭网络服务sudo service NetworkManager stop2. 删除网络的状态文件sudo rm /var/lib/NetworkManager/NetworkManager.state3. 修改网络的配置文件sudo vi /etc…

每日一题(LeetCode)----二叉树--二叉树的层平均值

每日一题(LeetCode)----二叉树–二叉树的层平均值 1.题目&#xff08;637. 二叉树的层平均值&#xff09; 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1&#xff1a; 输入&#xff1a;root […

【Math】重要性采样 Importance sample推导【附带Python实现】

【Math】重要性采样 Importance sample推导【附带Python实现】 文章目录 【Math】重要性采样 Importance sample推导【附带Python实现】1. Why need importance sample?2. Derivation of Discrete Distribution3. Derivation of Continuous Distribution3. An Example 笔者在学…

k8s的声明式资源管理(yaml文件)

1、声明式管理的特点 &#xff08;1&#xff09;适合对资源的修改操作 &#xff08;2&#xff09;声明式管理依赖于yaml文件&#xff0c;所有的内容都在yaml文件当中 &#xff08;3&#xff09;编辑好的yaml文件&#xff0c;还是要依靠陈述式的命令发布到k8s集群当中 kubect…

基于PCA-WA(Principal Component Analysis-weight average)的图像融合方法 Matlab代码及示例

摘要&#xff1a; 高效地将多通道的图像数据压缩&#xff08;如高光谱、多光谱成像数据&#xff09;至较低的通道数&#xff0c;对提高深度学习&#xff08;DL&#xff09;模型的训练速度和预测至关重要。本文主要展示利用PCA降维结合weight-average的图像融合方法。文章主要参…

【Leetcode】466. 统计重复个数

文章目录 题目思路代码 题目 466. 统计重复个数 思路 题目要求找出一个最大整数 m&#xff0c;使得经过 n2 个字符串 s2 组成的字符串能够被经过 n1 个字符串 s1 组成的字符串完全包含的次数。使用动态规划来记录每个位置匹配的情况&#xff0c;并通过循环节的分析来计算最…

leetcode刷题日记:222. Count Complete Tree Nodes(完全二叉树的节点个数)

这一道题&#xff0c;我们可以选择直接进行二叉树的遍历&#xff0c;将所有结点遍历一遍就能得到完全二叉树的结点个数&#xff0c;时间复杂度为O(n)。 代码如下&#xff1a; int countNodes(struct TreeNode* root) {if(rootNULL){return 0;}return countNodes(root->left…

(NeRF学习)NeRFStudio安装win11

参考&#xff1a; 【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程nerfstudio介绍及在windows上的配置、使用NeRFStudio官网githubRuntimeError: PytorchStreamReader failed reading zip archive: failed finding central directory原因及解决 目录 requireme…

element-ui table-自定义表格某列的表头样式或者功能

自带表格 自定义表格某列的表头样式或者功能 <el-table><el-table-column :prop"date">//自定义表身每行数据<template slot-scope"scope">{{scope.row[scope.column.label] - ? - : scope.row[scope.column.label]}}</template>…

使用Gitea搭建自己的git远程仓库

Gitea 为什么需要自建仓库 原因只有一个&#xff1a;折腾。其实国内的码云加上github已经足够用了。 官方原话 Gitea 的首要目标是创建一个极易安装&#xff0c;运行非常快速&#xff0c;安装和使用体验良好的自建 Git 服务。我们采用 Go 作为后端语言&#xff0c;这使我们…

计算机毕业设计 SpringBoot的乡村养老服务管理系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

是否需要跟上鸿蒙(OpenHarmony)开发岗位热潮?

前言 自打华为2019年发布鸿蒙操作系统以来&#xff0c;网上各种声音百家争鸣。尤其是2023年发布会公布的鸿蒙4.0宣称不再支持Android&#xff0c;更激烈的讨论随之而来。 本文没有宏大的叙事&#xff0c;只有基于现实的考量。 通过本文&#xff0c;你将了解到&#xff1a; Har…

使用Wireshark进行网络流量分析

目录 Wireshark是什么&#xff1f; 数据包筛选 筛选指定ip 使用逻辑运算符筛选 HTTP模式过滤 端口筛选 协议筛选 包长度筛选 数据包搜索 数据流分析 数据包导出 Wireshark是什么&#xff1f; 通过Wireshark&#xff0c;我们可以捕获和分析网络数据包&#xff0c;查看…

用ChatGPT方式编程!GitHub Copilot Chat全面开放使用

全球著名开源分享平台GitHub在官网宣布&#xff0c;经过几个月多轮测试的GitHub Copilot Chat&#xff0c;全面开放使用&#xff0c;一个用ChatGPT方式写代码的时代来啦&#xff01; 据悉&#xff0c;Copilot Chat是基于OpenAI的GPT-4模型&#xff0c;再结合其海量、优质的代码…

GitHub Copilot 最佳免费平替:阿里通义灵码

之前分享了不少关于 GitHub Copilot 的文章&#xff0c;不少粉丝都评论让我试试阿里的通义灵码&#xff0c;这让我对通义灵码有了不少的兴趣。 今天&#xff0c;阿七就带大家了解一下阿里的通义灵码&#xff0c;我们按照之前 GitHub Copilot 的顺序分享通义灵码在相同场景下的…

【Linux 内核源码分析】GPIO子系统软件框架

Linux内核的GPIO子系统是用于管理和控制通用输入输出&#xff08;GPIO&#xff09;引脚的软件框架。它提供了一套统一的接口和机制&#xff0c;使开发者能够方便地对GPIO进行配置、读写和中断处理。 主要组件&#xff1a; GPIO框架&#xff1a;提供了一套API和数据结构&#x…

【深度学习-基础学习】Self-Attention 自注意力机制 笔记

本篇文章学习总结 李宏毅 2021 Spring 课程中关于 Self-Attention 自注意力 机制相关的内容。课程链接以及PPT&#xff1a;李宏毅Spring2021ML 关于 Self-Attention 机制想要解决的问题 通常来说&#xff0c; 我们的模型的输入会是一个vector&#xff0c;然后输出可能是 一个数…

python图形界面设计工具,python的图形界面gui编程

大家好&#xff0c;小编为大家解答python编写图形化界面的工具的问题。很多人还不知道python图形界面设计工具&#xff0c;现在让我们一起来看看吧&#xff01; 1.根窗体 &#xff08;1&#xff09;创建根窗体对象 ①tkinter.Tk():创建一个根窗体对象。使用后会立即显示窗口&am…