MQ组件之RabbitMQ学习

MQ组件之RabbitMQ入门

同步调用和异步调用

在微服务架构中,服务之间的调用有同步调用和异步调用两种方式。
我们使用OpenFeign去调用是同步调用,同步调用的缺点很明显,在下图的场景中,支付完成后需要调用订单服务、仓库服务、短信服务。没每调用一个服务耗时150ms,那么全部调用完成就需要450ms,如果后面还需要调用更多的服务,那么耗时会更久,而且如果后期需求变更,支付完成后还需要调用其它服务,那么还需要改代码。综上所述

  • 同步调用的优点:
    • 时效性较强,可以立即得到结果
  • 同步调用的缺点:
    • 耦合度高
    • 性能和吞吐能力下降
    • 有额外的资源消耗
    • 有级联失败问题
      在这里插入图片描述
      在这里插入图片描述

异步调用常见的实现是基于事件驱动的方式。
在这里插入图片描述

  • 异步调用的优点:
    • 耦合度低
    • 吞吐量提升
    • 故障隔离
    • 流量削峰
  • 异步调用的缺点:
    • 依赖于Broker的可靠性、安全性、吞吐能力
    • 架构复杂了,业务没有明显的流程线,不好追踪管理

什么是MQ

MQ (MessageQueue),中文是消息队列,字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。

下图是常见MQ组件的对比。
在这里插入图片描述

RabbitMQ安装

这里使用的是docker镜像安装的方式。

  1. 首先把RabbitMQ镜像上传到虚拟机中,然后加载RabbitMQ镜像
 docker load -i /usr/local/mq.tar
  1. 启动RabbitMQ容器
docker run  -e RABBITMQ_DEFAULT_USER=root  -e RABBITMQ_DEFAULT_PASS=root  -v mq-plugins:/plugins  --name mq  --hostname mq  -p 15672:15672  -p 5672:5672  -d  rabbitmq:3-management

输入虚拟机的ip和开放的端口,即可访问RabbitMQ的管理后台:
在这里插入图片描述

RabbitMQ管理后台介绍

下图是RabbitMQ管理后台的预览页面,展示了RabbitMQ节点的相关信息,如节点的名字、状态、运行时间等
在这里插入图片描述

下图Connections(连接)页面,在这个页面查看、管理和关闭当前所有的TCP连接。
在这里插入图片描述

下图是Channels(通道)页面,这里展示了所有当前打开的通道以及它们的详细信息
在这里插入图片描述

下图是Exchanges(交换机)页面,这里可以查看、创建和删除交换机。交换机是RabbitMQ消息路由的重要组成部分,它决定了消息如何被路由到正确的队列。
在这里插入图片描述

下图是Queues(队列)页面,可以在这里看到所有的队列。队列是RabbitMQ的核心,它保存了所有待处理的消息。
在这里插入图片描述

下图是Admin(管理)页面,在这里可以管理RabbimtMQ的用户,并分配相关功能。为了给不同的用户授权不同的功能,RabbitMQ设计了一个virtual host(虚拟主机)的概念,每个用户只能看到它所在虚拟主机下的资源。virtual host是对queue、exchange等资源的逻辑分组。
在这里插入图片描述

下面是RabbitMQ官方关于如何监控RabbitMQ以及RabbitMQ管理后台的介绍。
如何监控RabbitMQ
RabbitMQ的管理插件介绍

RabbitMQ相关概念

下图是AMQP的通讯模型,由消息发送者、消息接收者、交换机、队列组成。

  • 消息发送者:发送消息
  • 消息接收者:消费消息
  • 交换机:路由消息,决定消息路由到哪个队列
  • 队列:负责存储消息
    在这里插入图片描述
    下图是RabbitMQ对于AMQP通讯模型的实现。
    在这里插入图片描述

