消息服务概述

news2024/7/4 5:20:09

消息服务的作用:

在多数应用尤其是分布式系统中,消息服务是不可或缺的重要部分,它使用起来比较简单,同时解决了不少难题,例如异步处理、应用解耦、流量削锋、分布式事务管理等,使用消息服务可以实现一个高性能、高可用、高扩展的系统。

1.异步处理

场景说明:用户注册后,系统需要将信息写入数据库,并发送注册邮件和注册短信通知。下面我们使用图示的方式直观展示上述场景的不同处理方式,如图所示。

在图中,针对上述注册业务的场景需求,处理方式有3种,如下所示。

(1)串行处理方式:用户发送注册请求后,服务器会先将注册信息写入数据库,依次发送注册邮件和短信消息,服务器只有在消息处理完毕后才会将处理结果返回客户端。这种串行处理消息的方式非常耗时,用户体验不友好。

(2)并行处理方式:用户发送注册请求后,将注册信息写入数据库,同时发送注册邮件和短遇到较为耗时的业务处理,仍然显得不够完善。遇到较为耗时的业务处理,仍然显得不够完善。

(3)消息服务处理方式:可以在业务中嵌入消息服务进行业务处理,这种方式先将注册信息写入数据库,在极短的时间内将注册信息写入消息队列后即可返回响应信息。此时前端业务不需要理会不相干的后台业务处理,而发送注册邮件和短信的业务会自动读取消息队列中的相关消息进行后续业务处理。

2.应用解耦

场景说明:用户下单后,订单服务需要通知库存服务。下面我们使用图示的方式直观展示上述需求的不同处理方式,如图所示。

 

在图中,如果使用传统方式处理订单业务,用户下单后,订单服务会直接调用库存服务接口进行库存更新,这种方式有一个很大的问题是:一旦库存系统出现异常,订单服务会失败导致订单丢失。如果使用消息服务模式,订单服务的下订单消息会快速写入消息队列,库存服务会监听并读取到订单,从而修改库存。相较于传统方式,消息服务模式显得更加高效、可靠。

3.流量削峰

场景说明:秒杀活动是流量削峰的一种应用场景, 由于服务器处理资源能力有限,因此出现峰值时很容易造成服务器宕机、用户无法访问的情况。为了解决这个问题,通常会采用消息队列缓冲瞬时高峰流量,对请求进行分层过滤,从而过滤掉一些请求。 图8-3描述的是流量削峰场景的处理方式。

 

针对上述秒杀业务的场景需求,如果专门增设服务器来应对秒杀活动期间的请求瞬时高峰的话,在非秒杀活动期间,这些多余的服务器和配置显得有些浪费;如果不进行有效处理的话,秒杀活动瞬时高峰流量请求有可能压垮服务,因此,在秒杀活动中加入消息服务是较为理想的解决方案。通过在应用前端加入消息服务,先将所有请求写入到消息队列,并限定一定的阈值,多余的请求直接返回秒杀失败,秒杀服务会根据秒杀规则从消息队列中读取并处理有限的秒杀请求。

4.分布式事务管理

场景说明:在分布式系统中,分布式事务是开发中必须要面对的技术难题,怎样保证分布式系统的请求业务处理的数据一致性 通常是要重点考虑的问题。针对这种分布式事务管理的情况,目前较为可靠的处理方式是基于消息队列的二次提交,在失败的情况可以进行多次尝试,或者基于队列数据进行回滚操作。因此,在分布式系统中加入消息服务是一个既能保证性能不变,又能保证业务一致性的方案。

针对这种分布式事务处理的需求,下面我们以图示的方式展示使用消息服务的处理机制,如图所示。

 

针对上述分布式事务管理的场景需求,如果使用传统方式在订单系统中写入订单支付成功信息后,再远程调用库存系统进行库存更新,一旦库存系统异常,很有可能导致库存更新失败而订单支付成功的情况,从而导致数据不一致。针对这种分布式系统的事务管理,通常会在分布式系统之间加入消息服务进行管理。在图中,订单支付成功后,写入消息表;然后定时扫描消息表消息写入到消息队列中,库存系统会立即读取消息队列中的消息进行库存更新,同时添加消息处理状态;接着,库存系统向消息队列中写入库存处理结果,订单系统会立即读取消息队列中的库存处理状态。如果库存服务处理失败,订单服务还会重复扫描并发送消息表中的消息,让库存系统进行最终一致性的库存更新。如果处理成功,订单服务直接删除消息表数据,并写入到历史消息表。

常用消息中间件介绍:

