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

【大数据】Apache NiFi 助力数据处理及分发

Apache NiFi 助力数据处理及分发

  • 1.什么是 NiFi ?
  • 2.NiFi 的核心概念
  • 3.NiFi 的架构
  • 4.NiFi 的性能预期和特点
  • 5.NiFi 关键特性的高级概览

在这里插入图片描述

1.什么是 NiFi ?

简单的说,NiFi 就是为了解决不同系统间数据自动流通问题而建立的。虽然 dataflow 这个术语在各种场景都有被使用,但我们在这里使用它来表示不同系统间的自动化的可管理的信息流。自企业拥有多个系统开始,一些系统会有数据生成,一些系统要消费数据,而不同系统之间数据的流通问题就出现了。这些问题出现的相应的解决方案已经被广泛的研究和讨论,其中企业集成 eip(Enterprise Integration Patterns) 就是一个全面且易于使用的方案。

dataflow 要面临的一些挑战包括

  • Systems fail:网络故障,磁盘故障,软件崩溃,人为事故。
  • Data access exceeds capacity to consume:有时,给定的数据源可能会超过处理链或交付链的某些部分的处理能力,而只需要一个环节出现问题,整个流程都会受到影响。
  • Boundary conditions are mere suggestions:总是会得到太大、太小、太快、太慢、损坏、错误或格式错误的数据。
  • What is noise one day becomes signal the next:现实业务或需求变更快,设计新的数据处理流程或者修改已有的流程必须要迅速。
  • Systems evolve at different rates:给定的系统所使用的协议或数据格式可能随时改变,而且常常跟周围其他系统无关。dataflow 的存在就是为了连接这种大规模分布的,松散的,甚至根本不是设计用来一起工作的组件系统。
  • Compliance and security:法律,法规和政策发生变化。企业对企业协议的变化。系统到系统和系统到用户的交互必须是安全的,可信的,负责任的。
  • Continuous improvement occurs in production:通常不可能在测试环境中完全模拟生产环境。

多年来,数据流一直是架构中不可避免的问题之一。现在有许多活跃的、快速发展的技术,使得 dataflow 对想要成功的特定企业更加重要,比如 SOA,API,IOT,BigData。此外,合规性,隐私性和安全性所需的严格程度也在不断提高。尽管不停的出现这些新概念新技术,但 dataflow 面临的困难和挑战依旧,其中主要的区别还是复杂的范围,需要适应的需求变化的速度以及大规模边缘情况的普遍化。NiFi 旨在帮助解决这些现代数据流挑战。

2.NiFi 的核心概念

NiFi 的基本设计概念与基于流程的编程 FBP(Flow-based programming)的主要思想密切相关。以下是一些主要的 NiFi 概念以及它们如何映射到 FBP:

