RabbitMQ 快速入门

官网:https://www.rabbitmq.com/

入门教程:https://www.rabbitmq.com/tutorials

最新版本:4.0.2

版本参考:JDK17、Maven Or Gradle

1、简介

RabbitMQ是一个可靠且成熟的消息传递和流代理,易于部署在云环境、本地和本地机器上。它目前被全球数百万人使用。

2、为什么使用

公司业务场景核心:解耦、异步、削峰

2.1、解耦

A系统发数据给到BCD系统,如果E系统需要接入?C系统不需要了?A系统的负责人就需要来回修改接口对接其他系统。

如果使用MQA系统产生一条数据,发送到MQ中,那个系统需要数据自己去MQ消费。如果新的系统需要数据,直接从MQ中消费;某个系统不需要数据的话,取消消费这个MQ即可。这样A系统不需要考虑谁发送数据给谁,不需要考虑是否调用成功、失败超时等问题。

总结:通过一个MQPub/Sub发布订阅消息模型,A系统就和其他系统彻底耦合了。

2.2.1、项目应用

车站系统通过控制命令下发给各个设备,其中车站的设备通常包含:闸机半自动售票机自动售票机手持机等设备

如果按照常规的同步方式来对接不同的设备,这将使得系统冗余的代码很多。当车站增减一个设备就可能需要重新对接接口,造成系统耦合性很高,这样的效率不高且不优雅。

所以当系统需要发送命令(生产一个数据),将数据放到MQ中,不需要知道哪个设备接收消息成功或者失败,其中需要消费的设备自己去订阅并且获取相应的消息即可。这样就可以达到系统下发设备控制命令,不同设备响应。

2.2、异步

A系统接收请求,需要本地入库,还需要BCD三个系统入库,本地入库(3ms),BCD300ms+400ms+500ms),用户体验很差等待时间太长。业内请求需要做到 200ms 以内,对用户几乎无感。

使用MQ,A系统连续发送3条消息到消息队列,假如消耗5ms,请求花了 5 + 3 = 8ms ,对于用户来说就是点了一个按钮返回很快。

2.3、削峰

每天一段时间,A系统风平浪静,每秒请求数量就50个。结果每次一到 12:00~13:00,每秒并发请求数量突然暴增到5k+条。但是系统是直接基于MySQL,大量请求涌入MySQL,每秒执行约5kSQL, 一般情况下MySQL 每秒可抗 2k请求,5k的请求可能打死MySQL,导致无法使用。 一旦过了高峰,到了下午就到了低峰期,每秒请求数量 50 左右,对整个系统没有多少压力了。

如果使用MQ,每秒 5k 请求写入 MQ , A系统每秒最多处理 2k 个请求,因为 MySQL每秒最多请求 2k 个请求。A系统从MQ中慢慢拉取请求,每秒2k个请求,不超过自己每秒最大的请求数量即可。所以再高峰期,A系统不会挂掉。而MQ每秒进 5k ,出 2k,请求就会在高峰期积压可能多大十几万甚至百万的消息再 MQ中。

总结:短暂的挤压后是可允许的,等到高峰期过后,每秒进入MQ的消息降低很多,但是系统依然按照 2k 的请求取消费,A系统很快的就会把挤压解决掉了。

2.4、并行

2.5、排队

3、消息队列工具 RabbitMQ

3.1、常见MQ产品

  • ActiveMQ:基于JMSJava Message Service)协议,java语言,jdk

  • RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好

  • RocketMQ:基于JMS,阿里巴巴产品,目前交由Apache基金会

  • Kafka:分布式消息系统,高吞吐量

3.2、RabbitMQ基础概念

Broker:简单来说就是消息队列服务器实体

​ Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列

​ Queue:消息队列载体,每个消息都会被投入到一个或多个队列

​ Binding:绑定,它的作用就是把 exchange和 queue按照路由规则绑定起来

​ Routing Key:路由关键字, exchange根据这个关键字进行消息投递

​ vhost:虚拟主机,一个 broker里可以开设多个 vhost,用作不同用户的权限分离

​ producer:消息生产者,就是投递消息的程序

​ consumer:消息消费者,就是接受消息的程序

​ channel:消息通道,在客户端的每个连接里,可建立多个 channel,每个 channel代表一个会话任务

