当前位置: 首页 > news >正文

构建高可用消息队列系统 01

构建高可用消息队列系统 01

  • 引言
  • 1. RabbitMQ简介介绍
    • 1.1 什么是RabbitMQ
    • 1.2 RabbitMQ的核心特性
    • 1.3 RabbitMQ与AMQP
  • 2.安装RabbitMQ
  • 3.消息队列实践
  • 总结

引言

在当今互联网时代,消息队列系统扮演着至关重要的角色,它们被广泛应用于分布式系统、微服务架构以及异步通信等领域。RabbitMQ作为最流行的开源消息队列之一,具有高可用性、可靠性和灵活性,本篇博客将深入探讨RabbitMQ的高级应用,包括简介介绍、安装配置以及实际案例分析。

1. RabbitMQ简介介绍

1.1 什么是RabbitMQ

RabbitMQ是一个开源的消息代理软件,实现了高级消息队列协议(AMQP),并提供了可靠的消息传递、灵活的路由、消息确认机制等特性。它是一个强大的工具,用于构建分布式系统中的异步通信和解耦,同时也适用于构建大规模的数据处理系统。RabbitMQ的核心概念包括交换机、队列、绑定等,通过这些概念,可以实现灵活的消息路由和处理。在分布式系统中,RabbitMQ能够提供高可用性、可靠性和灵活性,使得系统能够更好地应对高并发和大规模数据处理的挑战。

1.2 RabbitMQ的核心特性

  • 消息持久化:RabbitMQ允许消息持久化到磁盘,即使在代理重启后也不会丢失。这对于关键业务数据的可靠性至关重要。
  • 消息确认机制:RabbitMQ支持消息的确认机制,生产者可以收到消息代理已经成功接收消息的确认,确保消息不会丢失。
  • 灵活的路由规则:RabbitMQ的灵活的路由规则允许消息根据不同的条件被路由到不同的队列,从而实现复杂的消息处理逻辑。
  • 高可用性:RabbitMQ支持集群和镜像队列,可以实现高可用性的消息队列系统,即使某个节点发生故障,系统仍然能够正常运行。
  • 可靠性:RabbitMQ通过消息确认机制和持久化等特性,保证了消息传递的可靠性,即使在网络故障或者节点故障的情况下也能够保证消息不丢失。

1.3 RabbitMQ与AMQP

RabbitMQ是一个实现了高级消息队列协议(AMQP)的消息代理软件。AMQP是一种面向消息的中间件标准协议,旨在提供统一的消息传递模型,以便不同的消息中间件系统可以进行互操作。、

RabbitMQ完全实现了AMQP 0-9-1版本,这意味着它遵循了AMQP协议定义的消息格式、交换机、队列、绑定等核心概念,同时也支持AMQP定义的高级特性,如事务、确认机制等。

通过遵循AMQP协议,RabbitMQ能够与其他支持AMQP的消息中间件系统进行无缝集成,实现跨平台、跨语言的消息传递。这使得开发人员可以更加灵活地选择适合自己业务需求的消息中间件系统,同时也为系统的可扩展性和互操作性提供了保障。

2.安装RabbitMQ

拉取Rabbitmq镜像

docker pull rabbitmq:managemen

开启两个端口,5672,15672

firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --zone=public --add-port=15672/tcp --permanent

更新防火墙

firewall-cmd --reload

查看开放端口

firewall-cmd --zone=public --list-ports

在这里插入图片描述

然后创建容器

docker run -d \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
--restart=always \
rabbitmq:management

创建好了就可以访问了
在这里插入图片描述
创建用户
在这里插入图片描述
给他分配一个my_vhost权限
在这里插入图片描述
现在RabbitMQ安装设置好了

3.消息队列实践

创建一个空项目
并创建两个maven项目,分别对应着消费者和生产者
在这里插入图片描述
分别写好yml文件
消费者8999,生产者8888(端口号)

server:port: 8888
spring:rabbitmq:host: 192.168.238.129password: 123456port: 5672username: springvirtual-host: my_vhost

在生产者项目中放一个消息队列,并取名,firstQueue是队列名字

@Configuration
@SuppressWarnings("all")
public class RabbitConfig {
@Bean
public Queue firstQueue() {
return new Queue("firstQueue");
}public Queue secondQueue() {return new Queue("secondQueue");}
}

导这个包
在这里插入图片描述
然后准备一个发消息的Controller

