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

《面试之MQ篇》

《面试之MQ篇》

1. 为什么要使用MQ

  • 首先,面试官问的第一个问题或者说是逼问的一个问题:“为什么要使用MQ
  • 其实面试官问这个问题就是想考察你MQ的特性,这个时候呢,我们必须要答出三点:解耦、异步、削峰

1. 解耦

1. 传统系统耦合问题

  • 在没有消息队列的系统中,系统组件之间的通信往往是直接的、紧耦合的。
  • 例如,在一个电商系统中,订单系统和库存系统可能直接相互调用。当订单系统收到一个新订单时,它会立即调用库存系统的接口来扣减库存。这种紧密耦合的方式使得系统难以维护和扩展。
  • 如果库存系统的接口发生变化,比如增加了新的参数或者修改了接口的返回值,那么订单系统也需要相应地修改代码来适应这种变化。而且,当库存系统出现故障时,订单系统的订单处理功能可能也会受到影响,因为它依赖于库存系统的正常运行。

2. 消息队列解耦的优势

  • 使用消息队列后,订单系统和库存系统之间通过消息进行通信。订单系统将订单信息作为消息发送到消息队列中,库存系统从消息队列中获取订单消息并进行库存扣减。这样,订单系统和库存系统就不再直接相互依赖。
  • 库存系统的接口变化不会直接影响订单系统,只要消息的格式和内容保持一致,订单系统就可以继续正常工作。同时,即使库存系统出现故障,订单消息可以在消息队列中暂存,等库存系统恢复后再进行处理,不会导致订单系统的功能受阻。

2. 异步

1. 同步处理的局限性

  • 以用户注册场景为例,在一个简单的系统设计中,如果没有消息队列,用户提交注册信息后,系统可能需要依次完成多项任务,如验证用户信息、创建用户数据库记录、发送注册邮件等。这些任务都是同步执行的,用户需要等待所有任务完成后才能得到注册成功的反馈。
  • 假设验证用户信息需要 1 秒,创建用户记录需要 2 秒,发送注册邮件需要 3 秒,那么用户总共需要等待 6
    秒才能得到注册成功的反馈。这种长时间的等待会导致用户体验不佳,尤其是在高并发的情况下,系统的响应时间会变得很长。

2. 消息队列异步处理的优势

  • 使用消息队列后,用户提交注册信息后,系统可以将注册信息作为消息发送到消息队列中,然后立即返回注册成功的反馈给用户。后台的服务可以从消息队列中获取注册消息,分别异步地进行验证用户信息、创建用户记录和发送注册邮件等任务。
  • 这样,从用户的角度来看,响应时间大大缩短,可能只需要几毫秒就能得到注册成功的反馈。同时,系统的整体性能也得到了提升,因为这些任务可以在后台并行地进行处理,而不是依次等待完成。

3. 削峰

1. 流量高峰的挑战

  • 在一些高并发的场景中,如电商的秒杀活动或者热门景点的门票预订,系统可能会在短时间内接收到大量的请求。如果没有消息队列,这些请求会直接冲击后端的服务,如数据库、应用服务器等。
  • 以秒杀活动为例,假设数据库每秒只能处理 1000 个订单插入操作,但秒杀活动开始时每秒有 10000
    个订单请求。如果所有请求直接发送到数据库,数据库很可能会因为不堪重负而出现性能下降、甚至崩溃的情况。

2. 消息队列削峰的原理和优势

  • 使用消息队列后,这些大量的请求可以先发送到消息队列中进行缓冲。消息队列可以承受高并发的消息流入,将请求暂时存储起来。后端的服务可以按照自己的处理能力从消息队列中获取消息进行处理。
  • 例如,数据库每秒能处理 1000
    个订单,那么它就可以以这个速度从消息队列中获取订单消息进行处理。这样,通过消息队列的缓冲作用,有效地避免了后端服务被瞬间的高流量冲垮,保证了系统的稳定性和可靠性。

