RabbitMQ 入门到进阶 2020年底福利 这一篇就够了

RabbitMQ

一.基本概念知识认识

1.基本概念认识:

RabbitMQ是erlang语言基于AMQP的实现 (Advanced Message Queue Protocol)
是基于生产者和消费者模型

2.相关概念的介绍
  1. RabbitMQ包括 producer Borker Consume
  2. 生产者和消费者就不多说啦
  3. Broker: 消息中间件的服务节点 在RabbitMQ中 broker包括了 有RabbitMQ的交换器(exchange)和真实存放消息的地方Queue
    在这里插入图片描述
  4. 可以把Producer当作是一个正在分布式里启动的一个模块1 模块1通过Channel的方式把数据发送给Broker中然后Consume通过通道绑定监听队列的通过推拉的方式来获得RabbitMQ中的消息。在后续中会讲到
  5. 路由键(Routing Key):

生产者将消息发送给交换器的时候,一般会指定一个RoutingKey,用来指定这个消息的路由规则,而这
个路由键 需要与交换器类型和绑定键(BindingKey) 联合起来才会生效.

  1. Binging: 绑定

RabbitMQ中通过绑定将交换器与队列关联起来,在绑定的时候一般会绑定一个绑定键(Binding Key)这样MQ就知道消息怎么由交换器到队列了

  1. 四种交换器的概念:

    1. fanout 广播:

    会把所有发送到该交换器的消息路由到所有与交换器绑定的队列中。

    1. direct

    把消息路由发送到那些BindingKey和RoutingKey完全匹配的队列中。
    在这里插入图片描述

    1. topic 主题:

    模糊匹配 就像是数据库中的like模糊匹配

    • 匹配的是一个单词 #匹配的是多个规格的单词 --------‘单词’ =》 English单词!
      在这里插入图片描述
    1. hearders

    像是HTTP协议中post请求一样 根据发送的消息内容中的和hearders进行匹配(以键值对的模式)

  2. AMQP 生产者的流转过程
    在这里插入图片描述

  3. AMQP 消费者的流转过程
    在这里插入图片描述

  4. 自建图模型理解
    在这里插入图片描述

二.常用方法
  1. 创建RabbitMQ的连接
ConnectionFactory factory = new ConnectionFactory(); //工厂类创建对象
factory.setUserName(USER_NAME) //设置登入的用户名
factory.setPassword(PASS_WORD) //设置登入的密码
factory.setVirualHost(virualHost) //设置虚拟的主机
factory.setHost(IP_ADRESS) //设置IP地址
factory.setPort(PORT) //设置连接的端口号
Connection conn = factory.newConnection();
  1. 通道的创建

可以通过conn.createChannel来创建 生产者/消费者跟Broker之间的通道

  1. 声明交换器的方法 -> exchangeDeclare

exchangeDeclare有多个重载方法 ,这些重载方法都是由下面这个方法中缺省的某些参数构成

/**
 * exchange : 交换器的名称 
 * type : 交换器的类型 上文说过的是 常见的 fanout direct topic
 * durable : 是否持久化, 持久化就是可以存储在磁盘中 下次重启之后也可以重新加载
 * autoDelete : 设置是否自动删除,假设设置的是true  自动删除的前提是至少有一个队列或者交换器与这个交换器绑定 ,之后所有与这个交换器绑定的队列或者交换器都与之解绑 
 * internal : 是否排他性
 * args : 一些结构化的参数  一般传的都是一些map 或者是 properties 
 */
exchangeDeclare( String exchange,String type, boolean autoDelete, boolean durable
				 boolean internal, Map<String,Object> args)
  1. queueDeclare 方法参数的说明
/** 
 * queue: 队列的名字 
 * durable 是否持久化
 * exclusive : 是指是否排他
 * autoDelete:设置是否自动删除,假设设置的是true  自动删除的前提是至少有一个队列或者交换器与这个交换器绑定 ,之后所有与这个交换器绑定的队列或者交换器都与之解绑
 * args 一些结构化的参数  一般传的都是一些map 或者是 properties 
 */
 queueDeclare(String queue, boolean durable, boolean exclusive,
 			  boolean autoDelete, Map<String , Object> args)
  1. queueBind 方法的参数解析