NiFi 术语FBP 术语描述
FlowFileInformation PacketFlowFile 表示在系统中移动的每个对象,对于每个 FlowFile,NiFi 都会记录它一个属性键值对和 0 个或多个字节内容(FlowFile 有 attributecontent
FlowFile ProcessorBlack Box实际上是处理器起主要作用。在 eip 术语中,处理器就是不同系统间的数据路由,数据转换或者数据中介的组合。处理器可以访问给定 FlowFile 的属性及其内容。处理器可以对给定工作单元中的零或多个流文件进行操作,并提交该工作或回滚该工作
ConnectionBounded BufferConnections 用来连接处理器。它们充当队列并允许各种进程以不同的速率进行交互。这些队列可以动态地对进行优先级排序,并且可以在负载上设置上限,从而启用背压
Flow ControllerScheduler流控制器维护流程如何连接,并管理和分配所有流程使用的线程。流控制器充当代理,促进处理器之间流文件的交换
Process GroupSubnet进程组里是一组特定的流程和连接,可以通过输入端口接收数据并通过输出端口发送数据,这样我们在进程组里简单地组合组件,就可以得到一个全新功能的组件(Process Group)

此设计模型也类似于 SEDA,带来了很多好处,有助于 NiFi 成为非常有效的、构建功能强大且可扩展的数据流的平台。其中一些好处包括:

  • 有助于处理器有向图的可视化创建和管理。
  • 本质上是异步的,允许非常高的吞吐量和足够的自然缓冲。
  • 提供高并发的模型,开发人员不必担心并发的复杂性。
  • 促进内聚和松散耦合组件的开发,然后可以在其他环境中重复使用并方便单元测试。
  • 资源受限的连接(流程中可配置 connections)使得背压和压力释放等关键功能非常自然和直观。
  • 错误处理变得像基本逻辑一样自然,而不是粗粒度的全部捕获(catch-all)。
  • 数据进入和退出系统的点,以及它是如何流动的,都是容易理解和跟踪的。

3.NiFi 的架构

在这里插入图片描述
NiFi 在操作系统上的 JVM 内执行。JVM 上 NiFi 的主要组件如下:

  • Web Server:Web 服务器的目的是承载 NiFi 基于 http 的命令和控制 API。
  • Flow Controller:是整个操作的核心,为将要运行的组件提供线程,管理调度。
  • Extensions:有各种类型的 NiFi 扩展,这些扩展在其他文档中进行了描述。这里的关键点是 NiFi 扩展在 JVM 中操作和执行。
  • FlowFile Repository:对于给定一个流中正在活动的 FlowFile,FlowFile Repository 就是 NiFi 保持跟踪这个 FlowFile 状态的地方。FlowFile Repository 的实现是可插拔的(多种选择,可配置,甚至可以自己实现),默认实现是使用 Write-Ahead Log 技术(简单普及下,WAL 的核心思想是:在数据写入库之前,先写入到日志,再将日志记录变更到存储器中)写到指定磁盘目录。
  • Content Repository:Content Repository 是给定 FlowFile 的实际内容字节存储的地方。Content Repository 的实现是可插拔的。默认方法是一种相当简单的机制,它将数据块存储在文件系统中。可以指定多个文件系统存储位置,以便获得不同的物理分区以减少任何单个卷上的争用(所以环境最佳实践时可配置多个目录,挂载不同磁盘,提高 IO)。
  • Provenance Repository:Provenance Repository 是存储所有事件数据的地方。Provenance Repository 的实现是可插拔的,默认实现是使用一个或多个物理磁盘卷。在每个位置内的事件数据都是被索引并可搜索的。

NiFi 也能够在集群内运行。

在这里插入图片描述
从 NiFi 1.0 版本开始,NiFi 集群采用了 Zero-Master Clustering 模式。NiFi 集群中的每个节点对数据执行相同的任务,但每个节点都在不同的数据集上运行。Apache ZooKeeper 选择单个节点作为集群协调器,ZooKeeper 自动处理故障转移。所有集群节点都会向集群协调器发送心跳报告和状态信息。集群协调器负责断开和连接节点。此外,每个集群都有一个主节点,主节点也是由 ZooKeeper 选举产生。我们可以通过任何节点的用户界面与 NiFi 集群进行交互,并且我们所做的任何更改都将复制到集群中的所有节点上。

4.NiFi 的性能预期和特点

NiFi 的设计目的是充分利用其运行的底层主机系统的能力。这种资源的最大化在 CPU 和磁盘方面尤其明显。

  • For IO:不同系统不同配置可预期的吞吐量或延迟会有很大差异,具体取决于系统的配置方式。鉴于大多数 NiFi 子系统都有可插拔的实现方法,所以性能取决于实现。但是,对于一些具体和广泛适用的地方,请考虑使用现成的默认实现。这些实现都是持久的,有保证的让数据流传递,并且是使用本地磁盘来实现。因此,保守点说,假设在典型服务器中的普通磁盘或 RAID 卷上的每秒读 / 写速率大约为 50 MB,那么,对于大型数据流,NiFi 应该能够有效地达到每秒 100 MB 或更多的吞吐量。这是因为预期添加到 NiFi 的每个物理分区和 Content repository 都会出现线性增长,瓶颈将出现在 FlowFile repositoryProvenance repository 的某个点上。我们计划提供一个基准测试和性能测试模板,然后允许用户能够轻松测试他们的系统并确定瓶颈在哪里,以及他们可能成为瓶颈的原因。此模板还应使系统管理员可以轻松进行更改并验证其影响。(期待这个测试功能的出现)

  • For CPU:Flow Controller 充当引擎的角色,指示特定处理器何时可以被分配线程去执行。编写处理器以在执行任务后立即释放线程。可以为 Flow Controller 提供一个配置值,该值指示它维护的各种线程池的可用线程。理想的线程数取决于主机系统内核数量,系统中是否正在运行其他服务,以及流程中要处理的流的性质。对于典型的 IO 大流量,合理的做法是让多线程可用。

  • For RAM:NiFi 在 JVM 中运行,因此限制于 JVM 提供的内存。JVM 垃圾回收成为限制实际堆总大小以及优化应用程序的运行的一个非常重要的因素。NiFi 作业在定期读取相同内容时可能会占用大量 I/O。可以配置足够大的磁盘以优化性能。

5.NiFi 关键特性的高级概览

  • Flow Management

    • Guaranteed Delivery:NiFi 的核心理念是,即使在非常高的规模下,也必须保证交付。这是通过有效地使用专门构建的 Write-Ahead Log 和 Content repository 来实现的。它们一起被设计成具备允许非常高的事务速率、有效的负载分布、写时复制和能发挥传统磁盘读 / 写的优势。
    • Data Buffering w/ Back Pressure and Pressure Release:NiFi 支持缓冲所有排队的数据,以及在这些队列达到指定限制时提供背压的能力,或在数据达到指定期限(其值已失效)时老化数据的能力。
    • Prioritized Queuing:NiFi 允许设置一个或多个优先级方案,用于如何从队列中检索数据。默认情况是先进先出,但有时应该首先提取最新的数据(后进先出)、最大的数据先出或其他定制方案。
    • Flow Specific QoS(latency v throughput, loss tolerance, etc.):可能在数据流的某些节点上数据至关重要,不容丢失,并且在某些时刻这些数据需要在几秒钟就处理完毕传向下一节点才会有意义。对于这些方面 NiFi 也可以做细粒度的配置。
  • Ease of Use

    • Visual Command and Control:数据流的处理逻辑和过程可能会非常复杂。能够可视化这些流程并以可视的方式来表达它们可以极大地帮助用户降低数据流的复杂度,并确定哪些地方需要简化。NiFi 可以实现数据流的可视化建立,而且是实时的。并不是 “设计、部署”,它更像泥塑。如果对数据流进行了更改,更改就会立即生效,并且这些更改是细粒度的和组件隔离的。用户不需要为了进行某些特定修改而停止整个流程或流程组。
    • Flow Templates:FlowFile 往往是高度模式化的,虽然通常有许多不同的方法来解决问题,但能够共享这些最佳实践却大有帮助。流程模板允许设计人员构建和发布他们的流程设计,并让其他人从中受益和复用。
    • Data Provenance:在对象流经系统时,甚至在扇入、扇出、转换等过程,NiFi 会自动记录、索引并提供可用的源数据。这些信息在支持法规遵从性、故障排除、优化以及其他方案中变得极其关键。
    • Recovery / Recording a rolling buffer of fine-grained history:NiFi 的 Content repository 旨在充当历史数据的滚动缓冲区。数据仅在 Content repository 老化或需要空间时才会被删除。Content repository 与 Data provenance 能力相结合,为在对象的生命周期中的特定点(甚至可以跨越几代)实现可以查看内容,内容下载和重放等功能提供了非常有用的基础。
  • Security

    • System to System:数据流越安全越好。对于数据流中每个节点 NiFi 都是通过使用加密协议(如双向 SSL)来安全地交换数据。此外,NiFi 的流程能够加密和解密内容,并在发送方 / 接收方任何一侧使用共享密钥或其他机制来保证数据的安全。
    • User to System:NiFi 支持双向 SSL 身份验证,并提供可插拔授权方式,以便能够正确控制用户的访问权限和特定级别(只读,数据流管理,admin)。如果用户在流程中输入敏感属性(如密码),则会立即在服务器端加密,保证敏感信息不会再次暴露在客户端(前端 UI)中(比如用户 A 在流程中输入了 MySQL 的用户密码,填写完毕后任何人即使是用户 A 也看不到明文密码)。
    • Multi-tenant Authorization:NiFi 数据流的权限级别适用于每个组件,并且允许管理员用户拥有细粒度的控制访问级别。这意味着每个 NiFi 集群都能够处理一个或多个组织的需求。与隔离拓扑相比,多租户授权支持数据流管理的自助服务,允许每个团队或组织在完全了解流的其余部分的情况下管理流,而无法访问流。
  • Extensible Architecture

    • Extension:NiFi 的核心是可扩展,因此它是一个能以可预测和可重复的方式去执行和交互的数据流流程平台。可扩展的包括:processorsController ServicesReporting TasksPrioritizersCustomer User Interfaces
    • Classloader Isolation:对于任何基于组件的系统,涉及依赖的问题时常发生。NiFi 通过提供自定义类加载器来解决这个问题,确保每个扩展包都暴露在一组非常有限的依赖中。因此,构建扩展包的时候不必担心它们是否可能与另一个扩展包冲突。这些扩展包的概念称为 “NiFi Archives”,在 Developer’s Guide 中有更详细的讨论。
    • Site-to-Site Communication Protocol:NiFi 实例之间的首选通信协议是 NiFi 站点到站点(S2S)协议。S2S 轻松,高效,安全地将数据从一个 NiFi 实例传输到另一个实例。NiFi 客户端库可以轻松构建并捆绑到其他应用程序或设备中,通过 S2S 协议与 NiFi 进行通信。S2S 中支持以 Socket 的协议和 HTTP / HTTPS 协议作为底层传输协议,使得可以将代理服务器嵌入到 S2S 协议的通信中。
  • Flexible Scaling Model

    • Scale-out (Clustering):NiFi 的设计是可集群,可横向扩展的。如果配置单个节点并将其配置为每秒处理数百 MB 数据,那么可以相应的将集群配置为每秒处理 GB 级数据。但这也带来了 NiFi 与其获取数据的系统之间的负载平衡和故障转移的挑战。采用基于异步排队的协议(如消息服务,Kafka 等)可以提供帮助解决这些问题。使用 NiFi 的 S2S 功能也非常有效,因为它是一种协议,允许 NiFi 和客户端(包括另一个 NiFi 群集)相互通信,共享有关加载的信息,以及交换特定授权的数据端口。
    • Scale-up & down:NiFi 还可以非常灵活地扩展和缩小。从 NiFi 框架的角度来看,在增加吞吐量方面,可以在配置时增加 “调度” 选项卡下处理器上的并发任务数。这允许更多线程同时执行,从而提供更高的吞吐量。另一方面,您可以完美地将 NiFi 缩小到适合在边缘设备上运行,因为硬件资源有限,所需的占用空间很小,这种情况可以使用 MiNiFi。

相关文章:

【大数据】Apache NiFi 助力数据处理及分发

Apache NiFi 助力数据处理及分发 1.什么是 NiFi ?2.NiFi 的核心概念3.NiFi 的架构4.NiFi 的性能预期和特点5.NiFi 关键特性的高级概览 1.什么是 NiFi ? 简单的说,NiFi 就是为了解决不同系统间数据自动流通问题而建立的。虽然 dataflow 这个术…...

什么是 SRE?一文详解 SRE 运维体系

目录 可观测性系统 故障响应 故障复盘 测试与发布 容量规划 自动化工具开发 用户体验 可观测性系统 在任何有一定规模的企业内部,一旦推行起来整个SRE的运维模式,那么对于可观测性系统的建设将变得尤为重要,而在整个可观测性系统中&a…...

【Docker】初识 Docker,Docker 基本命令的使用,Dockerfile 自定义镜像的创建

文章目录 前言:项目部署的挑战一、初识 Docker1.1 什么是 Docker1.2 Docker 与 虚拟机的区别1.3 镜像和容器以及镜像托管平台1.4 Docker的架构解析1.5 Docker 在 CentOS 中的安装 二、Docker 的基本操作2.1 操作 Docker 镜像命令2.1.1 镜像操作相关命令2.1.2 示例一…...

【Docker】简易版harbor部署

文章目录 依赖于docker-compose下载添加执行权限测试 安装harbor下载解压修改配置文件部署配置开机自启动登录验证 使用harbor登录打标签上传下载 常见问题 依赖于docker-compose 下载 curl -L “https://github.com/docker/compose/releases/download/2.22.0/docker-compose-…...

Zookeeper经典应用场景实战(一)

文章目录 1、Zookeeper Java客户端实战1.1、 Zookeeper 原生Java客户端使用1.2、 Curator开源客户端使用 2、 Zookeeper在分布式命名服务中的实战2.1、 分布式API目录2.2、 分布式节点的命名2.3、 分布式的ID生成器 3、Zookeeper实现分布式队列3.1、 设计思路3.2、 使用Apache …...

Chrome报错:Unchecked runtime.lastError

项目背景、安装了 Express 框架,目的是为了快速创建一个web服务器。创建成功后,控制台出现了报错,而在这之前没有出现过这个错误,所以一直在纠结是不是框架本身的问题。 错误原因:这个错误一般是浏览器与扩展或者插件…...

【算法】算法设计与分析 课程笔记 第三章 动态规划

1.1 动态规划简介 1.1.1 引例 动态规划算法和分治法类似,基本思想也是将待求解问题分解成若干个子问题,子问题可以以继续拆分,直到问题规模达到临界条件即可。多说无益,举个例子来解释一下: 这其实是一个多阶段图求最…...

贪心找性质+dp表示+矩阵表示+线段树维护:CF573D

比较套路的题目 首先肯定贪心一波,两个都排序后尽量相连。我一开始猜最多跨1,但其实最多跨2,考虑3个人的情况: 我们发现第3个人没了,所以可以出现跨2的情况 然后直接上dp,由 i − 1 , i − 2 , i − 3 i…...

小谈设计模式(17)—状态模式

小谈设计模式(17)—状态模式 专栏介绍专栏地址专栏介绍 状态模式关键角色上下文(Context)抽象状态(State)具体状态(Concrete State) 核心思想Java程序实现首先,我们定义一个抽象状态类 State,其中包含一个处理请求的方法 handleRe…...

Arm64体系架构-MPIDR_EL1寄存器

背景 在Arm64多核处理器中, 各核间的关系可能不同. 比如1个16 core的cpu, 每4个core划分为1个cluster,共享L2 cache. 当我们需要从core 0将任务调度出来时,如果优先选择core 1~3, 那么性能明显时优于其他core的. 那么操作系统怎么知道core之间这样的拓扑信息呢? Arm提供了MPID…...

MySQL支持哪些存储引擎

mysql支持九大存储引擎: 1)MYISAM存储引擎(优点:可被转换为压缩、只读表来节省空间。) 它管理的表具有以下特征: 使用三个文件表示每个表 格式文件-存储表结构的定义(mytable.frm) 数据文件-存…...