RabbitMQ中常见的通讯模型主要可以分为两种,队列和发布/订阅,而这两种又可以往下细分。

  • 队列
    • 基本消息队列
    • 工作消息队列
  • 发布订阅,根据交换机类型不同可以分为三种
    • Fanout Exchange:广播
    • Direct Exchange:路由
    • Topic Exchange:主题

使用

下面介绍RabbitMQ中简单队列的使用。

消息发布者代码

public class Send {

    private static final String QUEUE_NAME = "hello";

    public static void send() {
        //建立和RabbitMQ Server的连接
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.200.215");
        connectionFactory.setUsername("root");
        connectionFactory.setPassword("root");
        try (Connection connection = connectionFactory.newConnection()) {
        	//创建通道
            Channel channel = connection.createChannel();
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Hello World1";
            //发送消息
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        send();
    }
    
}

消息接收者代码

public class Recv {

    private static final String QUEUE_NAME = "hello";

    public static void receive() {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.200.215");
        factory.setUsername("root");
        factory.setPassword("root");
        try(Connection connection = factory.newConnection()) {
            Channel channel = connection.createChannel();
            //这里声明队列是因为,消费者有可能先启动,此时要确保有队列,才能尝试从队列中获取消息
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            DeliverCallback callback = new DeliverCallback() {
                @Override
                public void handle(String s, Delivery delivery) throws IOException {
                    String message = new String(delivery.getBody(), "UTF-8");
                    System.out.println("receive message: " + message);
                }
            };
            channel.basicConsume(QUEUE_NAME, true, callback, s -> {});
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        receive();
    }

}

消息发送成功后,可以在RabbitMQ管理后台中看到

在这里插入图片描述
通过下面的Get Message按钮可以获取未消费的消息
在这里插入图片描述

参考

