一 树立清晰的RabbitMQ

1.1 理解消息中间件

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

微信之间的沟通,“微信” 就是消息中间件

 

1.2 同步直接调用的问题

业务调用链过长,用户等待时间长

部分组件故障会雍疾整个业务

业务高峰期没有缓冲

image-20221115140756375

image-20221115140847574

 

1.3 异步直接调用的问题

解决了

业务调用链过长,用户等待时间长

部分组件故障会雍疾整个业务

业务高峰期没有缓冲

没有解决

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

image-20221115142016412

 

 

1.4 使用消息中间

image-20221115142245444

image-20221115195439311

1.3.1 使用消息中间件的优势

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

1.3.2 使用消息中间件的作用

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

1.5 总结

消息中间件是软件和软件之间发送消息的软件 消息中间件最大的作用是异步处理、系统解耦

 

2.1 主流消息中间件怎么选

 

image-20221115144753942

2.1.1 ACTIVEMQ

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

优点:

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

缺点:

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

 

2.1.2 RabbitMQ

image-20221115145622643

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

 

优点:

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

缺点:

a.Erlang语音较为小众,不利于二次开发

b.代理架构下,中央节点增加了延迟,影响性能

c.使用AMQP协议,使用起来有学习成本

 

2.1.3 RocketMQ

image-20221115150003733

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

 

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

 

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

 

2.1.4 Kafka

image-20221115150646691

Linkedln开发的分布式的日志提交系统

独特的分区特性,适用于大数据

系统性能高效、可扩展良好

可复制、可容错

 

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

 

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

2.2 总结

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

 

3.1 RabbitMQ高性能的原因

3.1.1 ERLANG

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

 

Erlang特点:

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

 

3.1.2 谁在用RabbitMQ

image-20221115154209854

“框架团队和运维团队的同学很自信,(RabbitMQ)自从搭建以来,没有出过任何问题,如果选择RabbitMQ,就能够得到运维团队的天然支持。

——饿了么架构师

image-20221115154255612

RabbitMQ在银行和金融领域也有相当高的占有率,甚至微服务间的通信大部分依靠消息, RabbitMQ使用量最大

 

3.2 总结

RabbitMQ底层使用Erlang实现,天生具有高性能基因 RabbitMQ在互联网和金融领域都有广泛的应用

 

4.1 AMQP协议介绍

你在楼下咖啡店买了无数杯咖啡后,和咖啡店小姐姐步入爱河,后来终于到了谈婚论嫁的时候

你这才发现结婚的程序如此繁琐,婚纱照、结婚照、结婚证准备婚礼、准备喜糖、回请双方同事、接亲时还有10关大考验 <-这是“协议”,指的是一般规范

 

你们商量后,决定婚礼就去海边旅行结婚,喜糖就用大白兔的,回请就给同事发个红包,但是10关大考验变成了15关

<- 这是实现,指的是具体情况

 

4.2 学习AMQP的意义

AMQP协议作为RabbitMQ的规范,规定了RabbitMQ对外接口

学会了AMQP协议的使用,就基本掌握了RabbitMQ的使用

学会了AMQP协议的概念,就基本掌握了RabbitMQ的核心概念

 

image-20221115155345983

Broker:接收和分发消息的应用, RabbitMQ 就是Message Broker

Virtual Host: 虚拟Broker,将多个单元隔离开

Connection: publisher / consumer和broker之间的TCP连接

Channel: connection内部建立的逻辑连接,通常每个线程创建单独的channel

Routing Key: 路由键,用来指示消息的路由转发,相当于快递的地址

Exchange:交换机,相当于快递的分拨中心

Queue:消息队列,消息最终被送到这里等待consumer取走

Binding: exchange和queue之间的虚拟连接,用于message的分发依据

4.3 AMQP协议的核心概念-Exchange

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

4.5 Exchange的作用

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

 

4.5.1 Direct Exchange

Message中的Routing Key如果和Binding Key-致,Direct Exchange则将message发到对应的queue中

image-20221115160826499

4.5.2 Fanout Exchange

每个发到Fanout Exchange的message都会分发到所有绑定的queue上去

image-20221115161000357

 

4.5.3 Topit Exchange

根据Routing Key及通配规则, Topic Exchange将消息分发到目标Queue中 全匹配:与Direct类似Binding Key中的 #:匹配任意个数的word Binding Key中的*:匹配任意1个word

 

举例:咖啡、奶茶、果汁,三种饮料

咖啡含有咖啡因,冷热均可,苦甜均可, Binding Key:caffeine.#

奶茶不含有咖啡因,热饮,甜味, Binding Key:nocaffeine.hot.sweet

果汁不含有咖啡因,冷热均可,甜味, Binding Key:nocaffeine.*.sweet

 

若条件是:无咖啡因、热饮、甜味

image-20221115162619998

若条件是:有咖啡因、冷饮、苦味

image-20221115162845396

若条件是:无咖啡因、冷饮、甜味

image-20221115162756333

 

4.6 模拟Exchange模型

使用RabbitMQ Simulator (tryrabbitmq.com)

image-20221115164236916

4.7 总结

AMQP协议直接决定了RabbitMQ的内部结构和外部行为 对于发送者来说,将消息发给特定的Exchange 消息经过Exchange路由后,到达具体队列 消费者将消息从监听的队列中取走

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

 

5.1 RabbitMQ安装

RabbitMQ是基于Erlang的跨平台应用, Windows / Linux/MacOS 都可以安装 生产环境绝大多数都是Linux操作系统, Windows / MacOS般作为本地开发使用 一定要在官网或官方渠道下载安装,一旦有后门的应用进入生产环境后果不堪设想

下载并安装Erlang OTP (Open Telecom Platform):

https://www.erlang.org/downloads

下载并安装RabbitMQ: https://www.rabbitmq.com/

步骤

“Get Started””Download + Installation””Windows Installer””Using the official installer”

安装完成后,查看系统服务中会出现RabbitMQ

image-20221115165906448

 

6.1 网页端管理工具

RabbitMQ网页端管理工具也叫管理控制台、管控台

管理控制台是RabbitMQ最常用的管理、配置工具

管理控制台对于业务的开发、调试也非常有用

 

启用前端插件

启动应用: rabbitmq-plugins enable rabbitmq_management

浏览器打开: 127.0.0.1:15672

默认用户名: guest默认密码: guest

 

进入目录运行

image-20221115173225886

image-20221115173201435

练习

使用RabbitMQ管控台配置”Exchange解析”小节的三种Exchange

 

7.1 命令行工具

7.1.1 使用场景

生产环境、端口限制等不便打开网页端工具的场景

使用脚本自动化配置RabbitMQ

 

7.1.2 使用口诀

想看什么就List什么 想清空什么就purge什么 想删除什么就Delete 什么一切问题记得使用–help

 

7.1.3 命令

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


新建用户: 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
离开集群:rabbitmqctlreseti

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

 

8.1 本章总结

  1. RabbitMQ高性能的原因中

  2. AMQP协议

  3. Exchange 解析

  4. RabbitMQ快速安装

  5. 网页端管理工具

  6. 命令行工具

原文地址:http://www.cnblogs.com/mrwyk/p/16895002.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性