消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。目前开源的消息中间件可谓是琳琅满目,大家耳熟能详的有很多,比如ActiveMQ、RabbitQ、Kafka、 RocketMQ 等。目前市面上的消息中间件各有侧重点,选择适合自己、能够扬长避短的无疑是最好的选择。接下来,我们针对常用的消息队列中间件进行介绍。

1. ActiveMQ

ActiveMQ是Apache公司出品的、采用Java 语言编写的、完全基于JMS规范( Java Message Service)的、面向消息的中间件,它为应用程序提供高效、可扩展的、稳定的、安全的企业级消息通信。ActiveMQ丰富的API和多种集群构建模式使得它成为业界老牌的消息中间件,广泛的应用于中小型企业中。相较于后续出现的RabbitMQ、RocketMQ、 Kafka 等消息中间件来说,ActiveMQ 性能相对较弱,在如今的高并发、大数据处理的场景下显得力不从心,经常会出现一些问题,例如消息延迟、堆积、堵塞等。

2. RabbitMQ

RabbitMQ是使用Erlang 语言开发的开源消息队列系统,基于AMQP协议( Advanced Message Queuing Protocol )实现。AMQP是为应对大规模并发活动而提供统消息服务的应用层标准高级消息队列协议,专门为面向消息的中间件设计,该协议更多用在企业系统内,对数据-致性、 稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。正是基于AMQP协议的各种优势性能,使得RabbitMQ消息中间件在应用开发中越来越受欢迎。

3.Kafka

Kaika是由Apache软件基金会开发的一个开源流处理平台,它是一种高吞吐量的分布式发布订阅消息系统,采用Scala和Java语言编写,提供了快速、可扩展的、分布式的、分区的和可复制的日志订阅服务,其主要特点是追求高吞吐量,适用于产生大量数据的互联网服务的数据收集业务。

4. RocketMQ

RocketMQ是阿里巴巴公司开源产品,目前也是Apache公司的顶级项目,使用纯Java开发,具有高吞吐量、高可用、适合大规模分布式系统应用的特点。RocketMQ的思路起源于Kafka,对消息的可靠传输以及事务性做了优化,目前在阿里巴巴中被广泛应用于交易、充值、流计算、消息推送、日志流式处理场景,不过维护上稍微麻烦。

在实际项目技术选型时,在没有特别要求的场景下,通常会选择使用RabbitMQ作为消息中间件,如果针对的是大数据业务,推荐使用Kafka或者是RocketMQ作为消息中间件。

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

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

相关文章

适用于 Linux 系统的综合日志审计和报告

从 Linux 设备以及各种其他日志源收集日志,并从单个控制台监控它们,以轻松了解网络活动。 Linux 系统日志如何工作 Linux 操作系统日志包含多个日志文件,其中包含有关网络中发生的事件的详细信息。在服务器上执行的每个操作都可以通过日志进…

【C语言】从零开始学习数组

🍁 博客主页:江池俊的博客 💫收录专栏:C语言——探索高效编程的基石 💻 其他专栏:数据结构探索 💡代码仓库:江池俊的代码仓库 🎪 社区:C/C之家社区 🍁 如果觉…

【项目方案】OpenAI流式请求实现方案

文章目录 实现目的效果比对非stream模式stream模式实现方案方案思路总体描述前端方案对比event-source-polyfill代码示例前端实现遇到的问题与解决方法后端参考资料时序图关键代码示例后端实现时遇到的问题与解决方法实现目的 stream是OpenAI API中的一个参数,用于控制请求的…

UE5.1.1 创建C++项目失败

因一直使用Unity开发环境,安装Unreal后,并未详细配置过其开发环境,默认创建蓝图工程无异常,但创建UE C项目时总共遇到两个错误: 错误一 Running /Epic/UE/UE_5.1/Engine/Build/BatchFiles/Build.bat -projectfiles -…

LeetCode 75 第十二题(11)盛最多水的容器

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 配合着示例给出的图片我们可以得知找出盛水最多的容器是什么意思,给一个数组,找出数组中两个元素能围成的最大的矩阵面积是多少. 比较直观的想法是套两层for循环暴力解出来,但是这题是中等难度题,一般中等题是没法用暴力得…

OSI七层模型——第2层数据链路层

目录 1 数据链路层的用途 1.1 数据链路层 1.2 IEEE 802LAN/MAN 数据链路子层 1.3 提供介质访问 1.4 数据链路层标准 2 拓扑 2.1 物理和逻辑拓扑 2.2 WAN 拓扑 2.3 点对点 WAN 拓扑 2.4 LAN 拓扑 2.5 半双工和全双工通信 2.6 访问控制方法 2.7 基于竞争的访问 - CS…

