【RabbitMQ(一)】:基本介绍 | 配置安装与快速入门

应该是新年前最后一篇博客了,明天浅浅休息一下,提前祝大家新年快乐捏!😊😊😊

01. 基础理解

1.1 同步调用和异步调用

👉 同步调用 的时候调用者会 阻塞 等待被调用函数或方法执行完成,并且在完成后才继续执行后续代码。

💡 那这样会出现什么问题呢?

回想一下平时充话费的场景,当我们点击支付了之后,当余额被扣减完之后就可以直接退出了,其实是没有等待服务状态更新,和后面进行的很多业务的,比如短信通知服务也是在充值以后一段时间才会通知的,这其实就是一种异步的方式。

👉试想一下如果是同步调用会出现什么场景?

​ 答案是界面会卡住,等到一切短信发送完成才能得到 结果,这就导致了等待时间的延长;将视角再放的深一点,如果将这些业务都做成同步的话,其中一个业务的失败会导致所有业务的 级联失败,也就是如果短信通知业务失效了,钱甚至会被退回来,这就导致了用户体验的问题;再将视角放到程序员身上,如果设计一个同步业务,有新的业务加入进来,要去该原来的代码,这就导致了 耦合性很高 的问题。

不难总结出来同步调用的问题

  • 加需求的问题(耦合性很差)
  • 性能的问题,客户等待时间过长
  • 一个调用的失败导致级联失败

但任何事物都有两面性,同步调用的优势就是: 立即得到响应的结果 时效性非常好,很多业务必须要一次执行完毕且需要结果才能进行,比如银行转账,需要保证双方都成功才能进行。

👉 而异步调用正好是相反,对于一些不是那么急于知道结果的业务,可以在返回给用户结果后再执行,这就引出了它的优势:首先是 解耦合,业务不需要写在一个代码上,而是可以以微服务的形式拆分开;其次,**立即返回 **给 用户结果,用户无需等待;还可以实现 故障的隔离,一个服务的问题不会导致整个业务的级联失败;最后是可以缓存消息,当消息很多的时候可以 错峰执行,达到削峰填谷的作用。

但缺点就是不能立刻得到处理的结果,时效性比较差,同时实现依赖于 Broker(代理),如果 Broker 出现问题会导致严重的后果。

👉 异步调用中会出现三个角色,分别是消息发送者、消息代理、和消息接收者;消息发送者发送消息到消息代理然后就可以继续执行,消息代理负责将消息转发给消息接收者,剩余的部分在消息接收者那里执行。

1.2 什么是 MQ?

👉 MQ(Message Queue),消息队列,字面来看就是存放消息的队列;也就是异步调用中的 Broker;这个命名也就解释了它的实现机制:MQ 提供了一种 异步通信 的方式,允许将消息发送到队列中,并由接收者从队列中获取和处理这些消息。MQ 通常被用于解耦和增强系统的可伸缩性、可靠性和灵活性。

👉 下面来看一下常见的 MQ Broker:

RabbitMQActiveMQRocketMQKafka
公司 / 社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala & Java
协议支持AMQP, XMPP, SMTP, STOMPOpenWire, STOMP, REST, REST, SMPP, AMQP自定义协议自定义协议
可用性一般
单机吞吐量一般非常高
消息延迟微秒级毫秒级毫秒级毫秒以内
消息可靠性一般一般

💡 协议:是在通信系统中,用于规定数据传输格式、通信规则和通信过程的一组规范。

💡 单机吞吐量:单个计算机或服务器上处理的消息数量或请求数量的度量

选择 RabbitMQ 的原因是因为它的社区生态好,且各方面性能都很优异,很多公司也都在使用。

02. RabbitMQ介绍即安装方式

2.1 RabbitMQ 安装

这里采用 Docker 的安装方式:

💡 虚拟机的安装与配置,参考我的博客 从零开始 Linux(一):基础介绍与常用指令总结

💡 如果没有安装 Docker 的朋友可以看这一部分安装一下

  • 卸载旧版本的 Docker

    sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
    
  • 安装 yum 工具

    $ sudo yum install -y yum-utils
    
  • 配置 Docker 的 yum 源

    $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
  • 安装 Docker

    $ sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    
  • 检验是否安装成功

    $ docker -v
    
  • 启动 Docker

    $ sudo systemctl start docker
    
  • 检测是否启动成功

    $ docker images
    