3.3、五种消息模型

RabbitMQ提供了6种消息模型,但是第6种其实是RPC,并不是MQ,因此不予学习。那么也就剩下5种。

但是其实3、4、5这三种都属于订阅模型,只不过进行路由的方式不同。

  • 基本消息模型:生产者–>队列–>消费者

  • work消息模型:生产者–>队列–>多个消费者竞争消费

  • 订阅模型-Fanout:广播模式,将消息交给所有绑定到交换机的队列,每个消费者都会收到同一条消息

  • 订阅模型-Direct:定向,把消息交给符合指定 rotingKey 的队列

  • 订阅模型-Topic 主题模式:通配符,把消息交给符合routing pattern路由模式) 的队列

4、消息不丢失

4.1、MQ角度

  1. 生产者不丢数据

  2. MQ服务器不丢数据

  3. 消费者不丢数据

保证消息不丢失有两种实现方式

  • 开启事务模式 (不推荐)

  • 消息息确认模式(生产者,消费者)

说明:开启事务会大幅降低消息发送及接收效率,使用的相对较少,因此我们生产环境一般都采取消息确认模式

4.2、消息确认

1、消息持久化

如果希望RabbitMQ重启之后消息不丢失,那么需要对以下3种实体均配置持久化

  • Exchange
  • Queue
  • message

声明exchange时设置持久化(durable = true)并且不自动删除 (autoDelete = false)

boolean durable = true;
boolean autoDelete = false;
channel.exchangeDeclare("dlx", TOPIC, durable, autoDelete, null)

声明queue时设置持久化(durable = true)并且不自动删除 (autoDelete = false)

boolean durable = true;
boolean autoDelete = false;
channel.queueDeclare("order-summary-queue", durable, false, autoDelete, queueArguments);

发送消息时通过设置(deliveryMode=2)持久化消息:

AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.contentType("application/json")
.deliveryMode(2)
.priority(0)
.build();
channel.basicPublish("order", "order.created", false, properties, "sample-data".getBytes())
2、发送确认

有时,业务处理成功,消息也发了,但是我们并不知道消息是否成功到达了rabbitmq,如果由于网络等原因导致业务成功而消息发送失败,那么发送方将出现不一致的问题,此时可以使用rabbitmq的发送确认功能,即要求rabbitmq显式告知我们消息是否已成功发送。

3、手动消费确认

有时,消息被正确投递到消费方,但是消费方处理失败,那么便会出现消费方的不一致问题。比如:订单已创建的消息发送到用户积分子系统中用于增加用户积分,但是积分消费方处理却都失败了,用户就会问:我购买了东西为什么积分并没有增加呢?

要解决这个问题,需要引入消费方确认,即只有消息被成功处理之后才告知rabbitmqack,否则告知rabbitmqnack

