RabbitMQ学习

消息队列:在消息的传输过程中保存消息的容器。(消息队列的思想就是避开立即处理某个资源交互较大的任务并且需要等待他立即执行完成。取而代之的是我们可以把他加入到计划列表中,并在后面执行任务。我们将任务分装成消息,并发送到队列中。后台程序接收到消息后会立即执行任务。当运行多个执行器的时候,任务会在执行器之间共享)

这是一个较为经典的消费-生产者模型,说起来比较抽象,打个比方:A线程需要给B线程发送消息(A、B线程不一定是在同一台机器上的),A线程先把消息发送到消息队列服务器上,然后B线程去读取或是订阅消息服务器上消息队列中的消息,线程A和B之间并没有进行直接通信。MQ服务器在中间起到中继的作用。

 

RabbitMQ核心整体架构:

 

 

 

 

Server:  RabbitMQ服务器实体,实现AMQP ,又称为Broker 

Connection: 网络连接  客户端与Broker的连接

Channel: 消息通道,几乎所有的操作都在channel里操作,在客户端的每个连接里,可以建立多个channel,每个channel代表一个会话任务

Message: 消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body就是消息的内容

Exchange: 消息交换机  他指定消息按什么规则 路由到什么队列

RoutingKey:路由关键字 交换机根据这个关键字进行消息投递

 

 

 

工作过程:

    生产者客户端:

 1.生产者客户端连接到RabbitMQ服务器,产生一条消息通道channel

 2.客户端声明一个交换机,并设置其属性

    3.客户端声明一个消息队列,并设置其属性

    4.客户端使用routing key在消息交换机(exchange)和消息队列(queue)中建立好绑定关系。

    5.客户端投递消息都在消息交换机(exchange)上

    6.客户端关闭消息通道(channel)以及和服务器的连接。

 

 

 

图例是一个简单的demo

 

 

总结: 

1、消费者端在信道上打开消息应答机制,并确保能返回接收消息的确认信息,这样可以保证消费者发生故障也不会丢失消息。

2、服务器端和客户端都要指定队列的持久化和消息的持久化,这样可以保证RabbitMQ重启,队列和消息也不会。

3、指定消费者接收的消息个数,避免出现消息均匀推送出现的资源不合理利用的问题。

posted @ 2019-04-28 17:06  高级开发彭瑜  阅读(139)  评论(0)    收藏  举报