RabbitMQ

RabbitMQ学习笔记(一)——消息中间件入门

Nick · 3月23日 · 2022年 · 本文3891字 · 阅读10分钟839

消息中间件简介

什么是消息?
消息是信息的载体。

什么是中间件?
中间件(Middleware),是提供软件和软件之间连接的软件,以便于软件各部件之间的沟通。

使用消息中间件的优势:

  • 业务调用链短,用户等待时间短
  • 部分组件故障不会瘫痪整个业务
  • 业务高峰期有缓冲
  • 业务高峰期时不会产生大量的异步线程。

使用消息中间件的作用:

  • 异步处理
  • 系统解耦
  • 流量的削峰和流控
  • 消息广播
  • 消息收集
  • 最终一致性

举例:

没有使用消息中间件之前:
RabbitMQ学习笔记(一)——消息中间件入门-左眼会陪右眼哭の博客

使用消息中间件之后:
RabbitMQ学习笔记(一)——消息中间件入门-左眼会陪右眼哭の博客

四大消息中间件介绍

RabbitMQ学习笔记(一)——消息中间件入门-左眼会陪右眼哭の博客

ACTIVE MQ

RabbitMQ学习笔记(一)——消息中间件入门-左眼会陪右眼哭の博客

特点:

  • 由Apache出品,Java开发,支持JMS1.1协议和J2EE1.4规范。
  • 支持广泛的连接协议:
  • OpenWire/STOMP/REST/XMPP/AMQP支持多种语音客户端,支持插件
  • 管理方便,便于配置集群代理·

优点:
a.基于JAVA,跨平台运行
b.可以用JDBC连接多种数据库
c.有完善的界面、监控、安全机制
d.自动重连和错误重试

缺点:
a.社区活跃度不及RabbitMQ
b.目前重心放到6.0产品Apollo,对5的Bug维护较少
c.不适合用于上千个队列的应用场景

RABBITMQ

RabbitMQ学习笔记(一)——消息中间件入门-左眼会陪右眼哭の博客
特点:

  • 当前最主流的消息中间件。
  • 高可靠性,支持发送确认,投递确认等特性
  • 高可用,支持镜像队列
  • 支持插件

优点:
a.基于Erlang,支持高并发
b.支持多种平台,多种客户端,文档齐全
c.可靠性高
d.在互联网公司有较大规模的应用,社区活跃度高

缺点:
a.Erlang语言较为小众,不利于二次开发
b.代理架构下,中央节点增加了延迟,影响性能c.使用AMQP协议,使用起来有学习成本
c.使用AMQP协议,使用起来有学习成本

Apache RocketMQ

RabbitMQ学习笔记(一)——消息中间件入门-左眼会陪右眼哭の博客

特点:

  • 阿里巴巴团队开发,经受双十一考验
  • 能够保证严格的消息顺序
  • 亿级消息堆积能力
  • 丰富的消息拉取模式

优点:
a.基于Java,方便二次开发
b.单机支持1万以上持久化队列
c.内存与磁盘都有一份数据,保证性能+高可用
d.开发度较活跃,版本更新很快

缺点:
a.客户端种类不多,较成熟的是Java及C++
b.没有Web 管理界面,提供了一个CLI(命令行界面)
c.社区关注度及成熟度不如RabbitMQ

Kafka

RabbitMQ学习笔记(一)——消息中间件入门-左眼会陪右眼哭の博客

特点:

  • LinkedIn开发的分布式的日志提交系统
  • 独特的分区特性,适用于大数据系统
  • 性能高效、可扩展良好
  • 可复制、可容错

优点:
a.原生的分布式系统
b.零拷贝技术,减少IO操作步骤,提高系统吞吐量
c.快速持久化:可以在o(1)的系统开销下进行消息持久化
d.支持数据批量发送和拉取

缺点:
a.单机超过64个队列/分区时,性能明显劣化
b.使用短轮询方式,实时性取决于轮询间隔时间
c.消费失败不支持重试
d.可靠性比较差

总结

  • ActiveMQ最“老”,老牌,但维护较慢
  • RabbitMQ最“火”,适合大小公司,各种场景通杀
  • RocketMQ最“猛”,功能强,但考验公司运维能力
  • Kafka最“强”,支持超大量数据,但消息可靠性弱

RabbitMQ高性能的原因

底层的语言和平台:Erlang
RabbitMQ学习笔记(一)——消息中间件入门-左眼会陪右眼哭の博客

由爱立信公司开发(Ericsson Language)
一门为交换机软件开发诞生的编程语言

Erlang特点:

  • 通用的面向并发的编程语言,适用于分布式系统
  • 基于虚拟机解释运行,跨平台部署
  • 进程间上下文切换效率远高于C语言
  • 有着和原生Socket—样的延迟

谁在用RabbitMQ?
RabbitMQ学习笔记(一)——消息中间件入门-左眼会陪右眼哭の博客

RabbitMQ学习笔记(一)——消息中间件入门-左眼会陪右眼哭の博客

AMQP协议的作用

什么是AMQP协议?
协议指的是规范,实现指的是具体情况。RabbitMQ软件的本身就是对AMQP协议的实现。