package com.example.publiuse;import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author 叶秋* @site* @company 卓京公司* @create 2024-01-19 20:10*/
@RestController
public class TestController {@Autowiredprivate AmqpTemplate amqpTemplate;@RequestMapping("/send1")public String send1(){//向消息队列发送消息amqpTemplate.convertAndSend("firstQueue","hello");return "哈哈;";}
}

访问一手

消息队列显示
在这里插入图片描述
消费者监听

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "firstQueue")
public class Receiver {
@RabbitHandler
public void process(String msg) {
log.warn("接收到:" + msg);
}
}

http://localhost:8888/send1 访问几次
然后被监听
在这里插入图片描述
这样就大大解除了代码的耦合性

  • 另一个案例:
    新建一个User类,生成消费都需要
@SuppressWarnings("all")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable{
private String username;
private String userpwd;
}

生产者事件

 @RequestMapping("/send2")public String send2() throws Exception{//向消息队列发送消息User user = new User("yh", "123");String string = objectMapper.writeValueAsString(user);amqpTemplate.convertAndSend("secondQueue",string);return "哈哈;";}

消费者监听

package com.example.consumer;import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "secondQueue")
public class Receiver2 {@Autowiredprivate ObjectMapper objectMapper;
@RabbitHandler
public void process(String string) throws  Exception{User user = objectMapper.readValue(string, User.class);log.warn("接收到:" + user);
}
}

总结

通过本篇博客的学习,读者将深入了解RabbitMQ的核心概念、高级特性以及实际应用场景,掌握如何搭建高可用的消息队列系统,为构建稳定、可靠的分布式系统提供有力支持。

相关文章:

构建高可用消息队列系统 01

构建高可用消息队列系统 01 引言1. RabbitMQ简介介绍1.1 什么是RabbitMQ1.2 RabbitMQ的核心特性1.3 RabbitMQ与AMQP 2.安装RabbitMQ3.消息队列实践总结 引言 在当今互联网时代,消息队列系统扮演着至关重要的角色,它们被广泛应用于分布式系统、微服务架构…...

十本你不容错过的Docker入门到精通书籍推荐

前言: 最近有许多小伙伴私信让我推荐几本关于Docker学习的书籍,今天花了一下午的时间在网上查阅了一些资料和结合自己平时工作中的一些学习参考资料书籍写下了这篇文章。注意以下书籍都是十分优秀的Docker学习书籍(因此排名不分先后&#xff…...

【AI接口】语音版、文心一言大模型和AI绘图、图片检测API

文章目录 一、语音版大模型AI1、接口2、请求参数3、请求参数示例4、接口返回示例 二、AI图片鉴黄合规检测API1、接口2、请求参数3、请求参数示例4、接口返回示例5、报错说明6、代码开源 三、人工智能AI绘画API1、接口2、请求参数3、请求参数示例4、接口返回示例5、AI绘画成果展…...

VUE 中的 v-for 和 v-if 是否可以共存

VUE 中的 v-for 和 v-if 是否可以共存 前言1、面试经2、正确回答3、总结总结: 前言 要成功,先发疯,头脑简单往前冲! 三金四银,金九银十,多学知识,也不能埋头苦干,要成功&#xff0c…...

kubernetes 权限控制

RBAC引入了4个顶级资源对象:Role、ClusterRole:角色,用于指定一组权限;RoleBinding、ClusterRoleBinding:角色绑定,用于将角色(权限)赋予给对象 咱们通过Role可以配置命名空间下资源…...

vue中父组件异步传值,渲染问题

vue中父组件异步传值&#xff0c;渲染问题 父组件异步传值&#xff0c;子组件渲染不出来。有如下两种解决方法&#xff1a; 1、用v-if解决&#xff0c;当父组件有数据才渲染 <Child v-if"dataList && dataList.length > 0" :data-list"dataLis…...

09前后端分离+SSM整合的小案例

前端的Node 后端的Tomcat&#xff0c;是前端程序的容器。前端的npm 后端的maven 1. 导入前端项目 node版本&#xff1a;16.16.0 配置阿里镜像 npm config set registry https://registry.npmjs.org/ 更新npm版本 npm install -g npm9.6.6 用vscode打开解压后的项目 , 右上角…...

模仿ProTable创建ProTable组件

不多说废话直接上代码 父组件 // index.jsx/*** description 此ProTable是根据ProComponents里的ProTable模仿封装的简易版本* */ import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useState } from react import { Card, Table } from antd import…...

新品发布 | 多通道总线记录仪TLog1004,是你期待的吗?

新品发布 2024年1月12日&#xff0c;同星智能又发布一款多通道 CAN &#xff08;FD&#xff09;总线、LIN 总线接口logger设备&#xff0c;此款产品在TLog1002基础上进行了升级&#xff0c;同时内置 3 路数字输入和 2 路数字输出&#xff0c;便于多种信号测量和系统集成。可以满…...

Double数据类型保留3位小数

Double scrapGrn scrapQty * Double.parseDouble(lot.getCnvrsnFctr()) / 1000 ; // 保留3位小数 DecimalFormat decimalFormat new DecimalFormat("#.###"); String scrapGrnStr decimalFormat.format(scrapGrn); 345.12344 处理后 为 345.123 34…...

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线)

