RabbitMq

一作用:各个系统之间的消息通信

二应用场景:
1)信息的发送者和接收者如何维持这个连接,如果一方的连接中断,这期间的数据如何方式丢失?

持久化:

2)如何降低发送者和接收者的耦合度?

 消息会被缓存,不会丢失
3)如何让Priority高的接收者先接到数据?


4)如何做到load balance?有效均衡接收者的负载?


5)如何有效的将数据发送到相关的接收者?也就是说将接收者subscribe 不同的数据,如何做有效的filter。

通过exchange 配置不同的规则direct,fanout,topic

6)如何做到可扩展,甚至将这个通信模块发到cluster上?


7)如何保证接收者接收到了完整,正确的数据?
通过ack 确认,如果message被某个consumer正确的接收到了,message会从quue中删除,如果没有任何的cosumer消费,数据会被cache不
会被丢弃。程序正确接收可以通过ack确认,也可以自动的ack,如果cosumer没有发送ack 则不会在发送数据给它(consumer)。

8)producer和consumer 是通过什么连接的?
通过tcp 连接到broker server

9)如果consumer 接受消息后解析消息异常或者少了某些数据怎么办?

consumer可以将失败的消息发送个producer,producer新declare一个queue 并监听改queue如果有错误可以执行其他的操作(分析错误,或者发邮件通知)

10) consumer是如何接受到broker server的内容的?

consumer相当于一个监听监听broker server 如果有新消息就处理。

名词介绍:
broker server :维护一条从producer 和consumer的路线,保证数据按照指定的方式进行传输
producer:数据的发送方,每条message有两个部分;payload:传输的数据(具体的数据内容),label(标签):是每条消息的名称,
borker server 通过这个label决定把每条message发送给那个consumer
consumer:数据的接收方,负责到borker server 和订阅消息队列(queue),队列(queue)相当于一个有名字的邮箱,当message到达某个邮箱后,boreker server把他发送给他的某个订阅者即consumer。接收的只有messgage label 已经被取消了(发送发发送到server server放到队列 然后server根据名称发送个订阅了的consumer)

exchanges:接收消息,转发消息到绑定的队列上,指定消息按什么规则,路由到哪个队列。

queues :消费者接收最终的消息,消息队列载体,用来存储消息,相同属性的 queue 可以重复定义,每个消息都会被投入到一个或多个队列。

bindings:绑定,它的作用就是把 Exchange 和 Queue 按照路由规则绑定起来。
connection:tcp连接, Producer和Consumer都是通过TCP连接到RabbitMQ Server的
channels:虚拟连接,消息通道,在客户端的每个连接里可建立多个 Channel,每个 channel 代表一个会话。它建立在上述的TCP连接中。数据流动都是在Channel中进行的。也就是说,一般情况是程序起始建立TCP连接,第二 步就是建立这个Channel


channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

为什么使用Channel,而不是直接使用TCP连接?
tcp建立连接和关闭是有代价的,频繁的简历关闭tcp连接对于系统的性能有很大的影响,并且tcp连接有限制,而channel没有这个限制,对
于producer和consumer,可以并发使用多个channel进行订阅和接收

producer发送消息到 exchange exchange根据routing key 分送到具体的queue borker 再根据订阅将queue分送到对应的consumer
有三种类型的Exchanges:

direct:rougting key 以创建quue的名称作为routing key; 

fanout:响应queue广播,所有的consumer都可以接受

topic:对key进行模式匹配,比如ab*可以传递到所有ab*的queue

 


consumer 解析producer 发送的消息失败怎么办?

producer 新创建一个队列用于监听错误消息(consumer 将解析失败的数据在发送给producer)producer 做其他操作

生成消息失败怎么办?

做数据持久化, 标记是否已经发送到producer 

mq消息类型:topic

任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上

1.这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的队列。

2.这种模式需要RouteKey,也许要提前绑定Exchange与Queue。

3.在进行绑定时,要提供一个该队列关心的主题,如“#.log.#”表示该队列关心所有涉及log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。

4.“#”表示0个或若干个关键字,“*”表示一个关键字。如“log.*”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。

5.同样,如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息。

如:

 

fanout  

任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上。

1.可以理解为路由表的模式

2.这种模式不需要RouteKey

3.这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定。

4.如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃

无需RouteKey 如:

 

 无论是fanout 还是topic 都需要和创建的exchanges 绑定,fanout 类型绑定的queue 无需写Routing Key,topic类型的queue需要写Routing Key

如图:

 

posted @ 2018-02-28 17:11  暖暖-木木  阅读(141)  评论(0编辑  收藏  举报