# RabbitMQ

# 什么是MQ

MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。
在互联网架构中,MQ 是一种非常常 见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不 用依赖其他服务。

# MQ 的分类

# ActiveMQ

优点:单机吞吐量万级,时效性 ms 级,可用性高,基于主从架构实现高可用性,消息可靠性较 低的概率丢失数据

缺点:官方社区现在对 ActiveMQ 5.x 维护越来越少,高吞吐量场景较少使用。

# Kafka

大数据的杀手锏,谈到大数据领域内的消息传输,则绕不开 Kafka,这款为大数据而生的消息中间件, 以其百万级 TPS 的吞吐量名声大噪,迅速成为大数据领域的宠儿,在数据采集、传输、存储的过程中发挥 着举足轻重的作用。

目前已经被 LinkedIn,Uber, Twitter, Netflix 等大公司所采纳。 优点: 性能卓越,单机写入 TPS 约在百万条/秒,最大的优点,就是吞吐量高。时效性 ms 级可用性非 常高,kafka 是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用,消费者采 用 Pull 方式获取消息, 消息有序, 通过控制能够保证所有消息被消费且仅被消费一次;有优秀的第三方 Kafka Web 管理界面 Kafka-Manager;在日志领域比较成熟,被多家公司和多个开源项目使用;功能支持: 功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用

缺点:Kafka 单机超过 64 个队列/分区,Load 会发生明显的飙高现象,队列越多,load 越高,发送消 息响应时间变长,使用短轮询方式,实时性取决于轮询间隔时间,消费失败不支持重试;支持消息顺序, 但是一台代理宕机后,就会产生消息乱序,社区更新较慢;

# RocketMQ

RocketMQ 出自阿里巴巴的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一 些改进。被阿里巴巴广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog 分发等场 景。

优点:单机吞吐量十万级,可用性非常高,分布式架构,消息可以做到 0 丢失,MQ 功能较为完善,还是分 布式的,扩展性好,支持 10 亿级别的消息堆积,不会因为堆积导致性能下降,源码是 java 我们可以自己阅 读源码,定制自己公司的 MQ

缺点:支持的客户端语言不多,目前是 java 及 c++,其中 c++不成熟;社区活跃度一般,没有在 MQ 核心中去实现 JMS 等接口,有些系统要迁移需要修改大量代码

# RabbitMQ

2007 年发布,是一个在 AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最 主流的消息中间件之一。

优点:由于 erlang 语言的高并发特性,性能较好;吞吐量到万级,MQ 功能比较完备,健壮、稳定、易 用、跨平台、支持多种语言 如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支持 AJAX 文档齐全;开源提供的管理界面非常棒,用起来很好用,社区活跃度高;更新频率相当高 https://www.rabbitmq.com/news.html 缺点:商业版需要收费,学习成本较高

# 四大核心概念

# 生产者

产生数据发送消息的程序是生产者

# 交换机

交换机是 RabbitMQ 非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息 推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推 送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定

# 队列

队列是 RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ 和应用程序,但它们只能存 储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可 以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们使用队列的方式

# 消费者

消费与接收具有相似的含义。消费者大多时候是一个等待接收消息的程序。请注意生产者,消费 者和消息中间件很多时候并不在同一机器上。同一个应用程序既可以是生产者又是可以是消费者。

# 安装

注意

需要安装elang环境

官网 (opens new window)

文件在阿里云盘上

  • erlang-21.3-1.el7.x86_64.rpm
  • rabbitmq-server-3.8.8-1.el7.noarch.rpm

安装命令

  1. rpm -ivh erlang-21.3-1.el7.x86_64.rpm
  2. yum install socat -y
  3. rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm

执行完命令之后,安装目录在

/usr/lib/rabbitmq

常用命令(按照以下顺序执行)

  • 添加开机启动 RabbitMQ 服务
    chkconfig rabbitmq-server on
  • 启动服务
    /sbin/service rabbitmq-server start
  • 查看服务状态
    /sbin/service rabbitmq-server status
  • 停止服务(选择执行)
    /sbin/service rabbitmq-server stop
  • 开启 web 管理插件**(需要先关闭MQ)**
    rabbitmq-plugins enable rabbitmq_management

登录密码

默认账户和密码是:guest

# 常见问题

# 登录失败

登录失败

# 添加账户即可

  1. 添加一个新的用户
  2. 创建账号
    rabbitmqctl add_user admin 123 创建一个admin用户,密码是123
  3. 设置用户角色(超级管理员)
    rabbitmqctl set_user_tags admin administrator
  4. 设置用户权限 rabbitmqctl set_permissions -p "/" admin "." "." ".*"
    用户 user_admin 具有/vhost1 这个 virtual host 中所有资源的配置、写、读权限
  5. 当前用户和角色 rabbitmqctl list_users
  6. 再次利用 admin 用户登录,即可登录
  7. 重置命令
    • 关闭应用的命令为: rabbitmqctl stop_ap
    • 清除的命令为 rabbitmqctl reset
    • 重新启动命令为 rabbitmqctl start_app