ElementUI结合Vue完成主页的CUD(增删改)表单验证

目录 一、CUD ( 1 ) CU讲述 ( 2 ) 编写 1. CU 2. 删除 二、验证 前端整合代码 : 一、CUD 以下的代码基于我博客中的代码进行续写 : 使用ElementUI结合Vue导航菜单和后台数据分页查询 ( 1 ) CU讲述 在CRUD操作中,CU代表创建(Create&#xff09…...

Flutter开发笔记 —— 语音消息功能实现

前言 最近在开发一款即时通讯(IM)的聊天App,在实现语音消息功能模块后,写下该文章以做记录。 注:本文不提供相关图片资源以及IM聊天中具体实现代码,单论语音功能实现思路 需求分析 比起上来直接贴代码,我们先来逐步…...

冒泡排序和选择排序

目录 一、冒泡排序 1.冒泡排序的原理 2.实现冒泡排序 1.交换函数 2.单躺排序 3.冒泡排序实现 4.测试 5.升级冒泡排序 6.升级版代码 7.升级版测试 二、选择排序 1.选择排序的原理 2.实现选择排序 1.单躺排序 2.选择排序实现 3.测试 ​4.修改 5.测试 一、冒泡排序…...

【深度学习】UNIT-DDPM核心讲解

文章目录 大致介绍:扩散损失:转换损失:循环一致性损失:推理过程:优缺点: 参考文章: https://blog.csdn.net/ssshyeong/article/details/127210086 这篇文章对整个文章 UNIT-DDPM: UNpaired Imag…...

Java 线程的优先级

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,…...

金融数学方法:牛顿法

目录 1.牛顿法1.1 牛顿法介绍1.2 算法步骤 2. 具体算例3.总结 1.牛顿法 1.1 牛顿法介绍 牛顿法(Newton’s method),也被称为牛顿-拉夫森方法(Newton-Raphson method),是一种用于数值逼近根的迭代方法。它是…...

MongoTemplate | 多条件查询

MongoTemplate查询 Resource private MongoTemplate mongoTemplate;public <T> List<T> getDataList(String param1, Long param2, Class<T> clazz) {// 构建queryQuery query constructQuery(param1, param2);// 查询return mongoTemplate.find(query, cl…...

优秀程序员是怎么思考的?

首发日更公 Z 号&#xff1a;十二又十三 作为一名优秀的程序员&#xff0c;思考是我们工作中最重要的一部分。它不仅能够帮助我们解决问题&#xff0c;还能够提升我们的技术水平和职业发展。那么&#xff0c;优秀程序员是如何思考的呢&#xff1f;本文将为您介绍一个思考框架和…...

【juc】countdownlatch实现游戏进度

目录 一、截图示例二、代码示例 一、截图示例 二、代码示例 package com.learning.countdownlatch;import java.util.Arrays; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurr…...

Spring Webflux HttpHandler源码整理

HttpHandler的构造 自动启动配置类&#xff1a;HttpHandlerAutoConfigurationBean public HttpHandler httpHandler(ObjectProvider<WebFluxProperties> propsProvider) {HttpHandler httpHandler WebHttpHandlerBuilder.applicationContext(this.applicationContext).…...

Qt扩展-Advanced-Docking 简介及配置

Advanced-Docking 简介及配置 一、概述二、项目结构三、安装配置四、代码测试 一、概述 Advanced-Docking 是类似QDockWidget 功能的多窗口停靠功能的库。很像visual stdio 的 停靠功能&#xff0c;这个库对于停靠使用的比较完善。很多的软件都使用了这个框架。 项目源地址&a…...

Decorator

Decorator 动机 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”&#xff0c; 由于继承为类型引入的静态特质&#xff0c;使得这种扩展方式缺乏灵活性&#xff1b; 并且随着子类的增多&#xff08;扩展功能的增多&#xff09;&#xff0c;各种子类的组合&#xff…...

分布式文件系统HDFS(林子雨慕课课程)

文章目录 3. 分布式文件系统HDFS3.1 分布式文件系统HDFS简介3.2 HDFS相关概念3.3 HDFS的体系结构3.4 HDFS的存储原理3.5 HDFS数据读写3.5.1 HDFS的读数据过程3.5.2 HDFS的写数据过程 3.6 HDFS编程实战 3. 分布式文件系统HDFS 3.1 分布式文件系统HDFS简介 HDFS就是解决海量数据…...

CSS中:root伪类的使用

在CSS中&#xff0c;:root是一个伪类选择器&#xff0c;它选择的是文档树的根元素。在HTML文档中&#xff0c;这个根元素通常是<html>。:root伪类选择器常常被用于定义全局的CSS变量或者设置全局的CSS样式。 例如&#xff0c;你可以使用:root来定义一个全局的字体大小&a…...

VulnHub JANGOW

提示&#xff08;主机ip分配问题&#xff09; 因为直接在VulnHub上下载的盒子&#xff0c;在VMware上打开&#xff0c;默认是不分配主机的 所以我们可以在VirtualBox上打开 一、信息收集 发现开放了21和80端口&#xff0c;查看一下80端口 80端口&#xff1a; 检查页面后发现…...

OpenMesh 获取网格面片各个顶点

文章目录 一、简介二、实现代码三、实现效果一、简介 OpenMesh中有很多循环器,这里便是其中一种面顶点循环器,以此来获得面片的各个顶点。 二、实现代码 #define _USE_MATH_DEFINES #include <iostream> #include <unordered_map>...

【前端设计模式】之原型模式

原型模式特性 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过克隆现有对象来创建新对象&#xff0c;而不是通过实例化类。原型模式的主要特性包括&#xff1a; 原型对象&#xff1a;原型对象是一个已经存在的对象&#xff0c;它作…...

软件设计原则

设计原则 一、单一原则 1. 如何理解单一职责原则 单一职责原则&#xff08;Single Responsibility Principle&#xff0c;简称SRP&#xff09;&#xff0c;它要求一个类或模块应该只负责一个特定的功能。实现代码的高内聚和低耦合&#xff0c;提高代码的可读性和可维护性。 …...

【面试HOT100】哈希双指针滑动窗口

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于LeetCodeHot100进行的&#xff0c;每个知识点的修正和深入主要参考…...

建设银行河北省分行官方网站/头条站长平台

必备技术参考链接所属阶段课前技能IDEA工具使用https://gitee.com/lagouedu/Basic-document/blob/master/document/IDEA.md程序员开发协作工具使用1、下载安装idea 2、idea构建maven分模块项目 3、集成mave、git 4、常用快捷Maven使用https://gitee.com/lagouedu/Basic-documen…...

个人网站建设与维护/推广一般收多少钱

简介 为了方便开发人员可视化配置gpio&#xff0c;MTK提供了DCT工具&#xff0c;全称是Driver Customization Tool&#xff0c;该工具导入dws文件来产生驱动代码&#xff0c;它是个exe可执行程序&#xff0c;目前只支持在windows下运行&#xff0c;在ubuntu下运行可借助于wine…...

怎么做网赌网站/网络营销的方式和方法

前言 Javascript是一门基于对象的动态语言&#xff0c;也就是说&#xff0c;所有东西都是对象&#xff0c;一个很典型的例子就是函数也被视为普通的对象。Javascript可以通过一定的设计模式来实现面向对象的编程&#xff0c;其中this “指针”就是实现面向对象的一个很重…...

益阳网站开发/外贸接单平台哪个最好

## 获取指定行 var row $(#stuA).datagrid(getRows)[0]; 注&#xff1a;stuA为table id ## 获取选中行 var row $(#stuA).datagrid(getSelected);...

微信公众号(网站建设)合同/亚马逊alexa

转载于:https://www.cnblogs.com/liying123/p/5268796.html...

企业网站管理系统如何使用说明/最新域名ip地址

题目&#xff1a;原题链接&#xff08;中等&#xff09; 标签&#xff1a;字符串 解法时间复杂度空间复杂度执行用时Ans 1 (Python)O(N)O(N)O(N)O(1)O(1)O(1)36ms ( 79.64%)Ans 2 (Python)Ans 3 (Python) 解法一&#xff1a; class Solution:def removeVowels(self, S: str)…...