1.1. 总结话术

面试官您好,使用消息队列(MQ)主要有三个重要原因。
首先呢就是mq具有解耦的特性,在复杂的软件系统中,不同的模块之间往往存在着紧密的依赖关系。如果不使用 MQ,模块之间可能会直接进行方法调用,这会导致高度耦合。例如,在一个电商系统中,订单模块和库存模块、物流模块等可能直接交互。一旦其中一个模块的接口发生变化,就会影响到与之直接交互的其他模块,使得系统的维护变得极为困难。
而引入 MQ 后,各个模块之间通过发送和接收消息进行通信,不再直接依赖对方的接口。订单模块在生成订单后,将订单消息发送到 MQ,库存模块和物流模块从 MQ 中获取订单消息并进行相应的处理。这样,即使某个模块出现故障,也不会直接影响到其他模块的正常运行,极大地提高了系统的可维护性和可扩展性。
再一个呢就是因为它能异步处理消息了,
在没有 MQ 的情况下,很多业务流程往往是同步执行的。比如在一个在线教育平台中,学生提交作业后,系统需要进行作业存储、批改、反馈等一系列操作。如果这些操作都是同步进行的,学生就需要等待所有操作完成后才能得到反馈,这会导致响应时间过长,影响用户体验。
使用 MQ 后,可以将这些操作异步化。学生提交作业后,系统将作业提交的消息发送到 MQ,然后立即返回提交成功的响应。后台的作业存储、批改、反馈等服务可以从 MQ 中获取作业消息并进行异步处理。这样,学生能够快速得到反馈,同时系统也能够更加高效地利用资源,提高整体性能。
最后一点就是因为它具有流量削峰的特性,
在一些特定场景下,系统可能会面临瞬间的高流量冲击。比如电商平台的促销活动、抢购活动等,短时间内会有大量的用户请求涌入。如果没有 MQ,这些请求会直接到达后端服务,可能会导致服务过载甚至崩溃。
通过 MQ,可以将这些突发的高流量请求缓冲起来。用户的请求先发送到 MQ,后端服务按照自己的处理能力从 MQ 中获取请求进行处理。这样就能够有效地避免系统因瞬间高流量而崩溃,保证系统在高负载情况下的稳定性。
我的回答完毕,谢谢!

2. 消息队列有什么优点和缺点

1. 优点

(一)解耦系统

传统系统耦合问题说明
  • 在传统的紧耦合系统中,系统的各个模块之间直接相互调用。例如,在一个电商系统里,订单系统和库存系统紧密相连。当订单系统接收到一个新订单时,它会马上调用库存系统的接口来更新库存。这种方式使得两个系统高度依赖彼此的接口细节。
  • 如果库存系统的接口发生变化,比如增加了一个新的参数用于记录库存更新的原因,那么订单系统就需要相应地修改代码来适应这个新参数。而且,当库存系统出现故障,订单系统可能会因为无法成功调用库存更新接口而无法正常处理订单。
消息队列解耦原理及优势
  • 消息队列的引入改变了这种紧密耦合的状态。以刚才的电商系统为例,订单系统将新订单信息作为消息发送到消息队列中,库存系统从消息队列中获取消息来更新库存。
  • 这样一来,订单系统和库存系统之间不再直接依赖对方的接口。库存系统的接口变化只要不影响消息的格式和内容,就不会对订单系统产生影响。即使库存系统出现故障,订单消息可以在消息队列中暂存,等到库存系统恢复后再进行处理,从而提高了系统的可维护性和灵活性。

(二)异步处理

同步处理的局限案例分析
  • 考虑一个用户注册的场景。在没有消息队列的系统中,用户提交注册信息后,系统需要依次完成验证用户信息(假设耗时 1 秒)、创建用户数据库记录(假设耗时 2 秒)、发送注册欢迎邮件(假设耗时 3 秒)等操作。
  • 这些操作是同步执行的,用户需要等待所有操作完成后才能得到注册成功的反馈,总共需要等待 1 + 2 + 3 = 6 秒,这在用户体验上是比较差的,尤其是在高并发的情况下,系统的响应时间会因为这种同步等待而变得很长。
