构建高可用消息队列系统 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学习书籍(因此排名不分先后ÿ…...
 
【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、总结总结: 前言 要成功,先发疯,头脑简单往前冲! 三金四银,金九银十,多学知识,也不能埋头苦干,要成功,…...
kubernetes 权限控制
RBAC引入了4个顶级资源对象:Role、ClusterRole:角色,用于指定一组权限;RoleBinding、ClusterRoleBinding:角色绑定,用于将角色(权限)赋予给对象 咱们通过Role可以配置命名空间下资源…...
 
vue中父组件异步传值,渲染问题
vue中父组件异步传值,渲染问题 父组件异步传值,子组件渲染不出来。有如下两种解决方法: 1、用v-if解决,当父组件有数据才渲染 <Child v-if"dataList && dataList.length > 0" :data-list"dataLis…...
09前后端分离+SSM整合的小案例
前端的Node 后端的Tomcat,是前端程序的容器。前端的npm 后端的maven 1. 导入前端项目 node版本: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日,同星智能又发布一款多通道 CAN (FD)总线、LIN 总线接口logger设备,此款产品在TLog1002基础上进行了升级,同时内置 3 路数字输入和 2 路数字输出,便于多种信号测量和系统集成。可以满…...
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:形态学操作(膨胀与腐蚀 、提取水平与垂直线)
目录 前言 一、膨胀(Dilation)与 腐蚀(Erosion) 二、形态学操作 1、开操作(Opening) 2、闭操作(Closing) 3、形态学梯度(Morphological Gradient) 4、…...
 
基于JavaWeb+SSM+Vue停车场微信小程序系统的设计和实现
基于JavaWebSSMVue停车场微信小程序系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关…...
 
VUE---自定义指令
自定义指令:自己定义的指令,可以封装一些dom操作,扩展额外功能。可分为全局注册与 局部注册。 全局注册(main.js中注册): Vue.directive(指令名称,{ bind(ele,binding) {}, // 只执…...
开发安全之:Cross-Site Scripting (XSS) 漏洞
近期,我会结合研发云陆续发布开发安全相关的文章,欢迎大家关注! Overview echo json_encode($arr):向一个 Web 浏览器发送了未验证的数据,从而导致该浏览器执行恶意代码。 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,有时只是慢,但是还是…...
What is `StringEscapeUtils.escapeHtml4` does?
StringEscapeUtils.escapeHtml4 作用是将特殊字符转换为它们对应的HTML实体形式,从而防止这些字符在网页中被解析为HTML标签或脚本,有助于防止跨站脚本攻击(XSS, Cross-Site Scripting) 依赖 <!--org.apache.commons.text.St…...
 
Dubbo 的心脏:理解和应用多种协议【十三】
欢迎来到我的博客,代码的世界里,每一行都是一个故事 Dubbo 的心脏:理解和应用多种协议【十三】 前言<dubbo:protocol> 基础<dubbo:protocol> 的定义和作用微服务中协议的重要性支持的协议类型配置示例 配置基本配置参数高级配置选…...
 
操作系统实验报告
目录 目录 实验一 一、实验结果 实验二 使用信号量实现进程互斥与同步 一、实验结果 1. 使用信号量实现有限缓冲区的生产者和消费者问题 2. 使用信号量实现读进程具有优先权的读者和写者问题 实验三 死锁和预防 一、实验要求 二、实验内容 三、实验结果 实验四 内…...
 
IPv6--ACL6(IPv6访问控制列表--基本ACL6配置)
ACL基本原理 ACL由一系列规则组成,通过将报文与ACL规则进行匹配,设备可以过滤出特定的报文。 ACL的组成 ACL编号: 在网络设备上配置ACL时,每个ACL都需要分配一个编号,称为ACL编号,用来标识ACL。不同分类的ACL编号范围不同,这个后面具体讲。 规则: 前面提到了,一个AC…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
 
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
 
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
 
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
 
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
 
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
 
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
