RabbitMq的四种模式存储规则

【RabbitMQ 实战】10 消息持久化和存储原理 交换器、队列、消息都可以设置是否持久化。交换器和队列持久化的含义是元数据持久化。消息持久化的含义是消息本身持久化。将交换器、队列、消息都设置了持久化之后能百分之百保证数据不丢失吗?答案是不能从消费者来说,如果在订阅消费队列时将 autoAck 参数设置为 true,那么当消费者接收到相关消息之后,还没来得及处理就宕机了,这样也算数据丢失。这种情况很好解决,将autoAck 参数设置为 false,并进行手动确认。 阅读详情

           RabbitMQ中,所有生产者提交的消息都由Exchange(交换机)来接受,然后Exchange按照特定的策略转发到Queue进行存储,RabbitMQ提供了四种Exchange:fanout、direct、topic、header,其中header模式在实际使用中较少,本文只对前三种模式进行比较。

          性能方面比较:fanout > direct >> topic,比例大约为11:10:6

1、Fanout Exchange(发布订阅模式)

        任何生产者发送到Fanout Exchange交换机的消息都被转发到与其绑定(binging)的所有的Queue队列中存储,并由监听该队列Queue的消费者所消费,整个过程一般情况下关系为:生产者与Fanout Exchange(交换机)为多对一,Exchange(交换机)与队列Queue为一对多,队列Queue与消费者为一对多;

(1)定义Queue队列、Fanout Exchange交换机,并将队列绑定在交换机上

package com.neo.rabbit;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FanoutRabbitConfig {

    //定义三个Queue队列A、B、C
    @Bean
    public Queue AMessage() {
        return new Queue("fanout.A");
    }
    @Bean
    public Queue BMessage() {
        return new Queue("fanout.B");
    }
    @Bean
    public Queue CMessage() {
        return new Queue("fanout.C");
    }
    //定义FanoutWxchange交换机
    @Bean
    FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanoutExchange");
    }
    //将定义好Queue队列绑定在该交换机上
    @Bean
    Binding bindingExchangeA(Queue AMessage,FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(AMessage).to(fanoutExchange);
    }
    @Bean
    Binding bindingExchangeB(Queue BMessage, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(BMessage).to(fanoutExchange);
    }
    @Bean
    Binding bindingExchangeC(Queue CMessage, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(CMessage).to(fanoutExchange);
    }
}

(2)定义生产者,发布消息到具体的交换机上,再由交换机自动转发到绑定的所有队列Queue中存储

package com.neo.rabbit.fanout;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class FanoutSender {

	@Autowired
	private AmqpTemplate rabbitTemplate;

	public void send(int i) {
	   String context = "hi, fanout msg is " +i;
            //指定名字为fanoutExchange的交换机,第二个参数为具体的Queue名,忽略不写
	   this.rabbitTemplate.convertAndSend("fanoutExchange","", context);
	}

}

(3)定义消费者,实现MessageListener监听器接口,或SpringBoot中通过注解的方式根据具体的Queue队列名(RouteKey)进行实时的监听,从队列中获取消息

package com.neo.rabbit.fanout;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = "fanout.A")
public class FanoutReceiverA {

    @RabbitHandler
    public void process(String message) {
        System.out.println("fanout Receiver A  : " + message);
    }
}
注意:
  1. 该模式下生产者发布消息不需要指定RouteKey(指定了RouteKey也会被忽略)
  2. 该模式下需求提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定(按需求情况而定)
  3. 如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。

2、Topic Exchange(主题模式)

        Topic Exchange 转发消息主要是根据通配符方式匹配Queue队列中的routing_key(即为队列名)。 在这种交换机下,队列和交换机的绑定会定义一种路由模式,那么,通配符就要在这种路由模式和路由键(routing_key)之间匹配后交换机才能转发消息。(任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上)