消息队列异步处理优势阐述
  • 当使用消息队列时,用户提交注册信息后,系统将注册信息作为消息发送到消息队列中,然后立即返回注册成功的反馈给用户。
  • 后台的服务可以从消息队列中获取注册消息,分别异步地进行验证用户信息、创建用户记录和发送注册欢迎邮件等操作。这样从用户角度来看,响应时间可能缩短到几毫秒,大大提升了用户体验。同时,系统的整体性能也得到提高,因为这些任务可以在后台并行地进行处理,提高了资源的利用效率。

(三)流量削峰

流量高峰的危害示例
  • 在电商的秒杀活动中,瞬间可能会有成千上万的用户请求涌入。如果没有消息队列,这些请求会直接冲击后端的服务,比如数据库。
  • 假设数据库每秒能够稳定处理 1000 笔订单插入操作,但在秒杀活动开始的瞬间,每秒有 10000 笔订单请求。如果所有请求直接发送到数据库,数据库很可能会因为不堪重负而出现性能下降,如查询和插入操作变得极其缓慢,甚至可能会因为资源耗尽而崩溃。
消息队列削峰机制及优势
  • 消息队列可以将这些大量的请求先缓冲起来。在秒杀场景中,用户的订单请求先发送到消息队列。后端的数据库服务可以按照自己的处理能力,比如每秒处理 1000 笔订单的速度,从消息队列中获取订单消息进行处理。
  • 这样就有效地避免了后端服务被瞬间的高流量冲垮,使得系统在高负载情况下依然能够保持相对稳定的运行状态,保证了系统的可靠性。

(四)广播和多播能力

广播功能说明及应用场景
  • 消息队列可以将一条消息广播给多个消费者。例如,在一个新闻发布系统中,当有重要新闻发布时,消息队列可以将新闻消息广播给所有订阅了新闻频道的客户端应用。
  • 这些客户端应用可以是网页端、移动端等不同平台的应用,它们都能从消息队列中获取到相同的新闻消息,从而实现了消息的广泛传播。
多播功能介绍及适用场景
  • 多播功能则允许消息被发送到一组特定的消费者。以一个企业内部的系统为例,当有一个部门级别的通知需要发送时,消息队列可以将通知消息发送给该部门对应的一组消费者,如该部门的员工使用的工作软件客户端。
  • 这种广播和多播能力提高了消息传递的效率,使得消息能够快速地到达多个目标接收者,适合于需要一对多或组播消息传递的场景。

(五)可扩展性

水平扩展的便利性
  • 消息队列系统本身通常很容易进行水平扩展。随着业务的增长,系统的消息处理量不断增加,可以通过添加更多的消息队列服务器或者消息代理(如在RocketMQ 中的 Broker)来处理更多的消息。
  • 例如,当一个电商平台的订单消息量从每天 10 万条增长到每天 100 万条时,可以增加消息队列服务器的数量来应对这种增长。新添加的服务器可以分担原有的消息处理任务,并且在配置好相关的路由和负载均衡后,整个系统可以平稳地运行,不需要对现有系统的架构进行大规模的修改。
对业务扩展的支持
  • 对于业务系统来说,消息队列的可扩展性也提供了很大的便利。以一个物流系统为例,随着业务的拓展,需要增加新的物流服务提供商或者新的物流信息处理模块。
  • 只要这些新的模块遵循消息队列的消息格式和通信协议,就可以很容易地接入到现有的消息队列系统中。它们可以从消息队列中获取自己需要的消息,如订单发货消息或者货物运输状态消息,从而实现了业务系统的平滑扩展。

2. 缺点

(一)系统复杂性增加