👉 接下来是使用 Docker 安装 RabbitMQ

$ docker pull rabbitmq$ docker images # 检测是否安装成功

👉 启动容器

$ docker run -d \
--name mq \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=123456 \
-v mq-plugins:/plugins \
-p 15672:15672 \
-p 5672:5672 \
rabbitmq

💡 这里来简单讲解一下这部分的指令:

  • \ 是换行符,用于多行输入
  • -e:environment,配置环境变量,上面是配置了管理员的用户名和密码,可以自行配置
  • -p:port,配置端口,rabbitmq 有两个提供服务的端口,一个是图形化界面 15672 和实际的业务端口 5672,可以通过 主机名:15672 的方式在浏览器访问界面。
  • --name:配置容器名
  • rabbitmq:是使用的镜像,就是上面拉取下来的镜像,如果不写版本号的话,默认是 @latest

❗ 如果图形化界面无法打开的话很有可能是没开启图形化服务:

$ docker exec -it fb7a78201d31 /bin/bash # 进入镜像内部
$ rabbitmq-plugins enable rabbitmq_management # 开启图形化服务

2.2 整体架构

除去上面提到的 publisherconsumer 这里来具体看一下其内部的部分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发送者发送信息给 交换机(exchange),交换机转发路由消息给 queueconsumer 监听队列变化并从队列中取出和处理消息。

💡 为什么需要 exchange,通过后续的学习,是可以将消息直接放到队列中的,但如果要向所有的队列(n 个)中发送消息,就要写 n 次调用代码;如果向固定的队列发送消息又要去定义新的方法,所以交换机就可以通过配置实现路由的效果,将消息按照规定的方式转发到队列。

💡 其中的 Virtual Host 是一种数据隔离手段,很多的消息都可以在同一台 RabbitMQ 服务器上执行,但为了不同模块的区分,需要一个类似命名空间的隔离效果。

2.3 快速入门

💡 任务:通过图形化界面来初步体会消息队列

👉 在这里输入上面配置中设置的账号和密码(镜像启动的配置)

👉 基本界面

👉 首先去 Queues 中创造两个队列

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

💡 先按照我的配置来创造 hello.queue1hello.queue2

👉 关联交换机与队列:交换机肯定不会服务到所有的队列,需要设置交换机与队列之间的 binding

在这里插入图片描述

💡 使用系统默认的交换机,配置关联


👉 发送信息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

👉 在队列中查看信息

2.4 Virtual Host 体验

👉 找到 Admin 界面下的 Virtual Hosts 可以配置新的 Virtual Host

同时在 Users 界面下可以新增用户,用户如果有创建 Virtual Host 的权利的话,他创建的主机就默认有权限访问,反之则需要 Admin 去手动配置权限

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/675239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CSS】什么是BFC?BFC有什么作用?

【CSS】什么是BFC?BFC有什么作用? 一、BFC概念二、触发BFC三、BFC特性即应用场景1、解决margin塌陷的问题2、避免外边距margin重叠(margin合并)3、清除浮动4、阻止元素被浮动元素覆盖 一、BFC概念 BFC(block formatting context)…

华为第二批难题五:AI技术提升六面体网格生成自动化问题

有CAE开发商问及OCCT几何内核的网格方面的技术问题。其实,OCCT几何内核的现有网格生成能力比较弱。 HybridOctree_Hex的源代码,还没有仔细去学习。 “HybridOctree_Hex”的开发者说:六面体网格主要是用在数值模拟领域的,比如汽车…