Excel录制宏批处理:避免重复工作,轻松提升效率

在处理大量数据时,我们常常需要进行一些重复且繁琐的操作,这不仅费时费力,还容易出错。而Excel的录制宏批处理功能可以帮助我们避免这些重复的工作,提高工作效率。本文将为您介绍如何使用Excel的录制宏批处理功能,让您…

【CesiumJS材质】(1)圆扩散

效果示例 最佳实践: 其他效果: 要素说明: 代码 /** Date: 2023-07-21 15:15:32* LastEditors: ReBeX 420659880qq.com* LastEditTime: 2023-07-27 11:13:17* FilePath: \cesium-tyro-blog\src\utils\Material\EllipsoidFadeMaterialP…

在CSDN学Golang云原生(Kubernetes声明式资源管理Kustomize)

一,生成资源 在 Kubernetes 中,我们可以通过 YAML 或 JSON 文件来定义和创建各种资源对象,例如 Pod、Service、Deployment 等。下面是一个简单的 YAML 文件示例,用于创建一个 Nginx Pod: apiVersion: v1 kind: Pod m…

基于Velocity开发代码生成器

一、引言 在项目开发中,我们有碰到大量的简单、重复的增删改查需求,通过阅读若依框架https://github.com/yangzongzhuan/RuoYi 的代码生成器实现,结合我项目所用的技术栈,开发出本项目的代码生成器。 二、Velocity 简单介绍 1、…

【C++入门】浅谈类、对象和 this 指针

文章目录 一、前言二、类1. 基本概念2. 类的封装3. 使用习惯成员函数定义习惯成员变量命名习惯 三、对象1. 基本概念2. 类对象的存储规则 四、this 指针1. 基本概念2. 注意事项3. 经典习题4. 常见面试题 一、前言 在 C 语言中,我们用结构体来描述一个事物的多种属性…

Markdown常用标签及其用途-有示例

Markdown常用标签及其用途 Markdown是一种轻量级标记语言,具有简洁易读的特点。下面是一些常用的Markdown标签以及它们的用途,并附带一些示例: 标题 用于创建不同级别的标题,可通过添加一到六个#符号来表示不同级别的标题。 #…

yolov5的后处理解析

由于最近实习项目使用到了yolov5, 发现对yolov5的后处理部分不太熟悉,为防止忘记,这里简单做个记录。 在yolov5里,利用FPN特征金字塔,可以得到三个加强特征层,每一个特征层上每一个特征点存在3个先验框&am…

自动化测试到底用Python还是Java?因为这个我和同事闹翻了

现在的软件测试工程师,必备的技能之一就是需要掌握自动化。对于那些不会自动化的测试工程师来说,被淘汰的概率会越来越大。因此大家通过各种途径开始学习自动化。但是刚开始都会面临一个棘手的问题:应该学习哪种编程语言进行自动化测试呢&…

Echarts 显示双Y轴

option 对象 option {yAxis: [{ name: 重量(kg), position: left, type: value },{ name: 金额(元), position: right, type: value }],xAxis: { type: category },legend: {},series: [{name: 剩余量,label: { normal: { show…

2023年全国程序员薪酬排行天梯榜

文章目录 ⭐️ 2023年全国程序员薪酬排行天梯榜 在过去很长的一段时间内,网上总有一个声音:“大厂裁员”、“程序员内卷严重”、“程序员人员过盛”、“35岁中年危机”、“码农吃的青春饭”、“互联网寒冬” 等等等等。 讲道理,我对这种人为的…

ViT-vision transformer

ViT-vision transformer 介绍 Transformer最早是在NLP领域提出的,受此启发,Google将其用于图像,并对分类流程作尽量少的修改。 起源:从机器翻译的角度来看,一个句子想要翻译好,必须考虑上下文的信息&…

Redisson源码分析(1)源码下载及本地调试

目录 前言 源码下载 其他准备 前言 新开个坑,关于Redisson源码分析的,感觉不记一下,看完以后,过段时间又忘了... 源码下载 Redisson:https://github.com/redisson/redisson 本次源码我这下载的是3.17.7版本 3.…

Java期末复习基础题编程题

文章目录 基础题记录实践题记录&&与C比较题目1:题目2:题目3: 基础题记录 编译型语言: 定义:在程序运行之前,通过编译器将源程序编译成机器码(可运行的二进制代码),以后执行这个程序时&…

【图像分类】CNN+Transformer结合系列.2

介绍几篇利用CNNTransformer实现图像分类的论文:CMT(CVPR2022),MaxViT(ECCV2022),MaxViT(ECCV2022),MPViT(CVPR2022)。主要是说明Transformer的局限性&#x…