架构复杂性
  • 引入消息队列后,系统架构变得更加复杂。除了原有的业务系统模块,还需要引入消息队列服务器、消息生产者和消费者等组件。
  • 例如,在一个简单的三层架构(表示层、业务逻辑层、数据访问层)的应用中,加入消息队列后,需要考虑如何在业务逻辑层正确地生产消息,以及在其他可能的模块中作为消费者接收和处理消息。这需要设计新的通信路径和处理逻辑,增加了系统架构设计的难度。
运维复杂性
  • 消息队列的运维也比较复杂。需要监控消息队列服务器的性能指标,如消息堆积情况、服务器的负载、网络带宽的使用等。
  • 当出现问题时,如消息丢失、消息重复消费等,需要有相应的技术手段来解决。例如,要确定消息丢失是在生产阶段、传输阶段还是消费阶段,并且采取不同的措施来恢复丢失的消息,这对运维人员的技术要求较高。

(二)一致性问题

最终一致性挑战
  • 在分布式系统中,使用消息队列可能会导致数据一致性的问题。例如,一个事务涉及多个系统,其中一个系统通过消息队列发送消息来触发其他系统的操作。
  • 由于消息队列的异步特性,可能会出现消息还未被其他系统处理,而发起事务的系统已经完成了自己部分的操作并提交。这就导致了系统之间的数据在一段时间内可能不一致,需要通过一些额外的机制来保证最终一致性。
分布式事务处理困难
  • 处理分布式事务与消息队列结合的情况比较复杂。比如在一个包含消息队列的电商系统中,订单系统和库存系统通过消息队列通信来处理订单和库存事务。
  • 如果订单系统成功发送了订单消息,但库存系统在消费消息时出现故障,就需要有复杂的机制来处理这种情况,如事务补偿机制、消息重试等,以确保订单和库存操作最终能够正确完成,保证系统的一致性。

(三)消息可靠性问题

消息丢失风险
  • 消息在生产、传输和消费过程中都有可能丢失。在生产阶段,如果生产者没有正确地将消息发送到消息队列,或者消息队列服务器出现故障导致消息未被正确接收,就会发生消息丢失。
  • 例如,在网络不稳定的情况下,生产者发送消息时可能因为网络中断而无法成功将消息发送到消息队列。在传输过程中,如果消息队列服务器之间的网络出现故障或者存储出现问题,也可能导致消息丢失。
消息重复消费风险
  • 消息可能会被重复消费。例如,消费者在处理消息后,由于网络抖动或者系统故障等原因,没有正确地向消息队列确认消息已经被消费,消息队列可能会认为该消息没有被消费,从而将消息再次发送给消费者。
  • 这就需要消费者具备幂等性(即对同一操作的多次重复执行结果和单次执行结果相同)来避免重复消费带来的问题,增加了系统开发的复杂性。

3. RabbitMQ死信队列、延时队列分别是什么

1. 死信队列

DLX(Dead Letter Exchange),死信交换器。
当队列中的消息被拒绝、或者过期会变成死信,死信可以被重新发布到另一个交换器,这个交换器就是DLX,与DLX绑定的队列称为死信队列。 造成死信的原因:

  • 信息被拒绝
  • 信息超时
  • 超过了队列的最大长度

2. 延迟队列

  • 延迟队列存储的是延迟消息

延迟消息指的是,当消息被发发布出去之后,并不立即投递给消费者,而是在指定时间之后投递。如:
在订单系统中,订单有30秒的付款时间,在订单超时之后在投递给消费者处理超时订单。

  • rabbitMq没有直接支持延迟队列,可以通过死信队列实现。
  • 在死信队列中,可以为普通交换器绑定多个消息队列,假设绑定过期时间为5分钟,10分钟和30分钟,3个消息队列,然后为每个消息队列设置DLX,为每个DLX关联一个死信队列。
  • 当消息过期之后,被转存到对应的死信队列中,然后投递给指定的消费者消费。

