Java开发 - 消息队列前瞻
前言
学完了Redis,那你一定不能错过消息队列,要说他俩之间的关联?关联是有的,但也不见得很大,只是他们都是大数据领域常用的一种工具,一种用来提高程序运行效率的工具。常见于高并发,大数据,都是微服务领域不可获取的工具。要说微服务的工具,还有很多,包括我们前面学过dubbo,es,nacos,seata,sentinel等,值得一提的是,大部分的工具其实都不需要我们写太多的代码,这也是工具本身的特点,它会在内部帮我们处理好要走的流程,提高开发效率。消息队列也是一样的,下面,我们就来了解一下消息队列吧。
消息队列
什么是消息队列
消息队列中间件是分布式系统中的重要组件,主要用于解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩的最终目的。说人话就是:消息队列是通过异步的方式来传递数据的过程。比如我们又想听歌,又要吃饭,异步方式下,边听歌边吃饭,互不影响,就是这么简单。
为什么使用消息队列
我们前面学习微服务时有一个创建订单的操作,使用Dubbo处理的调用,分别是减库存,删购物车数据,生成订单,分成了这三步,我们来思考下,这三步有什么必然联系吗?我可不可以打乱顺序来做?我在微服务中使用了Seata,就是为了解决分布式事务同步问题,即使某一步出了问题,我也可以自动回滚,那么这三步之前其实就没有任何联系了。
但是Dubbo中,这三步是按照代码顺序来执行的,而且是等待返回后才执行下一步的,如果同一时间有很多创建订单的请求过来,在不使用消息队列异步的情况下,服务器的压力就要翻好几倍了,这不符合我们对程序高可用性的设计,所以这里最好的办法就是让他们并发的,异步的执行。
诚然,有些调用是需要等待的,比如要先查一个id,再通过id获取详情的。但并不是所有的请求都需要如此,所以在使用中需要根据实际情况来做。
消息队列的特点
这在上面我们已经提到了,网上普遍流传的特征主要是三个:解耦,异步,削峰。但根据实际使用,它还有另外两个功能:日志和通讯。这两个功能也是不可忽视的,像日志,虽然在业务上不体现出其重要性,一旦出现问题,其重要性自然不言而喻。下面,我们来看看他们分别都是做什么的。
解耦
解耦是针对业务的,是业务就有生产者和消费者,而生产者和消费者也绝对不可能只有一对,所以是一对多的关系,还有一些模块或者对象,既是生产者,也是消费者。
生产者和消费者之间的关系是:生产者负责将消息正确的写入消息队列,其他的不关心。消费者负责从消息队列中读取消息,在进行逻辑处理。你会发现,生产者和消费者之间没有任何的直接交互。
没有交互,就没有耦合。而耦合度越低的代码,越有利于维护和扩展。说起来,很像是移动端里的通知或者广播。
异步
说到异步,不得不说说同步:同步是请求的调用方直到调用结果返回之前一直处于等待状态,这期间,调用方之后的业务将不会执行,一直等待调用结束后再执行。
异步,我相信不需要我说太多,大家都知道它的工作方式:无需等待,直接执行。
异步处理的主要目的是:减少请求响应时间,实现非核心流程异步化,提高系统响应性能。所以说,同步还是异步,都是需要的,只是看业务能接受等待的程度有多少,根据需要选择即可。
但是异步有一个明显的缺点,我写进异步队列的任务是存在延时的。调用方无法得知何时能得到响应,所以使用异步时,也要考虑业务是否能接受这样的延时,举个例子:发送验证码。这就是个典型的消息队列,同一时间谁也不知道有多少条短信需要发送,都是放在队列里执行的,如果执行的任务很多,那么你收到验证码的时间就会很长。
削峰
削峰的完整表达应该是削峰填谷。在并发峰值超过当前系统处理能力时,将没处理的信息保存在消息队列中,在后面较闲的时间中去处理,直到所有数据依次处理完成。这能够防止在并发峰值时短时间大量请求而导致的系统不稳定。上面提到的短信验证码也是这样的,所以延时是无法避免的。
消息日志
我们当然希望日志可以实时保存,这样出了问题才能很好的定位。甚至我们在讲Redis的时候提到过AOF,忘记的童鞋回头再看看:Java开发 - Redis初体验
AOF保存的就是日志,1s一次,Redis的保存机制是什么,博主不清楚,但我非常清楚的是,这种实时的日志保存必然会造成服务器的巨大消耗,前提是数据量非常大的情况。此时如果将日志放在消息队列中,忙的时候等待,在不忙的时候处理,也不失为一种好的效率机制。在这里,我们要区分日志登等级,如果是Redis这种可断电恢复的日志级别,我们可能不太希望它出现延时,是吧?
通讯
消息队列一般都内置了高效的通信机制,因此可以用于单纯的消息通讯,比如实现点对点消息队列或者聊天室。关于此,涉及到的知识很广,刨根问题的话还是自己查吧,说实话,博主也不可能讲太清楚。
常见消息队列
目前博主所知的消息队列有以下几种:ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。排名不分先后!!!
ActiveMQ
ActiveMQ是前几年流行的,一些老项目可能用到。Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件;由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。但目前主流的消息队列更好用,这个便慢慢被搁浅了,目前用的人应该会慢慢减少,毕竟没有几个人挡得住Kafka和RabbitMQ的摧残。
RabbitMQ
RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。所以在Java业务中使用很多,目前我所知道的很多都是用的此消息队列,只不过大家评价都是:功能强,性能一般。与其相反的,就是Kafka了:性能强,功能弱。
这是因为他们设计的目的不一样,RabbitMQ 在有大量消息堆积的情况下性能会下降,其优势体现在功能上。而Kafka一开始是用来处理海量日志的,所以体现出来就是性能强,功能弱。
所谓,尺有所短,寸有所长,正是这个道理。全都兼顾的几乎是不存在的。
ZeroMQ
ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”。还未看到它们的成功。但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD套接字之上的一层封装。ZMQ让编写高性能网络应用程序极为简单和有趣。
以上是官方的自high,具体怎么样,还需要大家的评判。不过由于其提供跨越多种传输协议的套接字,基于此,还是有一部分人在用的。
Kafka
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
值得一提的是,kafka的诞生,是为了解决linkedin的数据管道问题,起初linkedin采用了ActiveMQ来进行数据交换,不过,这也已经是十几年前的事了。
哦,另外要说的是,Kafka自身服务和消费者都需要依赖Zookeeper,而Zookeeper的作用是:可以修改服务器系统中的所有软件配置。所以,长此以往,很多软件就删除了自己写配置文件的功能,而直接从Zookeeper中获取。
MetaMQ
MetaMQ是一个基于以太坊的可扩展分布式消息队列,由于其介绍非常少,所以使用的人也不多,此消息队列就不再说明了,有兴趣的可自行了解。
RocketMQ
RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。其起源于Kafka,但Kafka无法满足其需求,尤其表现在低延迟和高可靠性方面,在这种情况下,RocketMQ诞生了,它是通过一个新的消息传递引擎来处理更广泛的消息用例,覆盖从传统的pub/sub场景到高容量的实时零误差的交易系统。
Apache RocketMQ 自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨,RocketMQ 已经成为业内共识的金融级可靠业务消息首选方案,被广泛应用于互联网、大数据、移动互联网、物联网等领域的业务场景。
不过据说其没有 Web
管理界面,提供了一个 CLI
(命令行界面) 管理工具来 查询、管理 和 诊断各种问题。但是在新版本中,博主注意到,已经有管理页面了。具体,推荐查看此博客:Rocketmq单机部署以及管理界面 - 知乎
感兴趣的可以看看其官网:为什么选择RocketMQ | RocketMQ
总结
总结,也没什么好总结的,各有千秋吧,不过目前使用最多的还是RabbitMQ和Kafka,关于消息队列,想了解的更详细的话,推荐这篇博客,讲的很深:常见消息队列 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ 等详解和对比 - 知乎
结语
最后了,说点啥?还是说说关于消息队列博主的教程方向吧。后续,博主会通过两篇博客来分别讲解RabbitMQ和Kafka的实战用法,此篇权当给大家一个前瞻,了解下即可。里面内容都是博主的一些体会和参考一些词条写成的,如有不准确的地方,欢迎指正,码文不易,觉得不错,请不要吝惜你们的赞,收藏和评论,谢谢。
相关文章:
Java开发 - 消息队列前瞻
前言 学完了Redis,那你一定不能错过消息队列,要说他俩之间的关联?关联是有的,但也不见得很大,只是他们都是大数据领域常用的一种工具,一种用来提高程序运行效率的工具。常见于高并发,大数据&am…...