目录 前言 一、膨胀&#xff08;Dilation&#xff09;与 腐蚀&#xff08;Erosion&#xff09; 二、形态学操作 1、开操作&#xff08;Opening&#xff09; 2、闭操作&#xff08;Closing&#xff09; 3、形态学梯度&#xff08;Morphological Gradient&#xff09; 4、…...

基于JavaWeb+SSM+Vue停车场微信小程序系统的设计和实现

基于JavaWebSSMVue停车场微信小程序系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关…...

VUE---自定义指令

自定义指令&#xff1a;自己定义的指令&#xff0c;可以封装一些dom操作&#xff0c;扩展额外功能。可分为全局注册与 局部注册。 全局注册&#xff08;main.js中注册&#xff09;&#xff1a; Vue.directive(指令名称,{ bind(ele,binding) {}, // 只执…...

开发安全之:Cross-Site Scripting (XSS) 漏洞

近期&#xff0c;我会结合研发云陆续发布开发安全相关的文章&#xff0c;欢迎大家关注&#xff01; Overview echo json_encode($arr)&#xff1a;向一个 Web 浏览器发送了未验证的数据&#xff0c;从而导致该浏览器执行恶意代码。 Details Cross-Site Scripting (XSS) 漏洞…...

代码随想录算法训练营第二十四天| 77. 组合

77.组合 public List<List<Integer>> combine(int n, int k) {if (n < k) {return null;}List<List<Integer>> list new ArrayList<>();List<Integer> path new ArrayList<>();backSource(n, path, list, k);return list;}pu…...

虚拟歌姬学习:DiffSinger,让GitHub下载快的方法!

《三分钟上手DiffSinger》系列 ——基础篇https://www.bilibili.com/video/BV1ug4y1S7Dk/?spm_id_from333.337.search-card.all.click&vd_source124076d7d88eee393a1d8bf6fc787efa 下载DiffSinger 建议用edge浏览器还有steam&#xff0c;有时只是慢&#xff0c;但是还是…...

What is `StringEscapeUtils.escapeHtml4` does?

StringEscapeUtils.escapeHtml4 作用是将特殊字符转换为它们对应的HTML实体形式&#xff0c;从而防止这些字符在网页中被解析为HTML标签或脚本&#xff0c;有助于防止跨站脚本攻击&#xff08;XSS, Cross-Site Scripting&#xff09; 依赖 <!--org.apache.commons.text.St…...

Dubbo 的心脏:理解和应用多种协议【十三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Dubbo 的心脏&#xff1a;理解和应用多种协议【十三】 前言<dubbo:protocol> 基础<dubbo:protocol> 的定义和作用微服务中协议的重要性支持的协议类型配置示例 配置基本配置参数高级配置选…...

操作系统实验报告

目录 目录 实验一 一、实验结果 实验二 使用信号量实现进程互斥与同步 一、实验结果 1. 使用信号量实现有限缓冲区的生产者和消费者问题 2. 使用信号量实现读进程具有优先权的读者和写者问题 实验三 死锁和预防 一、实验要求 二、实验内容 三、实验结果 实验四 内…...

IPv6--ACL6(IPv6访问控制列表--基本ACL6配置)

ACL基本原理 ACL由一系列规则组成,通过将报文与ACL规则进行匹配,设备可以过滤出特定的报文。 ACL的组成 ACL编号: 在网络设备上配置ACL时,每个ACL都需要分配一个编号,称为ACL编号,用来标识ACL。不同分类的ACL编号范围不同,这个后面具体讲。 规则: 前面提到了,一个AC…...

