首页 > 其他分享 >RabbitMQ

RabbitMQ

时间:2024-07-31 14:18:46浏览次数:13  
标签:队列 factory rabbitmq 交换机 消息 RabbitMQ 路由

  • 什么是消息队列
  1. 消息队列是一种用于在应用程序之间传递消息的通信方式,消息队列允许应用程序异步地发送和接收消息,并且不需要直接连接到对方;
  2. 消息是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象;
  3. 队列可以说是一个数据结构,可以存储数据,先进先出;
  • 使用消息队列有什么缺点
  1. 降低系统的可用性:系统引用的外部依赖越多,越容易挂掉;
  2. 系统复杂度提高:使用MQ后可能需要保证消息没有被重复消费、处理消息丢失的情况,保证消息传递的顺序性等等问题;
  3. 一致性问题:A系统处理完了直接返回成功了,但问题是:要是B、C、D三个系统那里,B和D两个系统写库成功了,结果C系统写库失败了,就造成数据不一致了。
  • Rabbitmq四大核心
  1. 生产者:发送消息的一个应用程序,将消息发布到特定的队列中,
  2. 消费者:接受消息的应用程序,从队列中获取消息并进行处理;
  3. 队列:消息在rabbitmq里的存储区域;
  4. 交换机:路由的核心组件,生产者发送消息时,消息首先到达交换机,交换机会根据其中的配置,把消息路由到相应的队列中;
  • AMQP协议
  1. 消息:消息头,消息体,消息属性;
  2. 交换机:消息传递中介,将消息路由到一个或多个队列中;
  3. 队列:消息容器
  4. 绑定
  • 启动
  1. 在D:\rabbitmq\rabbitmq\rabbitmq_server-3.13.2\sbin  输入cmd  ;
  2. rabbitmqctl status //查看当前状态
  3. rabbitmq-plugins enable rabbitmq_management //开启Web插件

  4. rabbitmq-server start //启动服务

  5. rabbitmq-server stop //停止服务

  6. rabbitmq-server restart //重启服务

  • 工作原理
  1. Broker是rabbitMQ的一个实体,接受分发消息的应用,一个broker可以有多个vhost,vhost下面是exchange交换机,一个vhost可以有多个exchange,一个exchange可以有多个队列,在同一个vhost中交换机和队列不能重名

  2. pom文件添加
            <dependency>
                <groupId>com.rabbitmq</groupId>
                <artifactId>amqp-client</artifactId>
                <version>5.16.0</version>
            </dependency>
  3. 生产者
    1. 创建连接
      //创建一个连接工厂
              ConnectionFactory factory = new ConnectionFactory();
              //服务地址
              factory.setHost("localhost");
              //账号
              factory.setUsername("guest");
              //密码
              factory.setPassword("guest");
              //端口号
              factory.setPort(5672);
              //创建连接
              Connection connection = factory.newConnection();
              //创建信道
              Channel channel = connection.createChannel();
    2. 创建交换机
      /**
               * 创建交换机
               * 1,交换机名称
               * 2.交换机类型,direct,topic,fanout,headers
               * 3.指定交换机是否需要持久化,如果设置为true,那么交换机的元数据需要持久化
               * 4.指定交换机在没有队列绑定时,是否需要删除,设置false表示不删除
               * 5.Map<String,Object>类型,用来指定交换机其他的一些机构化参数,一般直接设置为null
               */
              channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT,true,false,null);
    3. 生成一个队列
      /**
               * 生成一个队列
               * 1.队列名称
               * 2.队列是否需要持久化,但是要注意,只是队列名称等这些元数据的持久化,不是队列中消息的持久化
               * 3.表示队列是不是私有化,如果是私有化的,只有创建他的应用程序才能消费消息
               * 4.队列在没有消费者订阅的情况下是否自动删除;
               * 5.队列的一些结构化信息,比如声明死信队列,磁盘队列会用到;
               */
              channel.queueDeclare(queueName,true,false,false,null);
    4. 将我们的交换机和队列绑定
      /**
               * 将我们的交换机和队列绑定
               * 1.队列名称
               * 2.交换机名称
               * 3.路由键,在直连模式下,可以为我们的队列名称
               */
              channel.queueBind(queueName,exchangeName,queueName);
    5. 发送消息
              String queueName ="xc_queue_name";
              String exchangeName ="xc_exchange_name";
           
            //发送消息
              String message = "hello rabbitmq";
              System.out.println("消息发送成功");
              /**
               * 发送消息
               * 1.发送到哪个交换机
               * 2.队列名称
               * 3.其他参数信息
               * 4,发送消息的消息体
               */
              channel.basicPublish(exchangeName,queueName,null,message.getBytes());
    6. 关闭连接和通道
              channel.close();
              connection.close();   

       

  4. 消费者
    1. 建立连接
      //创建一个连接工厂
              ConnectionFactory factory = new ConnectionFactory();
              //服务地址
              factory.setHost("localhost");
              //账号
              factory.setUsername("guest");
              //密码
              factory.setPassword("guest");
              //端口号
              factory.setPort(5672);
              //创建连接
              Connection connection = factory.newConnection();
              //创建信道
              Channel channel = connection.createChannel();
    2. 回调函数
      //接受消息的回调函数
              DeliverCallback deliverCallback = (consumerTage,message) ->{
                  System.out.println("接收到消息"+new String(message.getBody()));
              };
              //取消消息的回调函数
              CancelCallback cancelCallback = consumerTage ->{
                  System.out.println("消费信息被中断");
              };
    3. 消费消息
      /**
               * 消费消息
               * 1.消费哪个队列
               * 2.消费成功之后是否需要自动应答,true 自动应答
               * 3.接受消息的回调函数
               * 4.取消消息的回调
               */
              channel.basicConsume("xc_queue_name",true,deliverCallback,cancelCallback);

       

  • 交换机类型
  1. direct:路由键与队列完全匹配交换机,通过RoutingKey路由键将交换机和队列进行绑定,消息被发送到exchange时,需要根据消息的RoutingKey,来进行匹配,只将消息发送到完全匹配到此RoutingKey的队列;

  2. fanout:扇出类型交换机,此种交换机,会将消息分发给所有绑定了此交换机的队列,此时RoutingKey参数无效;

  3. topic:和direct类似,也是需要通过routingkey路由键进行匹配分发,区别是topic可以进行模糊匹配,direct是完全匹配;
    1. topic中,将routingkey通过“.”来分为多个部分;
    2. “*”:代表一个部分;
    3. “#”:代表0个或多个部分(如果绑定的路由键为“#”时,则接受所有消息,因为路由键所有都匹配);

  4. headers:匹配AMQP消息的header而不是路由键,此外header交换器和direct交换机完全一致,但性能差很多消费方指定的headers中必须包含一个“x-match”的键;
    1. x-match = all:表示所有的键值对都匹配才能接受到消息;
    2. x-match = any:表示只要有键值对匹配就能接受到消息;

  • RabbitMQ
    1.什么是生产者
    2.什么是消费者,多个消费者消息分发机制
    3.生产者和消费者的确认机制
    4.Channels ,Exchanges,Queues