MySQL连接IDEA详细教程
使用IDEA的时候,需要连接Database,连接时遇到了一些小问题,下面记录一下操作流程以及遇到的问题的解决方法。 目录 MySQL连接IDEA详细教程 MySQL连接IDEA详细教程 打开idea,点击右侧的 Database 或者 选择 View --> Tool Wind…...

线程(操作系统408)
基本概念 我们说引入进程的目的是更好的使用多道程序并发执行,提高资源的利用率和系统吞吐量;而引入线程的目的则是减小程序在并发执行的时候所付出的时间开销,提高操作系统的并发性能。 线程可以理解成"轻量级进程",…...

功耗降低99%,Panamorph超清VR光学架构解析
近期,投影仪变形镜头厂商Panamorph获得新型VR显示技术专利(US11493773B2),该专利方案采用了紧凑的结构,结合了Pancake透镜和光波导显示模组,宣称比传统VR方案的功耗、发热减少99%以上,可显著提高…...

【数据结构】带你深入理解栈
一. 栈的基本概念💫栈是一种特殊的线性表。其只允许在固定的一端进行插入和删除元素的操作,进行数据的插入和删除的一端称作栈顶,另外一端称作栈底。栈不支持随机访问,栈的数据元素遵循后进先出的原则,即LIFOÿ…...

