RabbitMQ知识一览-工作经验

大家在项目里面应该都用过MQ,MQ作为解耦神器,还是很有必要学习的。

RabbitMQ是基于AMQP(高级消息队列协议)。支持多种操作系统,支持多种语言。

RabbitMQ知识一览-工作经验_第1张图片
1、Broker:负责接受客户端消息和路由等功能、
2、Virtual host:虚拟主机的概念,类似权限控制组,一个Virtual host可以包括很多Exchange、Queue,不同mq的消费者生产者可以通过VHost隔离
3、Exchange:交换机,可以理解为在收到生产者的消息后负责将将消息转发给对应的Queue
4、Binding:Queue和Exchange之间绑定的关系,
5、Queue:消息队列,存放所有消息,消费者从Queue消费消息
6、Channel:通道,多路复用连接中的一条独立的双向数据流通道,不管是发出消息还是消费消息,都是通过信道完成,TCP连接
7、Consumer:消费者

Exchange分发策略:主要有四种模式,分别是fanout、direct、topic、headers。但是由于headers匹配的是消息体内header信息,而不是routingKey信息,不但跟规则上和direct差不多,而且性能差,故不常用。下面主要介绍其他三种分发策略
1、fanout:广播,所有发到exchange的消息都会被分发到每个绑定在该exchange的queue上去
2、direct:单播,每个Queue在绑定exchange的时候可以设置routingKey信息,当exchange收到消息的时候,只会将消息转发给binding的routingKey与消息体内的routingKey一致的queue。
3、topic:介于单播和广播之间,跟direct差不多,但是支持routingKey的通配符匹配,这个是日常用的最多的分发策略。*(星号)可以代替一个字。#(散列)可以替代零个或多个单词

RabbitMQ日常项目怎么用:不同事业部、大部门使用不同的MQ集群,同一大部门内不同组使用同一个MQ集群但通过VHost隔离,同一个组的不同AppId使用同一个VHost但是使用不同的Exchange(topic模式),每个AppId内不同功能模块使用不同的Queue(队列隔离可以很好的防止功能耦合,防止某一个功能的消息暴增导致其他功能受影响,最好功能之间queue隔离),每个Queue都按topic模式绑定在该appid对应的Exchange上。

命名方式:Vhost为组的名称,Exchange一般为appid的名称,queue为appid_功能名称_queue,routingKey为appid_功能名称_routingKey。这个一般是我的命名方式。

关于MQ能用来干嘛?
1、RabbitMq是有ack机制的,所以用来做重试很好用,比如说一个操作里有两个步骤,第一个异常了第二个就不执行了,而往往都是分布式接口,在分布式系统环境下,数据就很难保持一致,这时候可以通过MQ的ack机制来保证最终数据一致性
2、异步:对于一个操作带来的其他联动处理,往往不需要第一时间处理,可以在后台慢慢处理,比如写日志就可以异步消费。
3、提高处理速度:正常情况处理一个数据可以同步调用,当你处理的数据达到10万+,百万+的时候就不能在用同步的方式去处理了,而也不能采用异步线程,异步线程太不保险,有无法预估的风险,这时候分发消息,再通过mq的ack机制保证每个消息都会被正确处理,不过再往上的批处理就不能用mq了,毕竟千万级的MQ堆积对整个集群也有不小的压力。
4、多机房数据同布:大型分布式系统往往会有多个机房,通过DRC消息(Data Replication Center)底层保证最终数据一致。

善用MQ,会让你的项目更灵活.......

你可能感兴趣的:(RabbitMQ知识一览-工作经验)