leetcode(哈希表)49.字母异位词分组(C++详细解释)DAY5

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 示例 1: 输入: strs [“eat”, “tea”…

PCA与梯度上升法

PAC 主成分分析(Principal Component Analysis) 一个非监督的机器学习算法主要用于数据的降维通过降维,可以发现更便于人类理解的特征其他应用:可视化;去噪 如何找到这个让样本间间距最大的轴? 如何定义样…

ansible shell模块 可以用来使用shell 命令 支持管道符 shell 模块和 command 模块的区别

这里写目录标题 说明shell模块用法shell 模块和 command 模块的区别 说明 shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等 shell模块用法 ansible slave -m shell -a cat /etc/passwd | grep root # 可以使用管道…

Window环境下使用go编译grpc最新教程

网上的grpc教程都或多或少有些老或者有些问题,导致最后执行生成文件时会报很多错。这里给出个人实践出可执行的编译命令与碰到的报错与解决方法。(ps:本文代码按照煎鱼的教程编写:4.2 gRPC Client and Server - 跟煎鱼学 Go (gitbook.io)&…

Blender_查看版本

Blender_查看版本 烦人的烦恼,没找见哪儿可以查看版本? 算是个隐蔽的角落!

【Godot4.2】图片处理函数库 - textureDB

概述 Godot中节点使用的图片是Texture2D或其子类型,而涉及图片处理,大多数功能在Image类型中,并且我们通常需要频繁的构造Image和ImageTexture类型。 为了封装构造Image和ImageTexture类型的代码,提供直接从文件到直接可以赋值给…

【开源】SpringBoot框架开发校园电商物流云平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 商品数据模块2.3 快递公司模块2.4 物流订单模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 商品表3.2.2 快递公司表3.2.3 物流订单表 四、系统展示五、核心代码5.1 查询商品5.2 查询快递公司5.3 查…

CentOS 安装 redis 7.2

nginx官网 https://redis.io/download/ 把鼠标放到这里,复制下载地址 在服务器找个文件夹执行命令 wget https://github.com/redis/redis/archive/7.2.4.tar.gz tar -zxvf 7.2.4.tar.gz make make install 看到这几行就说明安装成功了 不放心的话再查看下b…

26、Makefile/shell/字符串处理相关练习20240208

一、现有文件test.c\test1.c\main.c , 请编写Makefile. vi Makefile 创建 代码: CCgcc EXEwho OBJS$(patsubst %.c,%.o,$(wildcard *.c)) FLAGS-c -oall:$(EXE)$(EXE):$(OBJS)$(CC) $^ -o $%.o:%.c$(CC) $(FLAGS) $ $^.PHONY:cleanclean:rm $(OBJS) $(EXE)运行&a…

Javaweb之SpringBootWeb案例之异常处理功能的详细解析

3. 异常处理 3.1 当前问题 登录功能和登录校验功能我们都实现了,下面我们学习下今天最后一块技术点:异常处理。首先我们先来看一下系统出现异常之后会发生什么现象,再来介绍异常处理的方案。 我们打开浏览器,访问系统中的新增部…

Flask基础学习

1.debug、host、port 模式修改 1) debug模式 默认debug模式是off,在修改代码调试过程中需要暂停重启使用,这时可修改on模式解决。 同时在debug模式开启下可看到出错信息。 下面有关于Pycharm社区版和专业版修改debug模式的区别 专业版 社区版&#…

springboo冬奥会科普平台源码和论文

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理平台应运而生,各行各业相继进入信息管理时代&#xf…

人大金仓bat文件备份数据库

1)使用环境变量来存储密码 setx KINGBASE_PASSWORD "abc123" 2)编写backup.bat :: 设置备份参数 set "sys_dumpc:\Program Files\Kingbase\ES\V8\KESRealPro\V008R006C008B0014\ClientTools\bin\sys_dump" set "hostloca…

Spring Boot 笔记 003 Bean注册

使用Idea导入第三方jar包 在porn.xml种添加的第三方jar包依赖,并刷新 可以在启动类中尝试调用 以上放到启动类中,不推荐,建议创建一个专门定义的类 package com.geji.config;import cn.itcast.pojo.Country; import cn.itcast.pojo.Province;…

[CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理

文章目录 前言一、所需环境二、实现思路2.1. 定义了LeNet网络模型结构,并训练了20次2.2 以txt格式导出训练结果(模型的各个层权重偏置等参数)2.3 (可选)以pth格式导出训练结果,以方便后期调试2.4 C CUDA要做的事 三、C CUDA具体实现3.1 新建.cu文件并填好…

C语言:分支与循环

创造不易,友友们给个三连吧!! C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实 现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分…

【Linux】文件的软硬链接

文章目录 一、文件和目录的一些命令ls 命令stat 命令 二、链接的概念三、软链接(symbolic link)创建和删除软链接的示例软链接的特性软链接的应用使用 find 查找链接文件 四、硬链接(hard link)创建和删除硬链接的示例硬链接的特性…

js手写Promise(上)

目录 构造函数resolve与reject状态改变状态改变后就无法再次改变 代码优化回调函数中抛出错误 thenonFulfilled和onRejected的调用时机异步then多个then 如果是不知道或者对Promise不熟悉的铁铁可以先看我这篇文章 Promise 构造函数 在最开始,我们先不去考虑Promi…