认识CSS之如何提高写前端代码的效率
🌟所属专栏:前端只因变凤凰之路🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该系列将持续更新前端的相关学习笔记,欢迎和我一样的小白订阅,一起学习共同进步~👉文章简…...
Vue中watch和computed
首先这里进行声明,这个讲的是vue2的内容,在vue3发生了什么变动与此无关 这里是官网: https://v2.cn.vuejs.org/v2/guide/installation.html computed > 计算属性 watch > 侦听器(也叫监视器) 其区别如下&…...
华为鲲鹏+银河麒麟v10 安装 docker-ce
设备:硬件:仅有ARM处理器,无GPU和NPU,操作系统麒麟银河V10,Kunpeng-920 #######参考原链接######### 华为鲲鹏银河麒麟v10 安装 docker-ce 踩坑 - akiyaの博客 在 arm64(aarch64) 架构服务器上基于国产化操作系统安…...
Lambda,Stream,响应式编程从入门到放弃
Lambda表达式 Java8新引入的语法糖 Lambda表达式*(关于lambda表达式是否属于语法糖存在很多争议,有人说他并不是语法糖,这里我们不纠结于字面表述)*。Lambda表达式是一种用于取代匿名类,把函数行为表述为函数式编程风…...
C语言枚举使用技巧
什么是C语言枚举 C语言枚举是一种用户自定义数据类型,它允许程序员定义一个变量,并将其限制为一组预定义的常量。这些常量被称为“枚举值”,并且可以通过名称进行引用。 在C语言中,枚举值是整数类型,它们的值默认从0…...

保姆级使用PyTorch训练与评估自己的EfficientNetV2网络教程
文章目录前言0. 环境搭建&快速开始1. 数据集制作1.1 标签文件制作1.2 数据集划分1.3 数据集信息文件制作2. 修改参数文件3. 训练4. 评估5. 其他教程前言 项目地址:https://github.com/Fafa-DL/Awesome-Backbones 操作教程:https://www.bilibili.co…...

【9】基础语法篇 - VL9 使用子模块实现三输入数的大小比较
VL9 使用子模块实现三输入数的大小比较 【报错】官方平台得背锅 官方平台是真的会搞事情,总是出一些平台上的莫名其妙的错误。 当然如果官方平台是故意考察我们的细心程度,那就当我没有说!! 在这个程序里,仿真时一直在报错 错误:无法在“test”中绑定wire/reg/memory“t…...

成功的项目管理策略:减少成本,提高质量
项目管理是一项具有挑战性的任务,项目团队需要合理的规划和策略,以确保项目的成功和达成预期。为了实现项目的成功,项目经理必须采用正确的策略,才能以最大限度地减少成本并提高项目质量。本文将探讨成功的项目管理策略࿰…...

centos 7下JDK8安装
下载安装包https://www.oracle.com/java/technologies/downloads/#java8-linux上传路径 /usr/local(替换为自己需要安装的路径)解压tar -zxvf jdk-8u131-linux-x64.tar.gz配置环境变量[rootlocalhost java]# vi /etc/profile添加如下配置在配置文件最后&…...
datatables.js中文项目使用案例
官方下载地址https://datatables.net/download/中文官网:http://datatables.club/资源引用<link href"~/datatables/datatables.min.css" rel"stylesheet" /> <script src"~/jquery.min.js" type"text/javascript"…...

Hadoop小结
Hadoop是什么Hadoop是一 个由Apache基金 会所开发的分布式系统基础架构。主要解决,海量数据的存储和海量数据的分析计算问题。广义上来说,Hadoop通 常是指一个更广泛的概念一Hadoop 生态圈。Hadoop优势Hadoop组成HDFS架构Hadoop Distributed File System,…...
经典卷积模型回顾14—vgg16实现图像分类(tensorflow)
VGG16是由牛津大学计算机视觉小组(Visual Geometry Group)开发的深度卷积神经网络模型。其结构由16层组成,其中13层是卷积层,3层是全连接层。 VGG16被广泛应用于各种计算机视觉任务,如图像分类、目标检测和人脸识别等。…...
#Vue2篇:keep-alive的属性和方法
定义 keep-alive 组件是 Vue.js 内置的一个高阶组件,用于缓存其子组件,以提高组件的性能和响应速度。 除了基本用法之外,它还提供了一些属性和方法,以便更好地控制缓存的组件。 属性 include属性用于指定哪些组件应该被缓存&a…...

webpack指南(项目篇)——webpack在项目中的运用
系列文章目录 webpack指南(基础篇)——手把手教你配置webpack webpack指南(优化篇)——webpack项目优化 文章目录系列文章目录前言一、配置拆分二、修改启动命令三、定义环境变量四、配置路径别名总结前言 前面我们对webpack的基…...

unicode字符集与utf-8编码的区别,unicode转中文工具、中文转unicode工具(汉字)
在cw上报的报警信息中,有一个name字段的值是\u4eba\u4f53 不知道是啥,查了一下,是unicode编码,用下面工具转换成汉字就是“人体” 参考文章:https://tool.chinaz.com/tools/unicode.aspx 那么我很好奇,uni…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

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是一个异步的、基于事件驱动的网络应用框架,用于…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...