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

Java中消息队列

       MQ是Message Queue的缩写,也就是消息队列的意思,它是一种应用程序对应用程序的通信方法,使得应用程序能够通过读写出入列队的消息来进行通信,而无需要使用专用的连接来链接它们。消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削峰等问题。实现高性能,高可用,可伸缩和最终一致性架构,在消息队列中有生产者和消费者两种角色,生产者负责发送消息到消息队列,而消费者从消息队列中取出数据进行处理,这种方式实现生产者和消费者之间的解耦,使得他们可以独立运行和扩展。

优点

 应用解耦

消息队列允许生产者和消费者之间松耦合,生产者只需要将消息发送到队列,而不需要关心消息这何时处理或者如何处理这些消息

异步处理

消息队列允许异步处理消息,这意味着接收者可以在自己方便的时候处理消息,而不是立即相应,这可以提高系统的吞吐量和响应时间

流量削峰

在高并发的场景下,消息队列可以起到缓冲的作用,平滑突发流量,保护后端系统免受冲击

缺点

可用性降低

如果消息队列服务成为单边故障,整个系统可能受到影响,因此,需要实施高可用性和容错策略,一般解决方式是非MQ架集群

复杂性提高

引入消息队列会增加系统的复杂性,因为需要配置和管理消息队列服务,同时还需要处理可能的消息丢失,重复或顺序错乱等问题。

一致性问题

在分布式系统中,使用消息队列时,如果消息队列发生了消息的丢失与重复,则可能会造成数据一致性的问题。

消息队列的应用场景主要分为以下三种:
1.异步处理:应用在实时性要求不高的一些场景,例如用户注册发送验证码、下单通知发送优惠券等。这些场景下,服务方只需要把协商好的消息发送到消息队列,剩下的由消费者的消息服务去处理,不需要等待消费者的返回结果就可以直接返回给客户端,返回给业务层面;
2.应用解耦:可以把一些相关的但是耦合度不高的一些系统关联起来,比如订单系统与优惠券积分系统有关联度,但是没有那么紧密,每个系统之间只需要把一些约定好的消息发送到MQ,另外的系统直接去消费就可以了,它可以允许各类系统间采用不同的一些框架和语言来实现,从而大大增加了整个系统的灵活度;
3.流量削峰:应用在大流量入口的一些短时间的业务,短时间内业务需求处理不完的一些服务,例如双十一秒杀、演唱会抢票等。为了权衡高可用把大量的一些并行任务发送给MQ。根据MQ的存储和分发功能平稳的去处理后续的一些业务,从而起到大流量缓冲的作用

说说RabbitMQ的基本架构设计
RabbitMQ的基本架构由以下几个部分组成:
1.生产者(Producer):生产者是消息的发送方,负责产生并发生消息到RabbitMQ。生产者通常将消息发生给交换机(Exchange),从而使其消费者没有强关联。
2.交换机(Exchange):交换机是消息的分发中心,负责将接收到的消息路由到一个或多个消息队列。它定义了消息的传递规则,可以根据规则将消息发送到一个或多个队列中。

直连交换机(Direct Exchange):将消息路由到与消息中的路由键(Routing Key)完全匹配的队列;
主题交换机(Topic Exchange):根据通配符匹配路由键(Routing Key),将消息路由到一个或多个队列;
扇出交换机(Fanout Exchange):将消息广播到所有与交换机绑定的队列,忽略路由键;
头部交换机(Headers Exchange):根据消息头中的属性进行匹配,将消息路由到与消息头匹配的队列。
3.队列(Queue):队列是消息的存储区,用于存储生产者发送的消息。消息最终会被消费者从队列中取出并处理。每个队列都有一个名称,并且可以绑定到一个或多个交换机。
4.消费者(Consumer):消费者是消息的接收方,负责从队列中获取消息并进行处理。消费者通过订阅队列来接收消息。
5.绑定(binding):绑定是交换机和队列之间的关联关系。生产者将消息发送到交换机,而队列通过绑定与交换机相连,从而接收消息。
6.虚拟主机(Virtual Host):虚拟主机是RabbitMQ的基本工作单元,每个虚拟主机都拥有自己独立的用户、权限、交换机、队列等资源,完全隔离于其他虚拟主机。
7.连接(Connection):连接是指生产者、消费者与RabbitMQ之间的网络连接。每个连接都可以包含多个信道(Channel),每个信道是一个独立的会话通道,可以进行独立的消息传递。
8.消息(Message):消息是生产者和消费者之间传递的数据单元。消息通常会包含消息体和可选的属性,如路由键等