/** 
 * queue: 队列的名字 
 * exchange: 交换器的名字
 * routingKey: 用来绑定队列和交换器的路由键
 * args 定义一些绑定的参数
 / * 
queueBind(String queue,String exchange, String routingKey,Map<String , Object> args)
  1. 消息发送的方法
/**
 *mandatory和immediate 的详细内容见后文
 */
channel.basicPublish(exchangeName,routingKey,mandatory,MessageProperties,PERSISTENT_TEXT_PLANT,messageBodyBytes);
  1. 消费者的消费信息的方式

    1. 推(push)模式 <—可防止消息不必要的丢失

    是一种基于客户器/服务器机制、由服务器主动将信息送到客户器的技术。在push模式应用中,服务器把信息送给客户器之前,并没有明显的客户请求。push事务由服务器发起。push模式可以让信息主动、快速地寻找用户/客户器,信息的主动性和实时性比较好。但精确性较差,可能推送的信息并不一定满足客户的需求。推送模式不能保证能把信息送到客户器,因为推模式采用了广播机制,如果客户器正好联网并且和服务器在同一个频道上,推送模式才是有效的。push模式无法跟踪状态,采用了开环控制模式,没有用户反馈信息。在实际应用中,由客户器向服务器发送一个申请,并把自己的地址(如IP、port)告知服务器,然后服务器就源源不断地把信息推送到指定地址。在多媒体信息广播中也采用了推模式。另外,如手机*、qq广播。

    1. 拉(pull)模式

    与推模式相反,是由客户器主动发起的事务。服务器把自己所拥有的信息放在指定地址(如IP、port),客户器向指定地址发送请求,把自己需要的资源“拉”回来。不仅可以准确获取自己需要的资源,还可以及时把客户端的状态反馈给服务器。

3.RabbitMQ的进阶
  1. mandatory参数

当mandatory参数设置为true了之后,交换器无法根据自身的类型和路由键找到一个符合要求的队列,那么RabbitMQ会调用Basic.Return将命令返回给生产者,若mandatory参数为false时 则会直接将消息丢弃

  1. immediate参数

当immediate参数设置为true时,如果交换器在将消息路由到队列时发现队列上并不存在任何消费者,那么这条消息不会存入队列中,当路由键匹配的所有队列都没有消费者时,该消息会通过Basic.Return返回给生产者
而RabbitMQ3.0就去掉了immediate这个参数 因为 immediate参数会影响镜像队列的性能会用DDL和DLX来代替 (见后文分解)

  1. 备份交换器

简称AE 直接点就是“备胎交换器” 在上述mandatory参数为false时就可以将返回的消息放入这个备份交换器中 再等需要的时候再去获取 是不是很有备胎的样子!!

  1. TTL (Time to live) 过期时间

上文说到了很多方法都有args 这个参数 而现在这个参数的作用可以体现出来了!!
Map<String ,Object> args = new HashMap<String ,Object>();
args.put(“X-REPIESS”,52000);//设置的单位时ns
channel.queueDeclare(queueName,false,false,false,args);
//这样就为这个队列设置了一个52秒的一个过期时间!

  1. 死信队列 (DLX)

消息死了变成的消息就叫死信!

  1. 消息被拒绝了
  2. 消息过期了
  3. 队列达到了最大的长度

对于我们程序员来说 这个DLX是很好用的特性
可以处理那些消息不能够被消费的就进入死心队列

  1. 延迟队列

我们可以用实际场景
在购物的时候会生成一个30MIN之内支付的订单 如下图就是这么一个延迟队列实现的机制
在这里插入图片描述

  1. 优先级队列

Map<String ,Object> args = new HashMap<String ,Object>();
args.put(“X-max-priority”,10);//设置的单位时ns
channel.queueDeclare(queueName,false,false,false,args);
优先级默认为0 这里的优先级高得队列会先消费信息

  1. 持久化

durable : 是否持久化, 持久化就是可以存储在磁盘中 下次重启之后也可以重新加载
在1.3中的参数中可以进行设置
当RabbitMQ重启之后,持久化的消息就依旧存在
注意! 不能将所有都设置为持久化 会大大影响RabbitMQ的性能

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值