消息队列&RabbitMQ(1)

1.8k words

消息队列MQ

“消息队列”是在消息的传输过程中 保存消息的容器
消息队列是一种集成接受数据,接受请求、存储数据、发送数据等功能的技术服务


能做什么

解耦

通过消息系统连接应用,数据放入MQ后,不用关心谁消费
系统/应用间相互不影响

异步

同步处理
用户点击发送邮件(0.5s) -> 系统发送邮件(5s) -> 界面显示已经发送(result)
用户得到响应的时间 0.5 + 5 = 5.5

使用消息队列异步处理

  1. 用户点击发送邮件(0.5s) -> 数据放入MQ(0.05s) -> 界面显示已经发送(result)
  2. 消费MQ中的数据,发送邮件(5s)
    用户得到响应的时间 0.5 + 0.05 = 0.55
    可以一边处理用户点击,一边发送邮件

提升用户体验

削峰

将某一段时间的超高流量分摊到更长的一段时间内去消化,避免了流量洪峰击垮系统。
1s/5000请求 -> 放入MQ
从MQ取出 -> 1s/2000消费


RabbitMQ

安装

Erlang
RabbitMQ
rabbitMQ与Erlang的对应版本

注意

  • 选择正确的Erlang版本
  • 以管理员身份安装Erlang
  • 只安装一个Erlang版本
  • 以管理员身份安装RabbitMQ(推荐)
  • RabbitMQ安装路径不要有中文
cookie问题

需要替换cookie位置
RabbitMQ问题解决:TCP connection succeeded but Erlang distribution failed

常用命令

命令帮助文档
1
rabbitmqctl help <commond>
查看RabbitMQ启动状态
1
rabbitmqctl status
客户端管理UI插件
1
rabbitmq-plugins enable rabbitmq_management

浏览器打开http://localhost:15672/
alt

添加用户
1
rabbitmqctl add_user <username> <password>
为用户分配角色
1
rabbitmqctl set_user_tags <username> <role>
设置用户权限
1
rabbitmqctl set_permissions <username> <conf> <write> <read>
查看用户列表
1
rabbitmqctl list_users
创建虚拟主机vhost
1
rabbitmqctl add_vhost myvh
查看虚拟主机vhost列表
1
rabbitmqctl list_vhosts

核心概念

alt

Virtual Host

每一个 RabbitMQ 服务器都能创建出许多虚拟的消息服务器,也就是虚拟主机Virtual Host
简称vhost

每一个vhost都是一个独立的小型 RabbitMQ 服务器,这个 vhost 中会有自己的消息队列、消息交换机以及相应的绑定关系等等,并且拥有自己独立的权限,不同的 vhost 中的队列和交换机不能互相绑定,它们在逻辑上分离,类似环境隔离

交换机Exchange

交换机,接收消息,根据路由键发送消息到绑定的队列
不同的Exchange类型可以用于实现不同消息的模式

交换机类型

预设的7个交换机
alt text

  • (AMQP default)
    默认交换机,默认绑定到所有消息队列
    根据routing key发送给同名的消息队列

  • amq.direct
    普通的直连交换机,可以自定绑定
    根据routing key寻找消息队列(可以自定义)

交换机特性

alt text

  • D: 持久化
消息队列Queue

exclusive
是否排他

  • 该队列仅对首次声明它的连接可见
  • 基于Connection可见,同一Connection的不同Channel可以访问
  • 不允许其他Connection创建同名排他队列
  • 连接断开时自动删除,无论该队列是否持久化

auto delete自动删除
alt text
需要至少一个消费者连接到这个消息队列,没有消费者连接时自动删除

应答模式
alt text

  • Nack message requeue true
    拒绝消息,不会将消息取出,并且重新排队
  • Automatic ack
    确认应答,确认后消息会从队列中移除
  • Reject requeue true
  • Reject requeue false

信道Channel

网络信道,几乎所有的操作都在Channel中进行,是进行消息读写的通道

注意

消息队列接收到应答后,对应的消息将被删除,一般使用手动应答

一个消费者对应一个队列

参考

什么是消息队列

消息队列及常见消息队列介绍

RabbitMQ 快速入门(精讲)