相关文章:

Java中消息队列

MQ是Message Queue的缩写,也就是消息队列的意思,它是一种应用程序对应用程序的通信方法,使得应用程序能够通过读写出入列队的消息来进行通信,而无需要使用专用的连接来链接它们。消息队列中间件是分布式系统中重要的组件&#xff…...

高频面试手撕

手撕高频结构 前言 以下内容,都是博主在秋招面试中,遇到的面试手撕代码题目,不同于算法题目,更多考察的是基础知识,包含常见的数据结构比如线性表、哈希表、优先级队列等,还有多线程以及数据库连接池等内…...

Spring Boot 3.3 【八】整合实现高可用 Redis 集群

一、引言 在当今快速发展的软件开发领域,系统的性能和可靠性至关重要。Springboot 3 整合 Redis 7 集群具有多方面的重大意义。 首先,随着业务的不断发展,数据量呈爆炸式增长,单个 Redis 服务器往往难以满足存储和处理需求。Red…...

循环控制结构穷举 同构数

说明 同构数是会出现在它的平方的右边的数。例如,5就是1个同构数。5的平方是25,25最右边的这个数是5自己。25也是一个同构数,比如25的平方是625,而625右边的数是25. 请编程输出1000以内正整数中所有的同构数。每行一个答案。 输…...

主机本地IP与公网IP以及虚拟机的适配器和WSL发行版的IP

在局域网内,如果你想要连接到同一网络中的另一台设备,建议使用 本地 IP 地址(也称为局域网 IP 地址)。这是因为本地 IP 地址是在局域网内分配给设备的,用于在同一网络中的设备之间进行通信。 使用本地 IP 地址的好处 …...

@MassageMapping和@SendTo注解详解

MessageMapping注解是Spring Framework中用于WebSocket消息处理的注解,它用于将特定的消息路径映射到处理器方法上。SendTo注解指定了相应消息应该被发送到的目的地路径。 一、WebSocket配置类: Configuration EnableWebSocketMessageBroker public cl…...

2.1_Linux发展与基础

Linux基础知识 Shell 命令执行环境: 命令提示符的组成:(用户名主机名)-[当前路径]权限提示符,例:(kali㉿kali)-[~]$ ~ 表示所在目录为家目录:其中root用户的家目录是/root,普通用户的家目录在/home下 # 表示用户的权…...

c#子控件拖动父控件方法及父控件限在窗体内拖动

一、效果 拖放位置不超过窗体四边,超出后自动靠边停靠支持多子控件拖动指定控件拖放(含父控件或窗体)点击左上角logo弹出消息窗口(默认位置右下角)1.1 效果展示 1.2 关于MQTTnet(最新版v4.3.7.1207)实现在线客服功能,见下篇博文 https://github.com/dotnet/MQTTnet 网上…...

Redis --- 第八讲 --- 关于主从复制哨兵

主从复制的补充问题 从节点和主节点之间断开连接,有两种情况: 1、从节点和主节点断开连接 slaveof no one 命令。这个时候,从节点就能能够晋升成主节点。意味着我们程序员要主动修改redis的组成结构。, 2、主节点挂了 这个时…...

【数据结构】时间和空间复杂度-Java