RabbitMQ 快速入门的更多相关文章

  1. 中小研发团队架构实践之RabbitMQ快速入门及应用

    原文:中小研发团队架构实践之RabbitMQ快速入门及应用 使用过分布式中间件的人都知道,程序员使用起来并不复杂,常用的客户端API就那么几个,比我们日常编写程序时用到的API要少得多.但是分布式中间 ...

  2. RabbitMQ(一):RabbitMQ快速入门

    RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.作为一名合格的开发者,有必要对RabbitMQ有所了解,本文是RabbitMQ快速入门文章. RabbitMQ ...

  3. RabbitMQ快速入门

    最近一段项目实践中大量使用了基于RabbitMQ的消息中间件,也积累的一些经验和思考,特此成文,望大家不吝赐教. 本文包括RabbitMQ基本概念.进阶概念.实践与思考等三部分,着重强调相关概念和基于 ...

  4. RabbitMQ快速入门python教程

    摘要:HelloWorld 简介 RabbitMQ:接受消息再传递消息,可以视为一个“邮局”.发送者和接受者通过队列来进行交互,队列的大小可以视为无限的,多个发送者可以发生给一个队列,多个接收者也可以 ...

  5. RabbitMQ基础入门篇

    下载安装 Erlang RabbitMQ 启动RabbitMQ管理平台插件 DOS下进入到安装目录\sbin,执行以下命令 rabbitmq-plugins enable rabbitmq_manag ...

  6. RabbitMQ学习总结 第二篇:快速入门HelloWorld

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  7. 消息中间件——RabbitMQ(五)快速入门生产者与消费者,SpringBoot整合RabbitMQ!

    前言 本章我们来一次快速入门RabbitMQ--生产者与消费者.需要构建一个生产端与消费端的模型.什么意思呢?我们的生产者发送一条消息,投递到RabbitMQ集群也就是Broker. 我们的消费端进行 ...

  8. 快速入门分布式消息队列之 RabbitMQ(3)

    目录 目录 前文列表 前言 通道 Channel 一个基本的生产者消费者实现 消费者 生产者 运行结果 应用预取计数 应用 ACK 机制 最后 前文列表 快速入门分布式消息队列之 RabbitMQ(1 ...

  9. 快速入门分布式消息队列之 RabbitMQ(2)

    目录 目录 前文列表 RabbitMQ 的特性 Message Acknowledgment 消息应答 Prefetch Count 预取数 RPC 远程过程调用 vhost 虚拟主机 插件系统 最后 ...

  10. 快速入门分布式消息队列之 RabbitMQ(1)

    目录 目录 前言 简介 安装 RabbitMQ 基本对象概念 Message 消息 Producer 生产者 Consumer 消费者 Queue 队列 Exchange 交换机 Binding 绑定 ...

随机推荐

  1. 阿里面试官常问的TCP和UDP,你真的弄懂了吗?

      前  言 作为软件测试,大家都知道一些常用的网络协议是我们必须要了解和掌握的,面试的时候面试官也非常喜欢问一些协议相关的问题,其中有两个协议因为非常基础,出现的频率非常之高,分别是 "T ...

  2. SpringBoot——基础配置

    基础配置 配置格式 SpringBoot提供了多种属性配置方法 application.properties server.port=80 application.yml server: port: ...

  3. 3. 无重复字符的最长子串 Golang实现

    题目描述 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度. 注意区分子串和子序列. 示例 3: 输入: s = "pwwkew" 输出: 3 解释: 因为无重复 ...

  4. [rCore学习笔记 029] 动态内存分配器实现-以buddy_system_allocator源码为例

    在上一部分,我们讲了动态内存分配器的原理是维护一个堆,而且是实现各种连续内存分配方法. 但是上一部分是直接通过引用了buddy_system_allocator来解决的问题. 那么对于内存分配算法有兴 ...

  5. linux kernel 中tracing buffer

    Linux内核的tracing buffer是一种用于存储内核跟踪数据的特殊缓冲区.它用于记录内核中发生的事件和活动,以帮助开发人员进行性能分析和故障排查.该缓冲区可以在内核运行时启用,并且可以通过特 ...

  6. webpack与grunt、gulp的不同

    首先,它们的共同点三者都是前端构建工具,grunt和gulp早期比较流行,现在 webpack 是主流: 区别:grunt 和 gulp 基于 任务和流 : webpack 基于入口文件,webpac ...

  7. 3.flask 源码解析:路由

    目录 一.flask 源码解析:路由 1.1 构建路由规则 1.2 werkzeug 路由逻辑 1.3 flask 路由实现 1.4 match 实现 Flask 源码分析完整教程目录:https:/ ...

  8. kotlin协程——>共享的可变状态与并发

    共享的可变状态与并发 协程可⽤多线程调度器(⽐如默认的 Dispatchers.Default)并发执⾏.这样就可以提出所有常⻅的并发 问题.主要的问题是同步访问共享的可变状态.协程领域对这个问题的⼀ ...

  9. kotlin集合——>迭代器、区间与数列

    1.迭代器 对于遍历集合元素,Kotlin 标准库支持 迭代器 的常用机制⸺对象可按顺序提供对元素的访问权限,而 不会暴露集合的底层结构.当需要逐个处理集合的所有元素(例如打印值或对其进行类似更新)时 ...

  10. KubeSphere 在直播应用中的实践

    本文是上海站 Meetup 讲师唐明根据其分享内容整理的文章. 引言 目前媒体的主流传播渠道已从传统的报纸.广播.电视转向了互联网,各种视频及社交 App 成为了人们获取资讯的首选途径.苏州市广播电视 ...