RabbitMQ小记(三)
1、RabbitMQ中mandatory和immediate以及备份交换机
(1)mandatory为true时,若交换机无法根据自身类型和路由键找到符合条件的对列,那么RabbitMQ会回调Basic.Return将消息返回生产者。
生产者可以调用channel.addReturnListener来添加ReturnListener实现获取被返回的消息。
channel.basicPublish(EXCHANGE NAME , "", true ,MessageProperties . PERSISTENT TEXT PLAIN ,"mandatory test" . getBytes());
channel.addReturnListener(new ReturnListener() (
public void handleReturn(int replyCode , String replyText ,String exchange , String routingKey ,AMQP.BasicProperties basicProperties ,byte[] body) throws IOException{
String message = new String(body);
System.out.print("返回结果是:"+message);
}
});
(2)mandatory为false时,若交换机无法根据自身类型和路由键找到符合条件的对列,那么RabbitMQ会丢弃消息。
(3)immediate为true时,若交换机发现队列上不存在消费者时,那么消息不会存入队列,,那么RabbitMQ会回调Basic.Return将消息返回生产者。Rabbit3.0开始不使用immediate。
(4)immediate和mandatory的差别
mandatory告诉服务器至少将消息存储到一个队列中,否则将消息返回生产者。
immediate告诉服务器若队列上有消费者则存储,否则将消息返回生产者。
(5)备份交换机,简称AE,生产者在发送消息时,未规定mandatory参数或mandatory参数为false时,消息服务器未找到对应的对列,会将消息丢弃,而生产者不想消息被丢弃,这时可以将消息存储到备份交换机(AE)中。
实现备份交换机有两种方式:
1)声明交换器(channel.exchangeDeclare)时添加alternate-exchange参数来实现。
Map<String , Object> args = new HashMap <String , Object>();
args.put("alternate-exchange" , "myAe");
channe1.exchangeDeclare( "ExchangeName" , " direct" , true , false , args);
channe1.exchangeDeclare( "myAe " , "fanout" , true , false , null) ;
2)通过策略(Policy)的方式来实现。
rabbitmqctl set_policy AE “^normalExchange” '{“alternate-exchange” :"myAE"," " }'
2、过期时间(TTL)
设置消息的过期时间,有两种方式:
1)通过对列属性来设置,这样队列中所有消息的过期时间是一样的。
Map<String , Object> args = new HashMqp<String , Object>{};
args . put( " x-expires" , 1800000);
channel . queueDeclare("myqueue " , false , false , false , args) ;
2)通过对每条消息来设置过期时间。
AMQP . BasicProperties.Builder builder = new AMQP.BasicProperties . Builder();
builder.deliveryMode(2);//持久化消息
builder.expiration(“6000”);//设置过期时间
AMQP.BasicProperties properties = builder . build() ;channel.basicPublish(exchangeName , routingKey , mandatory , properties ," ttlTestMessage".getBytes());
两种都设置过期时间时,取最短时间,超过过期时间,消息就会变成死信。
3、死信队列、延迟队列、优先级队列
(1)死信队列,简称DLX,当消息被拒绝、过期、队列达到最大长度时,消息就会变成死信,而死信就会被存储在死信队列里。
死信队列可以在队列属性中设置:
channel . exchangeDeclare("dlx_exchange " ,“direct”);//创建direct类型交换机
Map<String , Object> args = new HashMap<String , Object>();
args . put("x-dead-letter-exchange" , " dlx_exchange ");//设置交换机属性
channel . queueDeclare("myqueue" , false , false , false , args);//将myqueue设置为死信对列
(2)延迟队列,生产者发出消息后想在特定的时间让消费者获取消息,可以在发消息时设置消息延迟时间。
可以通过死信得方式来实现消息延迟,例如当生产者通过A1交换机把消息发送到B1队列上,设置过期时间为20秒,当消息过期后,会存储到死信队列B2上,而消费者去订阅B2对列,从而实现消息延迟。
(3)优先级队列,优先级高的对列中存储的消息会被最先消费。
Map<String , Object> args= new HashMap<String , Object>() ;
args.put( " x-rnax-priority " , 10) ;//设置优先级为10
channel.queueDeclare( " Queue_priority " , true , false , false , args) ;
4、远程过程调用(RPC)
通过远程计算机从网络发起服务请求,有助于降低分布式的构建难度。
RabbitMQ实现RPC,客户端发送请求消息,为每一条消息指定唯一的ID,服务端回复响应消息,为了接收相应的消息,需要在请求消息中发送一个回调对列,回调对列收到服务端返回的消息后根据ID来将返回消息和请求消息进行匹配,如果匹配失败,回复消息会被丢弃,RPC的流程图如下:

5、消息持久化
消息持久化可以提高RabbitMQ的可靠性,以防在重启、宕机时发生的数据丢失,RabbitMQ中持久化可分为交换器持久化、对列持久化、消息持久化。
交换器持久化:声明交换器时把durable设置为true,交换器持久化会保证消息不会丢失,但自身的数据会丢失,无法再将消息发送到交换器上。
对列持久化:声明对列时把durable设置为true,对列持久化可以保证自身的数据不会丢失,但存储的消息会丢失。
消息持久化:将消息发送模式BasicProperties中的deliveryMode设置为2,重启、宕机消息不会丢失。
对列和消息、交换器都设置持久化,会很大概率保证数据不会丢失,但是会影响效率,因为持久化会将数据写到磁盘里。
RabbitMQ小记(三)的更多相关文章
- RabbitMQ(三) -- Publish/Subscribe
RabbitMQ(三) -- Publish/Subscribe `rabbitmq`支持一对多的模式,一般称为发布/订阅.也就是说,生产者产生一条消息后,`rabbitmq`会把该消息分发给所有的消 ...
- rabbitMQ第三篇:采用不同的交换机规则
在上一篇我们都是采用发送信息到队列然后队列把信息在发送到消费者,其实实际情况并非如此,rabbitMQ其实真正的思想是生产者不发送任何信息到队列,甚至不知道信息将发送到哪个队列.相反生产者只能发送信息 ...
- python使用rabbitMQ介绍三(发布订阅模式)
一.模式介绍 在前面的例子中,消息直接发送到queue中. 现在介绍的模式,消息发送到exchange中,消费者把队列绑定到exchange上. 发布-订阅模式是把消息广播到每个消费者,每个消费者接收 ...
- 【RabbitMQ】三种类型交换器 Fanout,Direct,Topic(转)
出处:https://blog.csdn.net/fxq8866/article/details/62049393 RabbitMQ服务器会根据路由键将消息从交换器路由到队列中,如何处理投递到多个队列 ...
- rabbitMQ的三种路由模式
rabbitMQ工作流程: 1.声明交换机 2.声明消息队列 3.绑定交换机和队列 4.生产者往交换机里发送新消息 5.交换机根据所选的模式和routingKey决定消息发往哪条消息队列 6.一个消费 ...
- RabbitMQ系列(三)--Java API
基于java使用RabbitMQ 框架:SpringBoot1.5.14.RELEASE maven依赖: <dependency> <groupId>com.rabbitmq ...
- RabbitMQ实战(三)-高级特性
0 相关源码 1 你将学到 如何保证消息百分百投递成功 幂等性 如何避免海量订单生成时消息的重复消费 Confirm确认消息.Return返回消息 自定义消费者 消息的ACK与重回队列 限流 TTL ...
- RabbitMQ(三):RabbitMQ与Spring Boot简单整合
RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.Spring Boot的兴起,极大地简化了Spring的开发,本文将使用Spring Boot与RabbitM ...
- 消息中间件——RabbitMQ(三)理解RabbitMQ核心概念和AMQP协议!
前言 本章学习,我们可以了解到以下知识点: 互联网大厂为什么选择RabbitMQ? RabbiMQ的高性能之道是如何做到的? 什么是AMQP高级协议? AMQP核心概念是什么? RabbitMQ整体架 ...
随机推荐
- 七夕节来啦!AI一键生成情诗,去发给你的女朋友吧!
[摘要] Hello大家好,今天就是七夕节了,为了增进和女朋友之间的情感,我写了一个自动生成情诗的AI: 大家可以在ModelArts尝试复现模型,然后快去发给你们的女朋友吧- 大家好,我是b站up主 ...
- 最强U盘修复工具
今天清理东西,本来就要把陪伴我5年多的东芝U盘扔掉了,我说试试能不能修复一下 然后就是下载各种U盘修复工具,可是我的驱动显示正常,就是在磁盘管理里边显示无媒体,其实就是电脑不知道这是个神马玩意,使用U ...
- day40:python操作mysql:pymysql模块&SQL注入攻击
目录 part1:用python连接mysql 1.用python连接mysql的基本语法 2.用python 创建&删除表 3.用python操作事务处理 part2:sql注入攻击 1.s ...
- java23种设计模式——八、组合模式
目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式--四.原型模式 java23种设计模式-- ...
- 安装oracleXE快捷版(二)
-bash-3.2$ 是oracle用户下的提示符 [root@localhost ~]# 是root用户下的提示符 #用root去修改oracle用户的密码123456[root@localhost ...
- CRMEB小程序商城v4.0二次开发对接集成阿里云短信
作者:廖飞 - CRMEB小程序商城研发项目组长 前言 cremb小程序商城v4.0版本支持短信平台为云信,但有部分用户有需求对接阿里云短信,这篇文章将对阿里云短信平台如何对接方以及对接流程详细说明. ...
- Android Studio Eclipse运行时出现 finished with non-zero exit value 2 错误解决方法
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 微博:http://weibo.com/mcxiaobing Error:Ex ...
- Android开发之recycleView详解代码,看完包你熟练掌握recycleView的用法。转自网络经典文章
来源 http://jinyudong.com/2014/11/13/Introduce-RecyclerView-%E4%B8%80/ 编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在 ...
- 2020年B2B外贸建站的终极教程
本文目标:按照本建站教程的顺序操作,能够实现:基于全球份额最大的建站系统“wordpress”,从零搭建一个B2B外贸网站,且建站成本每年小于1000元(如果不计算自己投入的人力成本的话). 模板站点 ...
- Unity3d UGUI插件之TSTableView
TSTableView是Tacticsoft工作室开发的一款适用于UGUI的列表(Table)插件,设计灵感来源于iOS/Mac的UITableView,提供高复用.高性能的列表,其主要特点是: 采用 ...