  • RabbitMQ官方教程
  • rabbitMQ入门指南:管理页面全面指南及实战操作

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatisPlus 之二:SpringBoot 快速整合 MyBatisPlus 详细步骤

SpringBootMyBatisPlus Spring Boot 结合 MyBatis Plus 是一种常见的 Java 后端开发框架组合,能够快速构建高性能、易于维护的 CRUD 应用程序。以下是 Spring Boot 集成 MyBatis Plus 的基本步骤 一、快速体验 注意:下面版本 idea2020 SpringBoot2.* …

node.js快速入门-day03

个人名片: 😊作者简介:一名大二在校生 🤡 个人主页:坠入暮云间x 🐼座右铭:给自己一个梦想,给世界一个惊喜。 🎅**学习目标: 坚持每一次的学习打卡 文章目录 web服务器创建…

Rocket MQ 从入门到实践

为什么要使用消息队列,解决什么问题?(消峰、解藕、异步) 消峰填谷 客户端》 网关 〉 消息队列》秒杀服务 异步解耦 消息队列中的重要概念理解。(主题、消费组、队列,游标?) 主题&…

phpstudy搭建简单渗透测试环境upload-labs、DVWA、sqli-labs靶场

好久没有做渗透相关的试验了,今天打开phpstudy发现很多问题,好多环境都用不了,那就卸载重装吧,顺便记录一下。 小皮下载地址: https://www.xp.cn/download.html 下载安装完成 一、下载搭建upload-labs环境 github…

LeetCode每日一题[C++]-310.最小高度树

题目描述 树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。 给你一棵包含 n 个节点的树,标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表(每一个…

数字多空策略(实盘+回测+数据)

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学,点击下方链接报名: 量化投资速成营(入门课程) Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

【深度学习模型移植】用torch普通算子组合替代torch.einsum方法

首先不得不佩服大模型的强大之处,在算法移植过程中遇到einsum算子在ONNX中不支持,因此需要使用普通算子替代。参考TensorRT - 使用torch普通算子组合替代torch.einsum爱因斯坦求和约定算子的一般性方法。可以写出简单的替换方法,但是该方法会…

【C#】【SAP2000】SAP2000中批量修改指定荷载工况下所有Frame对象的温度荷载

if (build true){// 连接到正在运行的 SAP2000cOAPI mySapObject (cOAPI) System.Runtime.InteropServices.Marshal.GetActiveObject("CSI.SAP2000.API.SapObject");cSapModel mySapModel mySapObject.SapModel;// 获取所有框架单元的总数int numberFrames 0;str…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Search)

搜索框组件,适用于浏览器的搜索内容输入框等应用场景。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Search(options?: { value?: string, placeholder?: Reso…

[论文精读]Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection

论文网址:[2304.08876] 用于定向微小目标检测的动态粗到细学习 (arxiv.org) 论文代码:https://github.com/ChaselTsui/mmrotate-dcfl 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&…

网站安全监测:守护网络空间的坚实防线

随着互联网技术的飞速发展和广泛应用,网站已成为企业、机构和个人展示形象、提供服务、传递信息的重要平台。然而,与此同时,网站也面临着日益严重的安全威胁。黑客攻击、数据泄露、恶意软件等安全问题频发,给网站运营者带来了巨大…

FFplay使用滤镜添加字幕到现有视频显示

1.创建字幕文件4k.srt 4k.srt内容: 1 00:00:01.000 --> 00:00:30.000 日照香炉生紫烟2 00:00:31.000 --> 00:00:60.000 遥看瀑布挂前川3 00:01:01.000 --> 00:01:30.000 飞流直下三千尺4 00:01:31.000 --> 00:02:00.000 疑是银河落九天2.通过使用滤镜显示字幕在视…

ping和telnet的区别

ping是ICMP协议,只包含控制信息没有端口,用于测试两个网络主机之间网络是否畅通 telnet是TCP协议,用于查看目标主机某个端口是否开发。 总结:ping是物理计算机间的网络互通检查,telnet是应用服务间的访问连通检查&am…

GPU密集型计算性能优化的方法和技术

对GPU密集型计算进行性能优化的方法和技术多种多样。通过一些优化策略和技术需要综合考虑应用程序的具体需求、所使用的GPU硬件、以及编程模型和库的选择。通过不断地分析和调整,可以实现GPU计算性能的持续提升。以下是一些常用的优化策略和技术: 算法优…

Oracle 部署及基础使用

1. Oracle 简介 Oracle Database,又名 Oracle RDBMS,简称 Oracle Oracle系统,即是以Oracle关系数据库为数据存储和管理作为构架基础,构建出的数据库管理系统。是目前最流行的客户/服务器(client/server)或…

监视和内存观察

监视和内存观察 5.监视和内存观察5.1 监视5.2 内存 5.监视和内存观察 在调试的过程中我们,如果要观察代码执行过程中,上下文环境中的变量的值,有哪些方法呢? 这些观察的前提条件一定是开始调试后观察,比如&#xff1…

金枪鱼群优化算法TSO优化BiLSTM-ATTENTION实现风力发电功率预测(matlab)

金枪鱼群优化算法TSO优化BiLSTM-ATTENTION实现风力发电功率预测(matlab) TSO-BiLSTM-Attention金枪鱼群算法优化长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 金枪鱼群优化算法(Tuna Swarm Optimization,TSO)是一…

upload-labs第一关

上一篇文章中搭建好了upload-labs环境,接下来进行第一关的尝试,我也是第一次玩这个挺有意思。 1、第一关的界面是这样的先不看其他的源码,手动尝试下试试。 2、写一个简单的php一句话木马 3、直接上传,提示必须要照片格式的文…

论文阅读——BLIP

BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation (1)单模态编码器,它分别对图像和文本进行编码。图像编码器用ViT,并使用附加的 [CLS] 标记来表示全局图像特征。文本…

20240314-2-字符串string

1.最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入: [“flower”,“flow”,“flight”] 输出: “fl” 示例 2: 输入: [“dog”,“racecar”,“car”] 输出: “” 解释: 输入不存在公共前缀…