学AMQP协议的意义:

  • AMQP协议作为RabbitMQ的规范,规定了RabbitMQ对外接口
  • 学会了AMQP协议的使用,就基本掌握了RabbitMQ的使用
  • 学会了AMQP协议的概念,就基本掌握了RabbitMQ的核心概念

图解AMQP协议
RabbitMQ学习笔记(一)——消息中间件入门-左眼会陪右眼哭の博客

a. Broker:接收和分发消息的应用,RabbitMQ就是MessageBroker
b. Virtual Host:虚拟Broker,将多个单元隔离开
c. Connection: publisher / consumer和broker之间的TCP连接
d. Channel: connection内部建立的逻辑连接,通常每个线程创建单独的channel
e. Routing Key:路由键,用来指示消息的路由转发,相当于快递的地址
f. Exchange:交换机,相当于快递的分拨中心
g. Queue:消息队列,消息最终被送到这里等待consumer取走
h. Binding: exchange和queue之间的虚拟连接,用于message的分发依据

Exchange——AMQP协议的核心概念

  • Exchange是AMQP协议和RabbitMQ的核心组件,承担RabbitMQ的核心功能——路由转发
  • Exchange的功能是根据绑定关系和路由键为消息提供路由,将消息转发至相应的队列
  • Exchange有4种类型:Direct / Topic / Fanout / Headers,其中Headers使用很少,以前三种为主

三种类型Exchange

  1. Direct Exchange
    Message中的Routing Key如果和Binding Key一致,Direct Exchange则将message发到对应的queue中
    RabbitMQ学习笔记(一)——消息中间件入门-左眼会陪右眼哭の博客

  2. Fanout Exchange
    每个发到Fanout Exchange的message都会分发到所有绑定的queue上去
    RabbitMQ学习笔记(一)——消息中间件入门-左眼会陪右眼哭の博客

  3. Topic Exchange
    根据Routing Key及通配规则,Topic Exchange将消息分发到目标Queue中
    全匹配:与Direct类似
    Binding Key中的 # :匹配任意个数的wordBinding Key中的 * :匹配任意1个word
    RabbitMQ学习笔记(一)——消息中间件入门-左眼会陪右眼哭の博客

小结:
Exchange主要有3种类型:Direct / Topic / Fanout
Direct(直接路由) : Routing Key = Binding Key,容易配置和使用
Fanout (广播路由):群发绑定的所有队列,适用于消息广播
Topic(话题路由)︰功能较为复杂,但能降级为Direct,建议优先使用,为以后拓展留余地

RabbitMQ安装

Windows安装

  1. 下载并安装Erlang OTP(Open Telecom Platform):
    https://www.erlang.org/downloads
    https://www.erlang-solutions.com/resources/download.html

  2. 下载并安装RabbitMQ: https://www.rabbitmq.com
    "Get Started”"Download + Installation”>"Windows Installer""Using the official instaler"
    安装完成后,查看系统服务中会出现RabbitMQ

Docker安装(开发环境推荐)
docker run -di --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

进入控制台:docker exec -it rabbitmq /bin/bash
进入控制台后:cd sbin/ 就可以使用rabbitmq的客户端命令
查看插件帮助:rabbitmq-plugins --help
查看插件列表:rabbitmq-plugins list

网页端管理工具

  • RabbitMQ网页端管理工具也叫管理控制台、管控台
  • 管理控制台是RabbitMQ最常用的管理、配置工具
  • 管理控制台对于业务的开发、调试也非常有用

启用网页端管理工具:
启动应用: rabbitmq-plugins enable rabbitmq_management
浏览器打开:127.0.0.1:15672
默认用户名: guest 默认密码: guest

命令行工具使用:
使用场景

  1. 生产环境、端口限制等不便打开网页端工具的场景
  2. 使用脚本自动化配置RabbitMQ
    使用口诀:
    想看什么就List什么
    想清空什么就purge什么
    想删除什么就Delete什么
    一切问题记得使用--help

状态查看相关命令:
查看状态: rabbitmqctl status
查看绑定:rabbitmqctl list_bindings
查看channel: rabbitmqctl list_channels
查看connection: rabbitmqctl list_connections
查看消费者: rabbitmqctl list_consumers
查看交换机: rabbitmqctl list_exchanges

队列相关命令:
查看队列: rabbitmqctl list_queues
删除队列: rabbitmqctl delete_queue
清空队列: rabbitmqctl purge_queue

用户相关命令:
新建用户:rabbitmqctl add_user
修改用户密码: rabbitmqctl change_password
删除用户: rabbitmqctl delete_user
查看用户: rabbitmqctl list_users
设置用户角色: rabbitmqctl rabbitmqctl set_user_tags

应用启停命令:
启动应用:rabbitmqctl start_app
关闭应用: rabbitmqctl stop_app,保留Erlang虚拟机(暂停)
关闭应用: rabbitmqctl stop,并关闭Erlang虚拟机

集群相关命令:
加入集群: rabbitmqctl join_cluster
离开集群: rabbitmqctl reset

镜像队列命令:
设置镜像队列: rabbitmqctl sync_queue
取消镜像队列: rabbitmqctl cancel_sync_queue

0 条回应
在线人数:1人 来访统计
说谎
林宥嘉
隐藏