RabbitMQ学习笔记(上)

175 阅读4分钟

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

什么是中间件

中间件,是提供软件和软件之间连接的软件,以便于软件各部件之间的沟通。

同步直接调用的问题

  • 业务调用链过长,用户等待时间长
  • 部分组件故障会瘫痪整个业务
  • 业务高峰期没有缓冲

异步直接调用的问题

  • 业务高峰期时产生大量的异步线程,造成线程池不够用或者内存爆满

使用消息中间件的优势

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

使用消息中间件的作用

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

主流的消息中间件技术

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

RabbitMQ介绍

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

优点

  • 基于erlang,支持高并发
  • 支持多种平台,多种客户端,文档齐全
  • 可靠性高
  • 在互联网公司有较大规模的应用,社区活跃度高

缺点:

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

RabbitMQ高性能的原因

erlang语言,爱立信开发,一门专门为交换机软件开发诞生的编程语言

erlang特点

  • 通用的面向并发的编程语言,适用于分布式系统
  • 基于虚拟机解释运行,跨平台部署
  • erlang进程间上下文切换效率远高于C语言和Java,进一步提高了RabbitMQ的并发性能
  • erlang的网络性能有着和原生Socket一样的延迟,使得RabbitMQ的网络IO性能极高

AMQP协议介绍

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

image.png

核心概念——Exchange

  • 在AMQP协议或者是RabbitMQ实现中,最核心的组件是Exchange
  • Exchange承担RabbitMQ的核心功能——路由转发
  • Exchange有多个种类,配置多变

一个有趣的网站:tryrabbitmq.com

Exchange解析

  • Exchange是AMQP协议和RabbitMQ的核心组件
  • Exchange的功能是根据绑定关系和路由键为消息提供路由,将消息转发至相应的队列
  • Exchange有4种类型:Direct / Topic / Fanout / Headers,其中Headers使用很少,以前三种为主
    • direct:Message中的Routing Key如果和Binding Key一致, Direct Exchange则将message发到对应的queue中
    • fanout:每个发到Fanout Exchange的message都会分发到所有绑定的queue上去
    • topic:根据Routing Key及通配规则,Topic Exchange将消息分发到目标Queue中
      • 全匹配:与direct类似
      • Binding Key中的#:匹配任意个数的word
      • Binding Key中的*:匹配任意1个word

如何保证消息可靠性

发送方

  • 发送端确认机制
  • 消息返回机制

消费放

  • 消费端确认机制
  • 消费端限流机制

RabbitMQ自身

  • 消息过期时间
  • 死信队列

实际开发中经验及小结

善用RabbitMQ高级特性

  • 对于RabbitMQ的高级特性,要善加利用
  • 接收端确认、死信队列是非常常用的特性

慎用RabbitMQ高级特性

  • 不要无限追求高级,用上所有RabbitMQ的高级特性
  • 重回队列、发送端确认是不常用的特性,谨慎使用

善用RabbitMQ管控台

  • 管控台是RabbitMQ调试的利器
  • RabbitMQ高级特性多数都涉及交换机、队列的属性配置,可以在管控台确认配置是否生效
  • RabbitMQ高级特性很多都可以在管控台进行试验