Rabbit MQ 简单介绍 (一)

Rabbit MQ 简单介绍 (一)

一、Rabbit MQ 简介:

1.什么是MQ?

MQ全称为Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法(消息传递),一般用作进程间通讯

2.MQ优势:

MQ本身是异步的,往队列里发送消息后无需等待,不同于通信协议。比如HTTP协议(同步),客户端发出请求后必须等待服务器响应。

3.MQ使用场景:

1.高并发应用来不及处理,实时性要求不高;

2.多应用之间异步通信,且耗时操作;

4.什么是Rabbit MQ?

Rabbit MQ 是由Erlang(爱立信公司)语言开发,实现高级消息队列协议(Advanced Message Queuing Protocol,简称AMQP)的消息中间件。消息中间件主要用户组件之间的解耦,消息的发送者无需知道消息使用者的存在

可是为什么叫RabbitMQ呢?

  • 兔子行动非常迅速而且繁殖起来也非常疯狂,所以就把Rabbit用作这个分布式软件的名命。

5.Rabbit MQ优势:

1.可靠性:Exchange交换机、Queue队列、Message消息持久化、高可用性;

2.灵活路由;

3.集群:分为Disc(硬盘)与RAM(内存),保证至少一台Disc;

  • 防止单机丢失,RabbitMQ支持集群,多台机器队列同步,丢失消息可从其他机器上获取

4.高可用队列:与集群结合使用,设置队列间的消息同步;

5.持久化存储:RabbitMQ支持持久化,数据保存在硬盘上;

  • 防止突然掉电措施

6.支持流控机制:可修改内存大小,默认为机器内存的40%;

  • 防止队列消息爆满

6.Rabbit MQ 服务场景:

一、应用程序之间无需即时返回且消耗操作(异步处理):

1.Work Queues:消费均匀分配消息给消费者;

2.Publish/Subscribe:广播模式,消息分发给所有的消费者;

3.Routing:消费者接收消息由路由规则决定,简单路由名;

4.Topisc:消费者接收消息由路由规则决定,路由规则名比较复杂;

二、RPC远程调用(同步):

二、RabbitMQ 构建消息队列:

1.如图所示,理解RabbitMQ对象间的关系:

在这里插入图片描述
Broker:消息队列服务器实体,比如RabbitMQ服务;

Vhost:虚拟主机,默认为’/’,一个broker里可以有多个vhost,区分不同用户权限;

Connection:应用程序与broker连接,可有多个连接;

Channel:消息通道,connection中可以建立多个channel,每个channel代表一个会话任务,所有操作都在channel中进行;

Exchange:消息交换机,channel中可有多个,用于投递消息。应用程序发送消息时先把消息给交换机,由交换机投递给队列,而不是直接给队列;

Queue:队列,用于存放未被消费者消费的消息;

Message:由Header和Body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化,由哪个Message Queue接收、优先级是多少等。而Body才真正需要传输APP数据;

Bind:根据routingKey绑定exchange与queue规则,决定消息发送的方向;

2.声明MessageQueue:

Exclusive:排他队列,如果一个队列被声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除;

Auto-delete:自动删除,如果该队列没有任何订阅的消息者的话,该队列会被自动删除。这种队列适用于临时队列;

Durable:持久化,下面会单独说;

其他选项:比如如果仅仅想查询某一个队列是否已经存在,仍然可以调用queue.declare,只不过需要将参数passive设为true,传给queue.declare,如果该队列已存在,返回true;如果不存在,则返回Error,但是不会创建新的队列。

3.生产者发送消息:

在AMQP模型中,Exchange是接受生产者消息并将消息路由到消息队列的关键组件。Exchange Type和Binding决定了消息的路由规则。所以生产者想要发送消息,首先必须声明一个Exchange和Exchange对于的Binding。可以通过ExchangeDeclare和BindingDeclare完成。