这面镜子,照出了什么?——一次“自找麻烦“的差距分析实录

在多篇推文的评论区&#xff0c;关于实战案例的呼声一直很高。今天&#xff0c;我们就聊一聊发生在义翘神州实验室日常检测和质量管理中的案例&#xff0c;来一场“自我找茬”&#xff1a;差距分析。 在质量管理领域&#xff0c;“差距分析”这四个字耳熟能详。它就像一面镜子&…...

[语音转文字工具] AsrTools:让音频转写效率提升300%的开源解决方案

[语音转文字工具] AsrTools&#xff1a;让音频转写效率提升300%的开源解决方案 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio in…...

Tsunami Arduino硬件抽象库:高精度信号发生与频率测量

1. Tsunami信号发生器与频率计硬件抽象库概述Tsunami 是一款面向嵌入式测试与教学场景的多功能信号发生器与频率计硬件平台&#xff0c;其核心价值在于将高精度模拟信号生成、宽频带数字信号捕获与实时频率测量能力集成于紧凑的单板系统中。本库&#xff08;tsunami-arduino&am…...

SAP BAPI实战指南:核心模块高频接口速查与应用解析

1. SAP BAPI入门&#xff1a;为什么开发者需要这份速查手册 第一次接触SAP BAPI时&#xff0c;我盯着满屏的接口文档差点崩溃——光是FICO模块就有二十多个常用BAPI&#xff0c;每个接口的参数列表长得像毕业论文。后来在项目上踩过几次坑才明白&#xff0c;BAPI的难点不在于技…...

AI数字人开源方案:Duix.Avatar本地化部署与应用指南

AI数字人开源方案&#xff1a;Duix.Avatar本地化部署与应用指南 【免费下载链接】Duix-Avatar &#x1f680; Truly open-source AI avatar(digital human) toolkit for offline video generation and digital human cloning. 项目地址: https://gitcode.com/GitHub_Trending…...

高效解决E-Hentai图库下载难题:实用下载工具全攻略

高效解决E-Hentai图库下载难题&#xff1a;实用下载工具全攻略 【免费下载链接】E-Hentai-Downloader Download E-Hentai archive as zip file 项目地址: https://gitcode.com/gh_mirrors/eh/E-Hentai-Downloader 在数字资源管理领域&#xff0c;E-Hentai作为知名的漫画…...

Kimi-VL-A3B-Thinking效果展示:MMLongBench-Doc 35.1分超长文档理解

Kimi-VL-A3B-Thinking效果展示&#xff1a;MMLongBench-Doc 35.1分超长文档理解 1. 模型概述 Kimi-VL-A3B-Thinking是一款创新的开源混合专家&#xff08;MoE&#xff09;视觉语言模型&#xff0c;在多模态理解和长上下文处理方面展现出卓越能力。这个模型最引人注目的特点是…...

数字创世神:用漏洞规律操控现实

在古老的神话中&#xff0c;数字“一”象征着万物的起源与开端&#xff0c;是混沌初开、宇宙诞生的起点。伏羲一画开天&#xff0c;划分乾坤&#xff0c;自此有了天地与秩序。这种从无到有、从一到多的创世过程&#xff0c;与当今数字世界的构建有着惊人的同构性。在由代码构筑…...

【Matlab】MATLAB教程:图形属性修改(案例:set(h,‘Color‘,‘red‘),应用:自定义图形样式)

MATLAB教程:图形属性修改(案例:set(h,Color,red),应用:自定义图形样式) 在MATLAB数据可视化、实验报告绘图、工程结果展示等场景中,默认绘制的图形往往难以满足个性化需求和规范要求。无论是调整线条颜色、粗细,还是优化坐标轴、图例样式,核心目标都是通过图形属性修…...

Cesium 三维地图开发实战:主流在线底图(天地图、高德、百度等)的集成与坐标纠偏方案

1. 三维地图开发中的底图选择困境 第一次用Cesium加载国内在线地图时&#xff0c;我被满屏错位的道路和建筑搞懵了。明明在二维地图里精准对齐的学校操场&#xff0c;在三维场景里却飘到了隔壁小区。这种"灵魂出窍"般的偏移现象&#xff0c;其实是不同坐标系之间的&q…...