标签:队列,factory,rabbitmq,交换机,消息,RabbitMQ,路由
From: https://www.cnblogs.com/wxy01/p/18218771

相关文章

  • Rocky Linux - RabbitMQ
    RabbitMQ1MQ的基本概念RabbitMQ是一个开源的消息代理和队列服务器,它使用Erlang语言编写并运行在多种操作系统上,如Linux、Windows等。RabbitMQ可以接收、存储和转发消息(也称为“事件”)到连接的客户端。它适用于多种场景,包括异步通信、流量削峰、应用解耦等。1.1同步和异......
  • [消息队列]RabbitMQ
    RabbitMQRabbitMQ是什么?RabbitMQ是一个在AMQP(AdvancedMessageQueuingProtocol)基础上实现的,可复用的企业消息系统。它可以用于大型软件系统各个模块之间的高效通信,支持高并发,支持可扩展。它支持多种客户端如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、S......
  • RabbitMQ实战——rabbitmq高可用集群搭建
    本文详细介绍了如何在CentOS7系统上部署RabbitMQ高可用集群,包括安装ERlang和RabbitMQ服务器,设置Web客户端,配置主机名映射,同步cookie,加入和退出集群,以及使用镜像队列实现数据同步。摘要由CSDN通过智能技术生成前言本节内容是关于rabbitmq高可用集群的部署搭建,使用的是centos7系统,......
  • 使用 Docker Compose 部署 RabbitMQ 的一些经验与踩坑记录
    前言RabbitMQ是一个功能强大的开源消息队列系统,它实现了高效的消息通信和异步处理。本文主要介绍其基于Docker-Compose的部署安装和一些使用的经验。特点成熟,稳定消息持久化灵活的消息路由高性能,高可用性,可扩展性高支持插件系统:RabbitMQ具有丰富的插件系统,可以通......
  • flutter中使用rabbitmq
    依赖dart_amqp:^0.3.1#rabbitMq接收发送消息工具封装import'package:dart_amqp/dart_amqp.dart';///封装RabbitMQ的服务类classRabbitMQService{lateConnectionSettings_settings;//RabbitMQ连接设置lateClient_client;//RabbitMQ客户端late......
  • rabbitmq发送消息localdatetime报错:Java 8 date/time type `java.time.LocalDateTime`
    两种解决方案:通过全局配置LocalDateTime的序列化/***json序列化增强解决Jackson序列化不了Java8日期*/@BeanpublicMessageConvertermessageConverter(){ObjectMapperom=newObjectMapper();om.setVisibility(PropertyAccessor.ALL,JsonAut......
  • 使用Java和RabbitMQ构建消息队列系统
    使用Java和RabbitMQ构建消息队列系统大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨如何使用Java和RabbitMQ构建一个高效的消息队列系统。RabbitMQ是一个开源的消息中间件,支持多种消息协议,能够帮助我们实现异步处理和解耦。1.Rabbit......
  • RabbitMQ学习实践一:MQ的安装
    文章是本人在学习springboot实现消息队列功能时所经历的过程的记录,仅供参考,如有侵权请随时指出。参考文章地址:RabbitMQ安装与入门_rabbitmqwin11配置-CSDN博客RabbitMQ入门到实战一篇文章就够了-CSDN博客RabbitMQ系列(18)--RabbitMQ基于插件实现延迟队列_rabbitmq延迟队列插......
  • RabbitMQ-最常用的消息队列MQ安装详解!!
    RabbitMQ-最常用的消息队列MQ安装详解!!RabbitMQ-简介RabbitMQ是采用Erlang语言实现的高级消息队列协议(AMQP)的消息中间件。它最初起源于金融系统,用于在分布式系统中存储和转发消息。在RabbitMQ中,消息传递的过程可以想象成厨师做好饭菜放到服务台,服务台会暂存并最终将......
  • RabbitMQ——死信队列介绍和应用
    死信和死信队列的概念什么是死信?简单来说就是无法被消费和处理的消息。一般生产者将消息投递到broker或者queue,消费者直接从中取出消息进行消费。但有时因为某些原因导致消息不能被消费,导致消息积压在队列中,这样的消息如果没有后续的处理就会变成死信,那么专门存放死信的队列就是......