如何衡量算法的好坏 根据时间复杂度和空间复杂度来判断 比较项目时间复杂度空间复杂度定义衡量算法执行时间与问题规模之间的关系衡量算法在运行过程中所占用的额外存储空间与问题规模之间的关系表达方式通常用大O符号表示,如O(n)、O(n^2&am…...

tensorRT安装详解(linux与windows)

目录 tensorRT介绍 前置准备 安装cuda与cudnn linux windows cuda版本查看 下载安装包 linux安装 安装 安装验证 windows安装 安装 环境变量配置 安装验证 tensorRT介绍 有关tensorRT的介绍见 TensorRT简介-CSDN博客 前置准备 安装cuda与cudnn linux Linux下…...

MYSQL OPTIMIZE TABLE 命令重建表和索引

在 MySQL 中,OPTIMIZE TABLE 命令用于重建表和相关索引,以及回收未使用的空间。这个命令对于维护和优化数据库表的性能非常有用,特别是在进行了大量的数据删除操作之后。OPTIMIZE TABLE 可以减少数据文件的碎片化,确保数据存储更加…...

开发指南075-各种动画效果

方法一、使用动画GIF图标 方法二、使用vue-count-to import CountTo from vue-count-to components: { CountTo }, <count-to :start-val"0" :end-val"num" :duration"num>0?num:1" class"card-panel-num" /> 方法…...

使用 el-upload 如何做到发送一次请求上传多个文件

在使用 Element UI 的 el-upload 组件时&#xff0c;默认情况下每次选择文件都会触发一次上传请求。如果你需要一次性上传多个文件&#xff0c;而不是每个文件都触发一次请求&#xff0c;可以通过一些配置和代码处理来实现。 方法一&#xff1a;通过配置file-list&#xff08;…...

GEE引擎架设好之后进游戏时白屏的解决方法——gee引擎白屏修复

这两天测试GeeM2引擎的服务端&#xff0c;最常见的问题就是点击开始游戏出现白屏&#xff0c;最早还以为是服务端问题&#xff0c;结果是因为升级了引擎&#xff0c;而没有升级NewUI这份文件导致的。解决方法如下&#xff1a; 下载GEE引擎包最新版&#xff0c;&#xff08;可以…...

Linux LVS 通用命令行

LVS&#xff08;Linux Virtual Server&#xff09;是一种基于Linux操作系统的负载均衡技术&#xff0c;它通过网络负载均衡技术将客户端请求分发到多台实际服务器上&#xff0c;以提高系统的性能和可靠性。在LVS中&#xff0c;常用的命令行工具主要是ipvsadm&#xff0c;以及一…...

laravel .env环境变量原理

介绍 对于应用程序运行的环境来说&#xff0c;不同的环境有不同的配置通常是很有用的。Laravel 利用 Vance Lucas 的 PHP 库 DotEnv 使得此项功能的实现变得非常简单。当应用程序收到请求时&#xff0c;.env 文件中列出的所有变量将被加载到 PHP 的超级全局变量 $_ENV 中。 使…...

Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解

title: Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解 date: 2024/10/19 updated: 2024/10/19 author: cmdragon excerpt: app:templatesGenerated 是 Nuxt.js 的一个生命周期钩子,在模板编译到虚拟文件系统(Virtual File System, VFS)之后被调用。这个钩子允许…...

新时代AI桌宠:XGO Rider让你的办公室瞬间高大上

​ XGO Rider Luwu 智能打造了桌面双轮足式机器人 XGO Rider&#xff0c;这款全球首创的轮腿式桌面AI机器人&#xff0c;正在悄然改变我们的办公环境。它不仅是一个高科技玩具&#xff0c;更是一个能大幅提升工作效率和办公室科技感的智能助手。 XGO Rider 新时代“桌宠” micr…...

matlab的resample函数

MATLAB中resample函数用法 - 知乎 (zhihu.com) 主要是经常忘记了重采样时哪个是原采样率&#xff0c;哪个是重采样后的采样率&#xff08;目标采样率&#xff09;。这里记录下&#xff0c;目标采样率在前面&#xff01;...

告别繁琐输入:基于SmartConfig与微信的ESP8266/ESP32一键配网实战

1. 为什么我们需要一键配网技术&#xff1f; 每次拿到新的智能设备&#xff0c;最头疼的就是怎么把它连上家里的Wi-Fi。传统的配网方式通常需要你在手机App里手动输入Wi-Fi名称和密码&#xff0c;这个过程不仅繁琐&#xff0c;还容易出错。想象一下&#xff0c;你要给10个智能灯…...

如何在5分钟内开始使用Ivy Wallet:新手入门教程

如何在5分钟内开始使用Ivy Wallet&#xff1a;新手入门教程 【免费下载链接】ivy-wallet Ivy Wallet is an open-source money manager app for android that you can either build or download from Google Play. 项目地址: https://gitcode.com/gh_mirrors/iv/ivy-wallet …...

J1712-粒状巧克力糖包装机设计【颗粒状糖果包装机设计】【三维SW模型+6张CAD图纸+说明】

J1712-粒状巧克力糖包装机设计【颗粒状糖果包装机设计】【三维SW模型6张CAD图纸说明】 传送带电机刚启动那会儿&#xff0c;总有几个巧克力豆卡在导流槽边缘。凌晨三点的实验室里&#xff0c;我盯着SolidWorks里旋转的螺旋送料机构模型&#xff0c;突然意识到——这玩意儿得做成…...

如何掌握Marzipano全景技术的5个核心技术?

如何掌握Marzipano全景技术的5个核心技术&#xff1f; 【免费下载链接】marzipano A 360 media viewer for the modern web. 项目地址: https://gitcode.com/gh_mirrors/ma/marzipano 探索现代Web全景图开发的奥秘&#xff0c;发现Marzipano如何通过等距柱状投影、立方体…...

15 分钟上线|开源克隆网站 + 一键部署,搭建你自己的产品

把目标网站像素级克隆下来&#xff0c;再用部署技能把它一键部署到线上。全程主要靠自然语言对话完成&#xff0c;不需要命令行操作&#xff0c;不需要懂代码。你要做的只有一件事&#xff1a;把“你想复制哪个网站、要怎么上线”说清楚&#xff0c;其它交给 AI 去检测、拆解、…...

Python新手福音:借助快马AI零基础构建你的第一个行情网站

作为一个刚接触Python的新手&#xff0c;想要构建一个行情网站听起来可能有点吓人。但通过InsCode(快马)平台的AI辅助&#xff0c;整个过程变得异常简单。下面我就分享一下自己从零开始搭建第一个行情网站的经历。 数据获取部分 首先需要找到一个免费的金融数据接口。我选择了一…...

成都美容院灯箱技术白皮书:2024年行业趋势与落地实践指南

美容院灯箱&#xff1a;不只是照明&#xff0c;更是品牌灵魂的窗口走进任何一条成都的商业街&#xff0c;你很难忽视那些光彩夺目的美容院灯箱。它们不仅仅是照明工具&#xff0c;更是品牌形象的第一道防线。有趣的是&#xff0c;很多人会误以为灯箱只是‘打个光’那么简单&…...

11.0592MHz晶振在51单片机串口通信中的优势解析

1. 为什么11.0592MHz晶振成为单片机工程师的首选在嵌入式系统设计中&#xff0c;晶振的选择往往决定了整个系统的稳定性和精度。作为一名从事单片机开发多年的工程师&#xff0c;我发现11.0592MHz的晶振在51单片机项目中出现的频率异常高。这绝非偶然&#xff0c;而是由一系列精…...

ESP32S3-Cam + MPU6050 DMP移植避坑实录:从编译报错到姿态数据稳定输出的完整流程

ESP32S3-Cam与MPU6050 DMP移植实战&#xff1a;从编译报错到稳定姿态解算的全流程解析 当ESP32S3-Cam遇上MPU6050的DMP&#xff08;数字运动处理器&#xff09;功能&#xff0c;本应是物联网项目中实现低成本姿态检测的完美组合。但实际移植过程中&#xff0c;开发者往往会遭遇…...

基于cv_unet_image-colorization的Python爬虫实战:自动化图像数据集着色

基于cv_unet_image-colorization的Python爬虫实战&#xff1a;自动化图像数据集着色 为计算机视觉项目快速构建高质量的彩色图像数据集 在计算机视觉项目中&#xff0c;获取高质量的标注数据集往往是最耗时耗力的环节。特别是当我们需要大量彩色图像数据时&#xff0c;手动收集…...