MQ定义
MQ(message queue),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是消息(message),还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了MQ之后,消息发送上游只需要依赖MQ,不用依赖其他服务
MQ的作用
1、削峰
- 比如,我们有一个订单系统,同时最多只能处理一万次的订单请求,这个处理能力在平常的时候足够处理下单的请求,而在高峰期间,如果同时有两万次下单操作,我们的系统是处理不了的,只能限制订单超过一万后,禁止继续下单。而在使用消息队列的情况下,可以取消这个限制,把一秒内下的订单,存放进MQ,再从MQ中取出订单请求进行处理,虽然这样下单成功的时间会长一点,但也比不能下单的体验要好。
2、解耦
- 比如我们有个订单系统,订单完成的过程包括支付、扣库存、物流派送,如果我们是个单体服务的话,订单系统、支付系统、库存系统、物流系统其中一个服务出问题的话都会导致整个系统挂掉。而我们使用消息队列的话,我们会将订单系统发出的消息存放在MQ中,其他系统从MQ中读取消息进行消费,即便我们其中的一个服务挂掉,也不会影响其他服务的功能,并且系统恢复正常后也将故障过程中产生的消息消费掉。
3、异步 - 异步更多是指的服务间的调用,没有使用MQ的情况,A服务调用B服务,需要等待B服务执行完请求并响应之后A才能继续向下执行,而使用MQ之后,A服务调用B服务后,可以继续后续的业务逻辑,而B收到请求之后进行执行,执行完成之后,发送消息到MQ,而A从MQ中获取到消息后,就能知道B服务已成功返回。
RabbitMQ概念
- RabbitMQ是消息中间件:接收并转发消息。类似一个邮局,我们将我们的信件存放到邮局,由邮递员帮我们把信件送到收件人的手中。我们RabbitMQ就是用于接收、存储和转发消息数据的中间件。
四大核心概念
- 生产者:产生数据并发送消息的一方被称为生产者
- 交换机:交换机是RabbitMQ中非常重要的一个部件,一方面它是接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定的队列还是推送到多个队列,或者是把消息丢弃,这个得有交换机类型决定。
- 队列:队列是RabbitMQ内部使用的一种数据结构,尽管消息流经RabbitMQ和应用程序,但它们只能存储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可以讲消息发送到一个队列,多个消费者可以尝试从一个队列中接收数据。这就是我们使用队列的方式。
- 消费者:消费与接收具有相似的含义,消费者大多时候是一个等待接收消息的查程序。请注意生产者,消费者和消息中间件很多时候不在同一机器上。同一个应用程序既可以是生产者也可以是消费者。
六大模式
- 简单模式
- 工作模式
- 发布订阅模式
- 路由模式
- 主题模式
- 发布确认模式
Broker:接收和分发消息的应用,RabbitMQ Server 就是Message Broker
Virtual host:处于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ server 提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等
Connection:生产者/消费者和broker之间建立的TCP连接
Chnnel:如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP -Connection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQQP method包含了channel id 帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销
Exchange:message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。常用的类型有:direct(point-to-point),topic(publish-subscribe)and fanout(multicast)
安装
1、下载RabbitMQ和erlang
rabbitMQ下载地址
erlang下载地址
2、上传安装包到服务器
3、安装文件(分别按照以下顺序安装)
rpm -ivh erlang-21.3.8.14-1.el7.x86_64.rpm
yum install socat -y
rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm
4、启停命令
开机自启
chkconfig rabbitmq-server on
启动服务
/sbin/service rabbitmq-server start
查看服务状态
/sbin/service rabbitmq-server status
停止服务
/sbin/service rabbitmq-server stop
开启web管理插件
rabbitmq-plugins enable rabbitmq_management
访问客户端地址
注:如果访问不到,可能是防火墙没有关闭,先关闭防火墙再进行访问
5、添加用户
创建账号并设置密码
rabbitmqctl add_user admin 123
设置用户角色为administrator
rabbitmqctl set_user_tags admin administrator
设置用户权限
set_permission [-p < vhostpath >] < user > < conf >< write >< read >
rabbitmqctl set_permissions -p “/” admin “." ".” “.*”
用户admin设置具有/vhost这个virtual host 中所有资源的配置、写、读权限当前用户和角色
查看用户和角色
rabbitmqctl list_users
然后就可以在web界面使用admin/123进行登录了