相关文章:

《面试之MQ篇》

《面试之MQ篇》 1. 为什么要使用MQ 首先,面试官问的第一个问题或者说是逼问的一个问题:“为什么要使用MQ”其实面试官问这个问题就是想考察你MQ的特性,这个时候呢,我们必须要答出三点:解耦、异步、削峰。 1. 解耦 1. 传统系统…...

Git 分支操作-开发规范

一、背景 在实际开发中,一般在主分支的基础上单独创建一个新的分支进行开发,最后合并到master分支,而不是直接在master分支进行开发。 二、新建分支 1、初始状态,local为本地分支,remote为远程分支 2、单击 “Remot…...

JSONArray根据指定字段去重

JSONArray dataList new JSONArray();这儿省略dataList 加数据的过程 dataList new JSONArray(dataList.stream().distinct().collect(Collectors.toList())); Set<String> timestamps new HashSet<>();根据时间字段去重 dataList dataList.stream().map(obj -…...

线程有哪几种状态? 分别说明从一种状态到另一种状态转变有哪些方式?

在 Java 中&#xff0c;线程的生命周期管理通过不同的状态来跟踪。一个线程在其生命周期中可以处于多种状态&#xff0c;不同的状态之间会通过特定的事件发生转变。以下是 Java 线程的几种状态及其之间的转移方式&#xff1a; 1. 线程的状态 1.1 NEW&#xff08;新建状态&…...

自注意力机制self-attention中的KV 缓存

在自注意力机制中&#xff0c;KV 缓存&#xff08;Key-Value Caching&#xff09;主要用于加速模型在推理阶段的计算&#xff0c;尤其是在处理长序列或者生成任务&#xff08;如文本生成&#xff09;时&#xff0c;这种缓存机制可以显著提高效率。 1. KV 缓存的背景 在 Trans…...

前端库--nanoid(轻量级的uuid)

文章目录 定义&#xff1a;生成方式&#xff1a;现实使用:NanoID 只有 108 个字节那么大NanoID更安全NanoID它既快速又紧凑 使用步骤1.安装nanoid包2.引入使用3.使用4.自定义字母 定义&#xff1a; UUID 是 通用唯一识别码&#xff08;Universally Unique Identifier&#xff…...

计算机基础-什么是网络端口?

网络端口可以想象成一个大型公寓楼的邮箱。每个公寓楼&#xff08;这里指的是一个计算机或服务器&#xff09;有很多个邮箱&#xff08;即网络端口&#xff09;&#xff0c;每个邮箱都有一个独一无二的编号&#xff08;端口号&#xff09;。当一封信&#xff08;网络数据包&…...

力扣动态规划基础版(斐波那契类型)

70. 爬楼梯https://leetcode.cn/problems/climbing-stairs/ 70.爬楼梯 方法一 动态规划 考虑转移方程和边界条件&#xff1a; f&#xff08;x&#xff09; f&#xff08;x -1&#xff09; f&#xff08;x - 2&#xff09;;f&#xff08;1&#xff09; 1&#xff1b;f&…...

Java重修笔记 InetAddress 类和 Socket 类

InetAddress 类相关方法 1. 获取本机 InetAddress 对象&#xff1a;getLocalHost public static InetAddress getLocalHost() throws UnknownHostException 返回值&#xff1a;本地主机的名字和地址 异常&#xff1a;UnknownHostException - 如果本地主机名无法解析成地址 2…...

秋招突击——8/6——万得数据面试总结

文章目录 引言正文面经整理一1、讲一下java的多态&#xff0c;重载&#xff0c;重写的概念&#xff0c;区别2、说一下Java的数组&#xff0c;链表的结构&#xff0c;优缺点3、创建java线程的方式有哪些&#xff0c;具体说说4、创建线程池呢、每个参数的意义5、通过那几种方式保…...

STM32定时器

目录 STM32定时器概述 STM32基本定时器 基本定时器的功能 STM32基本定时器的寄存器 STM32通用定时器 STM32定时器HAL库函数 STM32定时器概述 从本质上讲定时器就是“数字电路”课程中学过的计数器&#xff08;Counter&#xff09;&#xff0c;它像“闹钟”一样忠实地为处…...

第七课 Vue中的v-for遍历指令

Vue中的v-for遍历指令 v-for用于对象遍历&#xff08;数组/JSON&#xff09;&#xff0c;渲染数据列表 基础示例&#xff1a; <div id"app"><ul><li v-for"val in arr">{{val}}</li></ul></div><script>new V…...

【NTN 卫星通信】卫星通信的专利

1 概述 好久没有看书了&#xff0c;最近买了本讲低轨卫星专利的书&#xff0c;也可以说是一个分析报告。推荐给喜欢的朋友。 2 书籍截图 图1 封面 图2 波音低轨卫星专利演进 图3 低轨卫星关键技术专利发展阶段 图4 第一页 3 参考文献 产业专利分析报告–低轨卫星通信技术...

vue3 element table 插槽外的数据更新,插槽内的数据未更新。

在使用element table组件时候&#xff0c;有时候需要对table内部的header插槽进行单独的列的数据操作&#xff0c;比如在列头增加一个筛选功能&#xff0c;对指定范围的值进行一个筛选&#xff0c;需要对input的值进行v-model的绑定&#xff0c;对绑定的值进行清空时候&#xf…...

飞凌嵌入式FET527N-C核心板已适配OpenHarmony4.1

近期&#xff0c;飞凌嵌入式为FET527N-C核心板适配了OpenHarmony4.1系统——进一步提升了核心板的兼容性、稳定性和安全性。 OpenHarmony4.1在应用开发方面展现了全新的开放能力&#xff0c;以更加清晰的逻辑和场景化视角提供给开发者丰富的API接口&#xff0c;应用开发能力得…...

CVPR 2024最佳论文候选-pixelSplat论文解读

目录 一、概述 二、相关工作 1、单场景下的视角合成 2、基于先验的三维重建和视图合成 3、多视图几何测量 三、3DGS的缺点 1、容易陷入最小值 2、需要大量输入图像 3、尺度模糊性 四、pixelSplat 1、解决尺度模糊性&#xff08;深度信息生成&#xff09; 2、编码器…...

在Android中如何切割一张图片中的不规则“消息体/图片/表情包等等”?

在Android应用中&#xff0c;判断一张图片中“消息体”的大小&#xff0c;可以通过图像处理技术来实现。主要的步骤包括&#xff1a;将图像转换为灰度图&#xff0c;进行二值化处理&#xff0c;接着使用轮廓检测或边缘检测来识别消息体的边界&#xff0c;最后计算消息体的大小。…...

Jenkins+Ant+Jmeter接口自动化集成测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、Jenkins安装配置 1、安装配置JDK1.6环境变量&#xff1b; 2、下载jenkins.war&#xff0c;放入C:\jenkins目录下&#xff0c;目录位置随意&#xff1b; J…...

JavaSE——集合4:List接口实现类—LinkedList

目录 一、LinkedList的全面说明 二、LinkedList的底层操作机制 (一)LinkedList添加结点源码 (二)LinkedList删除结点源码 三、LinkedList常用方法 四、ArrayList与LinkedList的选择 一、LinkedList的全面说明 LinkedList底层实现了双向链表和双端队列的特点可以添加任意…...

FPGA图像处理之三行缓存

文章目录 一、前言二、FPGA实现三行缓存的架构三、Verilog代码实现四、仿真验证五、输入图像数据进行仿真验证 一、前言 在 FPGA 做图像处理时&#xff0c;行缓存是一个非常重要的一个步骤&#xff0c;因为图像输入还有输出都是一行一行进行的&#xff0c;即处理完一行后再处理…...

10月15日,每日信息差

第一、《哈利・波特与魔法石》在中国内地总票房突破 3 亿元&#xff0c;包括 2002 年首映的 5600 万&#xff0c;2020 年重映的 1.923 亿&#xff0c;以及 2024 年重映的 5170 万。 第二、全国铁路实施新货物列车运行图&#xff0c;增开城际班列至 131 列&#xff0c;多式联运…...

4G、5G通信中,“网络侧“含义

在5G通信中&#xff0c;"网络侧"这个术语可以指代不同的网络元素&#xff0c;具体取决于上下文。通常&#xff0c;网络侧可以包括以下两个主要部分&#xff1a; 基站&#xff08;gNB&#xff09;&#xff1a; 基站是无线接入网&#xff08;RAN&#xff09;的一部分&a…...

spring boot核心理解-各种starter

理解 Spring Boot 的 Starter 机制以及如何选择和使用各种 starter&#xff0c;是开发 Spring Boot 应用的重要一环。Spring Boot Starter 是一组方便的依赖组合&#xff0c;用于简化 Spring 项目中的依赖管理。它们可以帮助开发者快速引入所需的库和自动配置&#xff0c;从而加…...

解决海外社媒风控问题的工具——云手机

随着中国企业逐步进入海外市场&#xff0c;海外社交媒体的风控问题严重影响了企业的推广效果与账号运营。这种背景下&#xff0c;云手机作为一种新型技术解决方案&#xff0c;正日益成为企业应对海外社媒风控的重要工具。 由于海外社媒的严格监控&#xff0c;企业经常面临账号流…...

全能PDF工具集 | PDF Shaper Ultimate v14.6 便携版

软件简介 PDF Shaper是一款功能强大的PDF工具集&#xff0c;它提供了一系列用于处理PDF文档的工具。这款软件使用户能够轻松地转换、分割、合并、提取页面以及旋转和加密PDF文件。PDF Shaper的界面简洁直观&#xff0c;使得即使是新手用户也能快速上手。它支持广泛的功能&…...

Maven入门

Maven Maven Wrapper 版本一致性&#xff1a; Maven Wrapper 允许你在项目中指定一个特定的 Maven 版本。这意味着所有开发人员和 CI/CD 环境都将使用相同版本的 Maven&#xff0c;从而避免由于版本不一致导致的问题。 简化设置&#xff1a; 新开发者克隆项目时&#xff0c…...

Chromium 中window.DOMParser接口说明c++

一、DOMParser DOMParser 可以将存储在字符串中的 XML 或 HTML 源代码解析为一个 DOM Document。 备注&#xff1a; XMLHttpRequest 支持从 URL 可寻址资源解析 XML 和 HTML&#xff0c;在其response 属性中返回Document。 你可以使用XMLSerializer 接口执行相反的操作 - 将…...

linux 安装gitlab

安装环境 CentOS 7.7 (centos6.10会报错)2g内存防火墙关闭 安装步骤&#xff1a; 1 安装gitlab # yum install -y git curl policycoreutils-python openssh-server # 安装依赖 # wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-10.2.2-ce…...

java基础(5)继承与多态

目录 ​编辑 1.前言 2.正文 2.1继承 2.1.1继承概念 2.1.2继承语法 2.1.3子类访问父类 2.1.4super关键字 2.2多态 2.2.1多态概念 2.2.2多态条件 2.2.3重写 2.2.4向上转型与向下转型 2.2.5为什么要使用多态 3.小结 1.前言 哈喽大家好啊&#xff0c;今天继续来为大…...

Flink消费Kafka实时写入Doris

本文模拟实际生产环境&#xff0c;通过FileBeat采集日志信息到Kafka&#xff0c;再通过Flink消费Kafka实时写入Doris。 文章目录 Filebeat采集日志到KafkaFlink消费Kafka实时写入Doris总结 Filebeat采集日志到Kafka 常见的日志采集工具有以下几种&#xff1a;Flume、Logstash和…...