在这种交换机模式下:(*:表示一个词,#:表示零个或多个词)

  • 路由键必须是一串字符,用句号(.) 隔开,比如说 agreements.us,或者 agreements.eu.stockholm 等。
  • 路由模式必须包含一个 星号(*),主要用于匹配路由键指定位置的一个单词,比如说,一个路由模式是这样子:agreements..b.*,那么就只能匹配路由键是这样子的:第一个单词是 agreements,第四个单词是 b。 井号(#)就表示相当于一个或者多个单词,例如一个匹配模式是 agreements.eu.berlin.#,那么,以agreements.eu.berlin 开头的路由键都是可以的。

            定义的过程跟前面的 Fanout模式差不多,所不同的是:Queue队列绑定到交换机时,需要with带有某种规则的去绑定,即BindingBuilder.bind(queueMessages).to(exchange).with("topic.#"),topic.#为匹配规则,只要生产者发布消息时的路由键routing_key满足这一规则, 即可将消息转发到该Queue(queueMessages)队列中

package com.neo.rabbit;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TopicRabbitConfig {

    final static String message = "topic.message";
    final static String messages = "topic.messages";

    @Bean
    public Queue queueMessage() {
        return new Queue(TopicRabbitConfig.message);
    }
    @Bean
    public Queue queueMessages() {
        return new Queue(TopicRabbitConfig.messages);
    }
    @Bean
    TopicExchange exchange() {
        return new TopicExchange("topicExchange");
    }
    @Bean
    Binding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange) {
        return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message");
    }
    @Bean
    Binding bindingExchangeMessages(Queue queueMessages, TopicExchange exchange) {
        return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#");
    }
}

3、Direct Exchange(默认模式)

        任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue,即无需定义交换机(Exchange),直接定义好队列(Queue)即可,生产者发布消息时,通过abbitMQ自带的交换机Exchange:”"(该Exchange的名字为空字符串,下文称其为default Exchange)转发到具体的RouteKey队列中存储,如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。

    该模式为默认的、简单的一种,应用的方式为(都为在同一个队列中进行操作):

  • 一对一发送:一个发送者,一 个接收者
  • 一对多发送:一个发送者,N 个接收者
  • 多对多发送:N个发送者,N 个接收者
RabbitMq介绍 主要介绍了RabbitMq的一些基本概念 ,包括了结构,使用过程,类型,以及一些应用场景 立即下载

相关推荐

TNS-12516及ORA-12516错误解决

在客户端进行sqlplus连接报错如下: ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程序 在/home/oracle/product/10.2.0/db_1/network/log/listener.log中查看到错误如下: TNS-12516: TNS:listener could not find available handler with matchin

KEL 2万+

rabbitmq基础8——持久化、存储机制、ETS、队列结构、消息状态、内存告警、磁盘告警

持久化、存储机制、ETS、队列结构、消息状态、内存告警、磁盘告警

百慕卿君博客 5273

SV--对象拷贝、参数化的类

对象拷贝,参数化的类

创芯人--fly的博客 1571

RabbitMQ的数据存储

数据存储

qq_38014879的博客 2586

5分钟搞定PaddleOCR PP-OCRv5环境搭建:从安装到第一个识别Demo

本文提供了一份详细的PaddleOCR PP-OCRv5环境搭建与快速入门指南。通过清晰的步骤,指导读者在5分钟内完成从创建Python虚拟环境、安装PaddlePaddle框架和PaddleOCR库,到编写并运行第一个OCR识别Demo的全过程,帮助开发者快速体验最新的PP-OCRv5模型的文字识别能力。

sprite的博客 1270

Emuelec系统安装全流程:超详细版指南(从零开始)

手把手带你完成emuelec系统的完整安装,从基础准备到系统配置一步不落,适合新手入门。深入解析emuelec在各类设备上的部署技巧,让复古游戏体验更流畅。

weixin_42594419的博客 1974

Rabbitmq消息保存机制&应用案例分析&消息可靠性保证

生产者将信道设置为confirm模式,一旦信道进入confirm模式,所有在该信道上发布的消息都会被指派一个唯一的id,一旦消息被投递到所有匹配的队列之后,Rabbitmq就会发送一个确认(Basc.Ack)给生产者,这就使得生产者知道消息已经正确到达目的地,如果消息和队列是可持久化的,则消息会被写入磁盘后再发送ACK。当设置了队列持久化和消息的持久化,当Rabbitmq服务重启,消息依旧存在,单单设置队列持久化,重启之后消息会丢失,只设置消息的持久化,重启队列之后,队列会丢失进而消息也会丢失。

weixin_42824596的博客 980

Mathtype公式下标深度调整技巧:解决固定行距下的显示不全问题

本文针对在Word等文档中设置固定行距时,Mathtype公式下标显示不全的问题,提供了专业解决方案。核心在于调整Mathtype软件内部的“下标深度”参数,通过修改单个公式或批量格式化全文,使公式完美适配固定行距,确保下标清晰完整,且不影响文档整体排版。

pepsi的博客 1503

RabbitMQ 存储机制与流控

RabbitMQ 保证可靠性的一条是消息的持久化,那消息时如何持久化的呢?

我是一名热爱编程和分享知识的技术作者,在金融和教育领域有多年的研发管理经验,感谢您访问我的博客,一定会为您带来不一样的收货! 1331

用Python实现斗地主游戏(终端版)

马上就要过年了 大家也都放假了吧 过年必不可少的活动 打牌! 今天带大家来写一份斗地主 (又是好多天没怎么更新,忙成狗啊) 那么实现一个斗地主呢 我们肯定要先完善卡牌系统 from collections import Counter import numpy as np import itertools def cmp_to_key(mycmp): 'Convert a cmp= function into a key= function' class K: def _

Miku_wx的博客 9857

[内网基础] 内网基础知识 —— Windows 工作组

在一个大型单位里,可能有成百上千台计算机互相连接组成局域网,如果不对这些计算机进行分组,网络的混乱程度是可想而知的。Windows 为了解决这一问题,就产生了工作组(Work Group)这个概念。Windows 工作组尝试将不通的计算机按功能(或部门)分别列入不同的工作组,例如技术部的计算机都列入 “技术部” 工作组、行政部的计算机都列入 “行政部” 工作组。要想访问某个部门的资源,只要在 “网络” 里双击该部门的工作组名,就可以看到该部门里的所有计算机了。

Blue17 の 小窝 1606

RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较(转)

RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 RabbitMQ提供了四种Exchange:fanout,direct,topic,header header模式在实际使用中较少,本文只对前三种模式进行比较。 性能排序:fanout > direct >> topic。比例大约为11:10:6 一.Direct Exchange Direct Exchange -处理路由键。需要将一个队列..

诚的博客 412

Qt/C++ 音视频开发 - FFmpeg 安卓版

通过将 FFmpeg 集成到 Qt/C++ 项目中,我们可以实现强大且灵活的音视频处理功能。本文介绍了在安卓平台上使用 FFmpeg 的基本步骤,包括初始化、解码、处理和编码等。实际应用代码示例展示了如何在安卓设备上播放视频。

走向CTO的路上... 1193

RabbitMQ中的交换机类型

另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!不过队列一定要与交换机绑定。消息的发送方在 向 Exchange发送消息时,也必须指定消息的。Exchange不再把消息交给每一个绑定的队列,而是根据消息的。队列与交换机的绑定,不能是任意绑定了,而是要指定一个。

qq_64064246的博客 981

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RabbitMQ 交换机

交换机 在上一节中,我们创建了一个工作队列。我们假设的是工作队列背后,每个任务都恰好交付给一个消费者(工作进程)。在这一部分中,我们将做一些完全不同的事情-我们将消息传达给多个消费者。这种模式称为 ”发布/订阅”. 为了说明这种模式,我们将构建一个简单的日志系统。它将由两个程序组成:第一个程序将发出日志消息,第二个程序是消费者。其中我们会启动两个消费者,其中一个消费者接收到消息后把日志存储在磁盘,另外一个消费者接收到消息后把消息打印在屏幕上,事实上第一个程序发出的日志消息将广播给所有消费者者 Exchang

@小刘同学nice 370

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

RabbitMQ五种工作模式

RabbitMQ五种工作模式 1、简单队列 一个生产者对应一个消费者!! 2、work 模式 一个生产者对应多个消费者,但是一条消息只能有一个消费者获得消息!!! 轮询分发就是将消息队列中的消息,依次发送给所有消费者。一个消息只能被一个消费者获取。 3、发布/订阅模式 一个消费者将消息首先发送到交换器,交换器绑定到多个队列,然后被监听该队列的消费者所接收并消费。 ps:X表示交换器,在RabbitMQ中,交换器主要有四种类型:direct、fanout、topic、headers,这里的交换器是 fa

weixin_41882200的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

RabbitMQ 的工作模式

RabbitMQ 共提供了 7 种工作模式进行消息传递,在本篇文章中,我们就来学习 RabbitMQ 的工作模式

2301_76161469的博客 7878

【RabbitMQ】 RabbitMQ 工作模式

RabbitMQ工作模式

2403_87459748的博客 1706

详解RabbitMQ工作模式之路由模式

详解RabbitMQ工作模式之路由模式。

. 1万+

【RabbitMQ】工作模式

对RabbitMQ工作模式的简单概述以及代码案例

weixin_73060900的博客 1755

【RabbitMQ】工作模式介绍

七种工作模式简单介绍

yj20040627的博客 2327

详解RabbitMQ工作模式之发布订阅模式

详解RabbitMQ工作模式之发布订阅模式

. 1万+

RabbitMQ的四种交换机

精确匹配 Routing Key。:广播消息到所有队列。:根据模式匹配 Routing Key。:根据消息的 Header 属性进行路由。每种交换机类型适用于不同的场景,选择合适的交换机类型可以提高消息路由的效率和灵活性。

qq_74421990的博客 1509

RabbitMq的五种工作模式

​ 这五种工作模式,可以归为三类:生产者,消息队列,一个消费者;生产者,消息队列,多个消费者;生产者,交换机,多个消息队列,多个消费者;

代码蒋的博客 948

RabbitMQ详细介绍

基于AMQP-Advanced Message Queuing Protocol(高级消息队列协议)规范实现的开源项目。

weixin_43188446的博客 2325

RabbitMQ 各种通信模式的Python实现

本文介绍了RabbitMQ消息队列的原理,组件,用python连接RabbitMQ的 生产者-消费者模式,任务队列模式,发布订阅模式、路由模式、RPC调用等。

Python技术探索 2248
上一篇: SpringMVC的工作原理
下一篇: HTTP请求详解
Array*
博客等级 码龄9年 2粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值