在Rabbit MQ中,声明一个Exchange需要三个参数:ExchangeName、ExchangeType、Durable。

  • ExchangeName是该Exchange的名字,该属性在创建Binding和生产者通过publish推送消息时需要指定;

  • ExchangeType,指Exchange的类型,在RabbitMQ中,有三种类型的Exchange:fanout、direct、topic,不同的Exchange会表现出不同路由行为;

    Exchange(消息交换机)主要3种类型:

    1.Fanout:不处理路由键(没有routingKey),只需把队列绑定在交换机上。发送到交换机的消息都会转发到与该交换机绑定的所有队列上,类似于广播,转发消息是最快的。
    在这里插入图片描述
    2.Direct:处理路由键(有routingKey),将一队列绑定到交换机上,该消息需与一个特定的路由键(routingKey)完全匹配。
    在这里插入图片描述

    3.Topic:与Direct类似,功能更强,支持模糊绑定:

    • ‘*’:表示通配一个词

    • ‘#’:表示通配0个或多个词

      在这里插入图片描述

  • Durable是该Exchange的持久化属性,声明一个Binding需要提供一个QueueName,ExchangeName和BindingKey;

  • 生产者在发送消息时,都需要指定一个RoutingKey和Exchange,Exchange在接收该RoutingKey以后,会判断该ExchangeType;

4.消费者订阅消息:

通过basic.consume命令,订阅某一个队列中的消息,channel会自动在处理完上一条消息之后,接收下一条消息。除非关闭channel或者取消订阅,否则客户端将会一直接收队列的消息。

通过basic.get命令主动获取队列中的消息,但是绝对不可以通过循环调用basic.get来代替basic.consume,这是因为basic.get,Rabbit MQ在实际执行的时候,首先consume某一个队列,然后检索第一条消息,然后再取消订阅。如果高吞吐率的消费者,最好建议使用basic.consume。

5.持久化:

Rabbit MQ 默认是不持久队列,Exchange、Binding以及队列中的消息,意味着一旦消息服务器重启,所有已声明的队列,Exchange、Binding以及队列中的消息都会丢失。通过设置Exchange和MessageQueue的durable属性为true,可以使得队列和Exchange持久化,但是还不能使队列中的消息持久化,这里需要生产者再发送消息的时候,将delivery mode设置为2,只有这3个全部设置完成后,才能保证服务器重启不会对现有的队列造成影响。

  • 注意:只有durable为true的Exchange和durable为true的Queues才能绑定,否则再绑定时,RabbitMQ都会抛错。持久化会对RabbitMQ的性能造成比较大的影响,可能会下降不止10倍。

6.事务:

对事务的支持是AMQP协议的一个重要特性。假设当生产者将一个持久化消息发送给服务器时,因为consume命令本身没有任何Response返回,所以即使服务器崩溃,没有持久化该消息,生产者也无法获取该消息已经丢失。如果此时使用事务,通过txSelect()开启一个事务,然后发消息给服务器,通过txCommit()提交该事务,可以保证,如果txCommit()提交了,则该消息一定会持久化,如果txCommit()还未提交及时服务器崩溃,该消息不会服务器就收。当然Rabbit MQ也提供了txRollback()命令用于回滚某一个事务。

7.Confirm机制:

  • 使用事务固然可以保证只有提交的事务,才会被服务器执行。但是这样同时也将客户端与消息服务器同步起来,这背离了消息队列解耦的本质。Rabbit MQ提供了一个更加轻量级的机制来保证生产者可以感知服务器消息是否已被路由到正确的队列中(Confirm)。

  • 如果这个channel为confirm状态,则通过该channel发送的消息都会被分配一个唯一的ID,然后一旦该消息被正确的路由到匹配的队列中后,服务器会返回给生成一个Confirm,该Confirm包含该消息的ID,这样生产者就会知道该消息已被正确分发。对于持久化消息,只有该消息被持久化后,才会返回Confirm。

  • Confirm机制最大优点在于异步,生产者在发送消息以后,即可继续执行其他任务。而服务器返回Confirm后,会触发生产者的回调函数,生产者在回调函数中处理Confirm信息。如果消息服务器发生异常,导致该消息丢失,会返回给生成一个nack,表示消息已经丢失,这样生产者就可以通过重发消息,保证消息不丢失。Confirm机制在性能上要比事务优越很多。但是Confirm机制,无法进行回滚,就是一旦服务器崩溃,生产者无法得到Confirm信息,生产者其实本身也不知道该消息是否已经被持久化,只有继续重发来保证消息不丢失,但是如果原先已经持久化的消息,并不会被回滚,这样队列中就会存在两条相同的消息,系统需要支持去重。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值