数据接入平台(DIP)系列文章之一|功能及架构浅析

「数据接入篇」数据同步策略和实施总结 大数据数仓开发不能不了解数据接入,本篇就来系统地讲解下业界对数据接入的实践总结分享 阅读详情

导语

腾讯云消息队列CKafka推出数据接入平台(Data Import Platform),旨在构建数据源和数据处理系统间的桥梁。

为了让开发者们更加深入的了解数据接入平台(DIP),腾讯云消息队列团队将组织系列文章,为大家详解数据接入平台(DIP)的功能及架构。

作者简介

许文强  

腾讯高级工程师

Apache Kafka Contributor,腾讯云Kafka和数据接入平台DIP研发负责人。专注于中间件领域的系统设计和开发,在消息队列领域具有丰富的经验。

数据实时接入和分析面临的挑战

随着大数据时代的到来,企业在生产和经营活动中产生的各类数据正以前所未有的速度增长,通过对实时及历史数据的融合分析,及时挖掘业务洞察和辅助决策,已成为企业的普遍行动。

有一种观点认为大数据存在“3V”特性:Volume, Velocity, Variety。这三个“V”表明大数据的三方面特征:量大,实时和多样。这三个主要特征对数据链路系统的影响尤为突出。多种多样的数据源,海量的数据以及实时高效的采集传输是数据链路系统主要面对的几个问题。即系统需要在满足实时性指标的同时,也具备生产环境下的高可用性和易用性。

下图是一个非常经典的数据链路的架构图。从左到右,依次是数据源、数据接入层、数据缓冲层、数据分发层、数据目标,可以看出,搭建一个完整的数据链路非常复杂繁琐。

在云原生的浪潮下,企业需要聚焦业务,迫切需要简单易行,零代码地配置搭建起自己的数据链路系统。因此数据链路系统需要如下几个特征:SAAS化、低代码化、简单易用、稳定可靠、高性能、按量付费,以达到整体上的降本增效。

基于上述诉求,我们推出了数据接入平台(Data Import Platform)。

关于数据接入平台

数据接入平台定义

腾讯云消息队列CKafka推出的数据接入平台(Data Import Platform),是腾讯云上SAAS化的数据接入和处理平台,协助客户方便快捷地完成一站式的数据接入、处理和分发。平台提供基于 HTTP/TCP 协议的 SDK 协助客户快速完成数据上报、基于 CDC(Change Data Capture)机制快速订阅、存储多款数据库(MySQL、PostgreSQL、MongoDB 等)变更信息,打通了多款云产品的日志投递。并提供了简单可配置的数据清洗 (ETL) 能力,以及丰富的数据流出渠道,协助客户低成本搭建数据流转链路,构建数据源和数据处理系统间的桥梁。

DIP类似于传统大数据解决方案中Kafka+Flink的角色,提供了通用的数据连接、处理、流转的功能。核心诉求是希望可以协助客户低成本的搭建整条的数据链路。根据二八原则,DIP希望解决大部分通用的数据连接场景。而对于业务属性强,逻辑复杂的还是需要依赖Flink等流式计算引擎来实现。

在离线计算场景,DIP提供了一个缓冲队列的作用,同时由于DIP提供了各种MQ与其他腾讯云上下游产品的对接功能,所以又扮演了数据分发枢纽的角色。

DIP和Kafka的关系

DIP是由腾讯云上CKafka孵化出的数据接入产品,底层基于开源Kafka Connector和自研接入分发层。从本质上来看,Kafka是消息队列,属于存储产品。而DIP是数据接入分发平台,定位为存储层(MQ)的上下游数据连接。

DIP与Kafka的区别

IP旨在围绕消息队列(MQ)生态,做好上下游的数据连接。消息队列属于PAAS产品,DIP定位为SAAS产品,提供一站式的数据链路搭建方案。DIP希望达到低代码、免运维、按量付费、Serverless化的效果,后续会支持多种消息队列协议接入。

DIP优势

01

易用性

仅需通过简单的界面配置,轻松完成数据上报、清洗,存储的链路搭建。屏蔽数据接入过程中底层复杂的系统搭建、组件运维过程。

02

上下游生态融合

支持云上、云下(跨云、混合云)场景、支持自建和云上服务的数据连接。实现了五大类(数据库、文件、MQ、主动上报、日志),15+云上产品打通,一站式实现数据的接入和流动。

03

高可用

接入层、处理层、分发层均为分布式跨可用区部署,遇到故障即可自动切换,服务可用性不低于99.9%。

04

实时性

在数据采集、上报和流转整条链路过程中,实现秒级的接收、处理、并分发到下游系统。

05

安全性

数据接入平台支持不同租户间网络隔离,支持数据上报集成 CAM 鉴权、数据流转集成 SASL 权限控制,严格控制访问权限,保证数据安全。

06

弹性伸缩

无需预估业务容量,系统会根据流量规模自动弹性伸缩,保证波峰时系统可用性。按需使用,Serverless 化的完成数据接入、处理、转储的整个流程。

DIP应用场景

数据上报

在系统开发中,会有一些数据统一上报的需求,比如监控数据、用户行为数据、APP操作数据等,需要将数据统一上报到服务端,供业务进行查询、处理、分析等。如手机 APP 的操作行为分析、前端页面的 Bug 日志上报、业务数据的上报等等。

一般情况下,这些上报的数据都需要转储到下游的存储分析系统里面进行处理(如 Elasticsearch,HDFS,数据湖等)。在常规操作中,我们需要搭建 Server、购买存储系统、并在中间自定义代码进行数据接收、处理、转储等。而server端需要考虑性能、稳定性、扩缩容等工作,实际工作量较大。

DIP 旨在用 SaaS 化的思路解决这个问题,目标是通过如下两步:界面配置、SDK 上报,完成整个链路的搭建,并基于 Serverless 理念,以按量计费,弹性伸缩,无需预估容量等方式,简化客户的研发投入成本和实际的使用成本。

申请一个接入点ID即可完成数据接入,DIP提供了两种协议的SDK,HTTP协议及kafka协议。通过HTTP协议可以将数据上报到Kafka/Pulsar或其他消息队列,可以屏蔽多种消息队列的复杂SDK使用。

数据库变更信息订阅

DIP 支持基于 CDC(Change Data Capture)机制订阅多款数据库的变更数据。如订阅 MySQL 的 Binlog,MongoDB 的Change Stream,PostgreSQL 的行级的数据变更(Row-level Change),SQL Server 的行级的数据变更(Row-level Change)等。例如,在实际业务使用过程当中,业务经常需要订阅 MySQL 的 Binlog 日志,获取 MySQL 的变更记录(Insert、Update、Delete、DDL、DML 等),并针对这些数据进行对应的业务逻辑处理,如查询、故障恢复、分析等。

在默认情况下,客户往往需要自定义搭建基于CDC的订阅组件如(Canal、Debezium、Flink CDC 等)来完成对数据库的数据订阅。而在搭建、运维这些订阅组件的过程中,人力投入成本较高,需要搭建配套的监控体系,保证订阅组件的稳定运行。

基于此种情况,DIP 提供 SaaS 化的组件,通过界面配置化的完成数据的订阅、处理、转储等整个流程。

数据清洗和分发

大多数情况下,数据接入后,需要进行简单的处理过滤和归一化,才能往下游进行下一步存储、查询和分析。简单的处理过滤和归一化就是数据的清洗与分发,数据清洗是指数据A变成数据B,数据分发就是指Kafka有一份数据既想分发到ES又想分发到COS,同时也希望计算平台可以计算。

例如,在简单的数据群里,在自建的场景中,对原始的日志进行格式化,进行分割重新组合、类型转换等这些操作,清洗完一个数据,再存到下一轮去。常规的做法就是需要写代码或者使用Logstash等开源组件进行ETL操作,但处理效率低,成本高,需大量配置才能处理海量数据,经常性遇到性能问题导致上有数据堆积。

如果使用DIP,我们会提供产品化配置界面,可以完成一键化配置,低代码实现数据的过滤和清洗。也无需关注扩缩容的问题,省去开源组件的学习成本,同时减少组件运维成本,支持用函数进行高级清洗,我们旨在打造一个更SAAS化的产品。

数据链路搭建

在实际业务过程中,用户经常需要将多个数据源的数据汇总到消息队列中,比如业务客户端数据、业务 DB数据、业务的运行日志数据汇总到消息队列中进行分析处理。正常情况下,需要先将这些数据进行清洗格式化后,再做统一的转储、分析或处理,创建整个数据链路就比较长。

DIP 支持将不同环境(腾讯公有云、用户自建 IDC、跨云、混合云等)的不同数据源(数据库、中间件、日志、应用系统等)的数据集成到公有云的消息队列服务中,以便进行数据的处理和分发。

DIP 提供了数据聚合、存储、处理、转储的能力。简而言之,就是提供数据连接集成的能力,将不同的数据源连接到下游的数据目标中,这样搭建数据链路就比较方便。创建任务后,整个任务的运行状态都是完全透明的,比如全链路监控、数据审计等,以保证数据在数据链路中不会丢失。

在整个数据链路搭建中,客户可以感知到的成本几乎为零,在这个基础上客户还可以享受到其他的服务,我们采用的是以serverless为底层的机制,自动扩缩容按量付费,既节省人工成本,又节省经济成本。

DIP技术架构

DIP的数据架构分为两层,一层是数据面,一层是管控面。管控面是指资源管理、监控调度,自动扩缩容、迁移等管控的操作。比如监控采集,客户可以把整个任务各个环节进行监控采集,配置告警。

DIP的核心还是数据面的,下图是DIP系统架构图:可以看到根据数据流转的链路,分为数据接入、数据处理、数据流出三大块。

数据接入的方式有三种:主动订阅、数据上报、自建IDC到混合云、跨云或公有云等多种云场景下获取数据。整个数据层面是多个引擎运行的。

在数据接入模块,DIP支持的数据源又可以分为三大类。一类是像mongodb、mysql这样的服务类数据,第二类是通过我们维护的日志采集器,采集到的TKE、CVM等等的日志数据;第三类是HTTP上报的、WEB、APP产生的数据。前两类数据源我们都会提供完全产品化的配置界面,在控制台简单点击配置就可以连通,用户不需要关心底层实现。第三类主动上报类的我们会提供SDK和接入点,把接入点写入到SDK就可以实现数据上报。

上面提到的异构数据源接入之后,我们提供数据清洗归一化的能力。对于通用的清洗模板,我们会提供完全产品化的配置界面,对于一些高级的自定义清洗规则,我们支持使用灵活的函数计算。

通过数据接入和实时计算,可以把多种数据源的异构数据实时清洗成统一的结构化数据投递到下游es、clickhouse等多种大数据系统或者存储系统。投递过程也是完全产品化的配置界面,只需要选择数据源和数据目标,点点点即可。

对这些数据流转任务,支持查看监控,可以查询在任务中投递的消息。之后DIP会支持任务编排,在控制台上可以清晰地看到数据流转链路,也可以对这个链路进行一些像加入和删除节点、编辑和查看监控的操作,同时支持指定schema,指定消息数据的格式。

通过上面这几大模块,我们就可以实时接入APP、WEB、IoT和数据库等产生的异构数据,统一管理,并投递到下游的分析、归档等系统,构建清晰的数据流,更好地释放数据的价值。

数据流引擎 - Kafka Connector

DIP底层的核心引擎,是基于Kafka的生态做的数据连接引擎。 在Kafka的原生社区中有Kafka Connector的概念,Connector就是把各个数据的数据源导进来,提供插件化的开发方式,定义一套接口,可以实现不同的插件(JDBC、MQTT、MongoDB等)协议,然后把数据从数据源拉进来。

Connector可以简单理解为是一个依托于Kafka的分布式任务管理器,JDBC等不同的插件以线程的方式运行在整个分布式任务引擎中。

比如当创建任务的时候,如果指定三个并行度,Connector就会创建三个线程,它的任务就会调度到集群的每台机器上运行。Sink也适用于这套机制,Connector本身支持很多插件(如HDFS、HBase、S3、ES等)。这些插件就会在集群中运行,自动调度,会注册很多监控指标。我们的监控平台就会采集这些指标,依托这些指标去告警,扩缩容等,保证整个集群的稳定性,比如负载是否达到了一个阈值,当前的资源是否需要扩容,当前的任务是否存在异常等。

数据流引擎 - HTTP接入层

数据流引擎支持HTTP和HTTPS的协议接入,我们提供了各个语言丰富的SDK,当客户拿到SDK后,简单来说新创建一个对象,发送数据就可以了,数据就会上报到服务端进行存储。

服务端有几层,首先接收层分布式部署,可以水平扩容,每台机器节点都会维护底层和Kafka缓冲的连接池,在连接池中接收到的数据会直接转发存储到消息缓冲层中。数据流虽然从流程上看比较简单,但其实需要考虑很多情况,比如是不是有负载倾斜,是不是有一些请求需要有一批独占的节点去维护等等。

从本质上来讲,我们在HTTP接入层要做的就是把数据接进来,做一个producer,导到消息队列里面,中间我们就会做很多高可用、自动恢复、自动扩缩容的事情来保证整个接入层的稳定性。

CDC & Transform Engine

除了两个底层引擎,还有两个小细节需要说明,一个是CDC(Change Data Capture),一个是Transform Engine。

CDC(Change Data Capture)即变更数据订阅,它是数据库领域非常常见的技术,主要用于订阅数据库的一些变更, 然后可以把变更数据发送到下游,这个技术主要是数据库中才有的概念,数据库包括mysql、pgsql、mongo等。

数据转换引擎(Transform Engine)是指将源数据A转换为源数据B。从技术上来讲,通过自定义代码、logstash、flink这些都可以达到这个功能。Kafka原生内核也集成了这部分功能,同时提供了很多数据处理插件,基于插件实现某个类,这个类就可以实现对应的数据转换功能。

Kafka的转换引擎与其他引擎的区别在于它是非常轻量的,在数据处理里,它的定位是一个简单的数据处理引擎而不是一个全量的数据处理组件。

客户案例

某教育客户 - 数据上报

某教育客户需要将直播课学生上下课、签到、浏览等一些行为信息上传到后台进行分析、处理和检索。数据在后台主要有两种业务逻辑:

  1. 自定义代码拿到上报数据,进行对应业务逻辑处理;

  2. 原始数据进入 Elasticsearch 进行检索分析。

因开发人力有限,希望有一种方便的数据接入服务,简单快速地完成数据的上报、存储。

在经典数据上报架构中,通常需要有如下几个步骤:

  1. 搭建/购买存储引擎,用来存储上报的数据;

  2. 开发部署数据接收的Server、定义API、运行服务;

  3. 定义客户端和服务端的接口协议、鉴权等信息;

  4. 客户端根据协议信息编写相应的代码完成数据上报。

在这个4步中,Server端的工作量是最大的,需要考虑代码逻辑开发、server本身扩缩容、接入层本身的稳定性、下游存储的扩缩容和稳定性等等。而当数据量大时,Server端问题会更加明显,需要消耗大量的人力物力来进行维护。

从技术上看,这部分工作通用性很高,DIP可以满足这种场景,提供稳定、弹性、高可靠、高吞吐的数据接入服务。客户可以通过Android、iphone、web这些客户端在我们的SDK把数据直接放到DIP中,DIP目前的缓冲层有两种形态。如果客户用量较大,可以买一个Kafka集群,选自己的topic,不需要为存储付费。量比较小的话也不需要买整个Kafka集群,只需要买单个topic,按量付费。然后进行数据分发,建一个sink,存到es。第二部分会自定义代码,把Kafka协议拿下,这样整个研发成本都可以降下来。

某资讯平台 - 数据处理分发

某资讯平台,服务部署在TKE里面,日志通过TKE的采集器投递到了云上的Kafka。这些日志数据主要有三个用途。

部分数据需要进入ElasticSearch进行检索;部分数据经过简单处理后,需要保存到COS进行持久化的存储;部分数据需要进入大数据系统进行业务逻辑方面的处理。当前的做法是写一套大数据处理的Flink逻辑代码,一套处理并转储到ES、COS的代码,然后在两套代码中进行逻辑处理、清洗和分发。

因为Flink 学习维护成本较高,客户早期没有使用Flink时使用的是Logstash ,Logstash在运维过程中,遇到较多性能、稳定性、扩缩容的问题。而且自编码开发迭代投入的人力较多,运维也需要消耗精力。客户希望云上能够有服务能够替换这两部分的工作。如果客户使用DIP数据分发的功能,就可以直接把数据简单处理,直接分发到ES,其余部分只能用Flink,这样就可以省了很多人力成本。

某迅销公司 – PGSQL 数据订阅查询

某迅销平台内部有多套系统并行运行,某套系统存储引擎为PGSQL。需要将PGSQL的变更数据存量导入到Elasticsearch里面进行查询。有如下几个需求:

  1. 数据写入es的时候需要根据时间分索引;

  2. 因为某个数据量大,希望在某个时间区间内只保留某个唯一ID标识的最新数据(update);

  3. 需要根据不同的表将数据分发到不同的索引里面。

自建的架构:PGSQL + Debezium PGSQL + Kafka Connector + Kafka + Logstash + Elasticsearch

DIP架构:      PGSQL + DIP + Elasticsearch

可以看出,客户自建时的链路很长,但如果使用DIP,中间一部分都被替代了,这时候只需要维护两个任务,从研发层面来看,学习成本降低很多。

某保险客户 - HTTP协议接入MQ

某保险客户的中台团队迁移上云,因下游团队众多,使用多款MQ产品(Kafka,RocketMQ,RabbitMQ)。各个MQ都是TCP协议接入,有各自的SDK。SDK学习、使用、以及后续切换成本较高。

基于中台考虑,希望上云后能够通过简单的HTTP协议进行接入,屏蔽底层的具体引擎细节。

有三个要求:

  1. 简化客户端的使用,最好是HTTP协议;

  2. 底层MQ引擎切换对业务无感知;

  3. 最好有现成的支持HTTP协议的SDK。

上述客户的需求使用DIP都可以满足。

内部视频客户 - 数据入湖

某内部客户,主要的两部分,业务数大部分都存在MongoDB里面。有一部分客户行为数据,需要上报后进行分析。客户希望将这些数据统一到数据湖(iceberg)进行分析。

自建链路遇到的问题,链路太长,涉及的组件非常多。大多数组件是分布式部署,扩缩容复杂,维护链路的稳定性,透明监控需要花费大量精力。使用DIP后,只需要简单配置,SAAS化,链路的稳定性,扩缩容依托平台处理。

总结

数据接入平台(DIP)主要是为各位开发者介绍数据接入平台是做什么的,在什么场景下可以运用到DIP,底层架构是怎样的。后续的内容会为大家介绍底层各个组件的原理,与其他类似产品的优缺点对比,希望开发者们对腾讯云消息队列CKafka推出的这款产品有更详细的了解,能更好的用到业务中。

依赖倒置原则(Dependency Inversion Principle, DIP)详解 依赖倒置原则的核心思想是“高层模块不应依赖于低层模块,二者都应依赖于抽象;抽象不应依赖于细节,细节应依赖于抽象。” 这意味着我们应将系统中的高层组件和低层组件解耦,让它们通过抽象(如接口或抽象类)进行交互,从而降低依赖关系的复杂度。依赖倒置原则是实现灵活、可维护和高可扩展性系统的关键。通过将高层模块与低层模块的依赖关系通过抽象接口解耦,系统变得更加模块化,维护成本降低,灵活性提高。在实际项目中应用依赖倒置原则,能够有效地管理系统的复杂性,提升代码的质量和可测试性。 阅读详情

相关推荐

大数据的数据接入与数据服务技术研究

综上所述,大数据的数据接入和数据服务技术是支撑大数据分析和应用的重要组成部分。通过合适的数据接入技术,我们可以从不同的数据源中获取数据。而数据服务技术则提供了数据的存储、管理、查询和分析功能,帮助我们更好地理解和利用大数据。随着大数据时代的到来,数据接入和数据服务技术变得越来越重要。在这篇文章中,我们将探讨大数据的数据接入和数据服务技术的研究,并提供相应的源代码示例。数据接入是指从各种数据源中获取数据并将其导入到大数据平台中进行处理和分析的过程。数据服务是指在大数据平台上提供各种数据操作和查询服务的技术。

ByteHackerX的博客 698

医保DRG/DIP智能分析质控系统

它主要针对医疗保险领域,对医疗数据进行深入挖掘和分析,以提升医疗服务的质量和效率,降低医疗风险和医疗成本等方面发挥重要作用。通过这些功能,医保DIP智能分析质控系统可以帮助医保机构、医疗机构和患者有效地降低医疗风险、提高医疗质量和效率,达到更好的医疗保障目的。疾病风险评估:通过对患者的历史病例数据、生活习惯等信息进行分析,识别患者可能存在的潜在疾病风险,并及时采取相应的干预措施。医院管理:对医院的管理数据进行分析,优化医院的管理流程和决策,提高医院的效率和服务质量。项目详细对接请私信。

m0_61052973的博客 2112

网络分级设计模型的三层架构:接入层、汇聚层、核心层到底有什么说法?

在网络组网中,接入层、汇聚层和核心层扮演着不同的角色和功能。接入层是最靠近用户的一层,负责连接用户设备到网络并提供用户接入接口。汇聚层连接多个接入层,将数据流量聚合到核心层,并实施数据转发和策略控制。核心层是网络的最高级别,负责处理大量的数据流量,进行路由决策和实现跨网络通信。这些层次的划分和功能分工使得网络组网更加灵活、可扩展和高效。不同层次的设备和技术可以根据需求进行选配和配置,以满足不同规模和需求的网络环境。理解接入层、汇聚层和核心层的概念和作用对于网络架构师、系统管理员和网络工程师来说至关重要。

网络技术联盟站 1万+

分享几个概念!(数据接入、数据清洗……)

  由于来实习,领导说了几个概念!故将这些概念进行深入的学习理解!争取融会贯通不断发散继续学习!争取努力把这些词汇整明白! 一、数据接入 定义:   数据接入就是各种零散的数据(结构化,非结构化,半结构化数据)整合在一起,纳入统一大数据平台。 数据类型: 结构化数据(关系型数据库的数据)——通过ETL完成 日志数据接入——接入工具有Flume、FileBeats、Logstash IOT(internt of thing)数据接入:通常为流数据。通过kafka接入 文件数据接入::通过FTP或者WebD

zgd1239的博客 8949

【愚公系列】面向对象设计原则(四)-依赖倒置原则(Dependence Inversion Principle DIP)

面向对象设计原则是一些通用的软件设计原则,用于指导软件设计人员开发高质量、可扩展、可维护的软件系统。这些原则的作用如下:提高软件系统的可维护性:遵循面向对象设计原则可以将代码分解为更小、更专注的模块,从而降低代码的复杂性和耦合度,提高系统的可读性和可维护性。提高软件系统的可扩展性:开放封闭原则可以帮助软件系统更容易地适应变化,降低对现有代码的影响,从而提高软件系统的可扩展性和灵活性。

愚公智库 47万+

深入理解依赖倒置原则与设计模式实战

依赖倒置原则(Dependency Inversion Principle, DIP)是SOLID面向对象设计原则中的核心之一,其核心思想是:高层模块不应该依赖于低层模块,两者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。这一原则通过引入接口或抽象类作为中间层,实现模块之间的解耦。在传统软件设计中,高层模块(如业务逻辑层)通常直接调用低层模块(如数据访问层),形成紧耦合结构,导致系统难以扩展和维护。

weixin_32869687的博客 1118

【Python】新手入门学习:详细介绍依赖倒置原则(DIP)及其作用、代码示例

🔥【Python新手必读】揭秘依赖倒置原则(DIP):从入门到实践🚀 🎯 想知道如何优雅地降低代码耦合、提高复用性吗?依赖倒置原则(DIP)来帮你! 🔧 DIP原则,让代码更灵活、更易扩展,轻松应对变化。 📚 学会如何实现?这里有简单明了的Python代码示例,一看就会! 🔍 实际项目中如何应用?更有生动案例,让你轻松上手。 💡 违反DIP原则?后果很严重!本文为你揭示真相。 🎉 总结:掌握DIP原则,让你的Python代码更健壮、更优雅!#Python新手 #依赖倒置原则

创作高质量博文,分享知识,共同进步! 1714

Zotero on Mac: 高效文献管理与引用指南

本文为Mac用户提供了一份全面的Zotero高效文献管理与引用指南。从安装配置、文献收集管理、PDF深度阅读与笔记,到在Word中无缝插入引用和生成参考文献,详细讲解了核心工作流。同时推荐了ZotFile、Better BibTeX等必备插件,并介绍了利用同步与WebDAV实现跨设备无缝衔接的方法,助力研究者构建个人数字知识库,极大提升学术研究效率。

weixin_29281941的博客 1179

OOD设计原则之依赖倒置原则(DIP)

依赖倒置原则(Dependency-Inversion Principle)是Robert C. Martin(!)在1996年为《C++ Reporter》所写的专栏Engineering Notebook的第三篇(原文),后来加入到他在2002年出版的经典著作《Agile Software Development Principles Patterns and Practices》 中提到的,

Brookes的专栏 3236

自制JS某课脚本

根据实际需求自制网页讯网刷题脚本,绕过人脸,弹窗,答题,实现自动化运行

2301_81243054的博客 3461

STM32 SPI驱动TFT LCD实战:时序配置与硬件协同

SPI(串行外设接口)是一种高速、全双工、同步串行通信协议,广泛应用于微控制器与显示模组等外设的数据交互。其核心依赖时钟极性(CPOL)与时钟相位(CPHA)组合定义的四种工作模式,直接影响数据采样可靠性;而片选(NSS)与MOSI/SCLK等信号的硬件映射,则决定了多设备共总线下的通信稳定性。在TFT LCD驱动场景中,SPI凭借低开销、高吞吐优势成为主流选择,尤其适配ST7789、ILI9341等集成显示控制器的模块。本文聚焦STM32L系列MCU通过SPI2驱动1.3寸LCD的完整链路,涵盖Mode

php55的博客 1212

经典三层架构项目(3-tier architecture)中应用依赖倒置原则(DIP)的理性权衡

依赖倒置原则(Dependency Inversion Principle,DIP)作为SOLID原则中的重要组成部分,其核心主张是高层模块不应依赖低层模块,两者都应依赖于抽象;抽象不应依赖细节,细节应该依赖抽象。在经典三层架构(表示层-业务逻辑层-数据访问层)中,这一原则的传统应用方式是通过在层与层之间引入接口层,实现所谓的"面向接口编程"而非"面向实现编程"。在典型实现中,表示层依赖于业务逻辑层提供的接口(如),而非具体的业务实现类。

gzyes 409

使用网分对晶体ESR/L1/C1/C0进行测量计算

Use R&S Vector Network Analyzer test XTAL ESR/L1/C1/C0 測量方法:使用儀器的Port1端口,測量XTAL的S11,通過諧振的參數計算出ESR/L1/C1/C0的值。 實際晶體的等效模型:通常方便晶體分析,使用下圖(b)的等效模型,但實際測量發現晶體存在多個串聯諧振點,實際等效模型更接近(c)。 儀器測量到的S11,其中M...

qq_39138630的博客 2087

依赖倒置原则实战:别再让代码 “牵一发而动全身”!从耦合地狱到灵活架构

文章摘要:本文深入解析C++开发中的依赖倒置原则(DIP),通过真实案例展示违反DIP导致的"改一行代码崩溃多个模块"问题。文章详细对比了传统强耦合实现与DIP重构后的代码差异,演示如何通过抽象接口隔离高层业务逻辑与底层实现,实现数据库从MySQL到PostgreSQL的无缝切换。提供支付系统、消息通知和缓存系统3个典型场景的DIP应用方案,并给出5个常见误区及避坑建议。最终阐明DIP的核心价值在于通过"规则主导系统"而非"实现主导系统",让代码具

C++、Python、Linux、人工智能、车载开发、QT开发、AI绘画。 815

基于图像形态学处理的交通灯检测识别matlab仿真

图像形态学处理是基于数学形态学的理论,利用结构元素(如矩形、圆形等)对图像进行处理,通过将结构元素与图像进行特定的逻辑运算,来提取图像中的目标特征、去除噪声、改善图像质量等。在交通灯检测识别中,主要利用交通灯的颜色、形状等特征,通过形态学操作突出这些特征,抑制背景和噪声干扰,从而实现对交通灯的准确检测和识别。图像采集与预处理采集:通过安装在车辆或道路上的摄像头获取交通场景图像。灰度化:将彩色图像转换为灰度图像,减少数据量,便于后续处理。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 160

「深度学习之优化算法」(五)差分进化算法

每次迭代将先进行变异操作,选择一个或多个个体的基因作为基,然后选择不同的个体的差分来构成差分基因,最后将作为基的基因与差分基因相加来得出新的个体。,大喊一声,进化吧,魔王兵i的基因改变了。交叉率CR,影响基因取自变异基因的比例,由于至少要保留一位自己的基因和变异的基因导致CR在该问题上对算法性能的影响不大(这个问题比较简单,维度较低,影响不大)。与遗传算法同为进化算法的差分进化算法,它们的操作(算子)也都非常相似的,都是交叉,变异和选择,流程也几乎一样(遗传算法先交叉后变异,差分进化算法先变异后交叉)。

quanzhan_King的博客 1505

依赖倒置原则(DIP):别让业务层直接绑死底层实现

摘要:依赖倒置原则(DIP)是解决代码耦合问题的关键方法。该原则指出高层模块不应依赖低层模块,而应共同依赖抽象。通过生活化的插座比喻,说明抽象接口如同标准插座,使不同设备能灵活替换。违反原则的典型症状包括业务类直接new底层对象、切换实现需修改多处、单元测试困难等。在数据采集系统案例中,直接依赖串口和文件存储的实现会导致修改困难,而通过定义ICommunicator和IDataStore接口,再注入具体实现,可使系统更灵活。遵循依赖倒置原则能带来实现切换方便、易于测试、降低耦合和结构稳定等优势。

leonkay的博客 372

Oracle EBS Interface/API(43) -自定义AP发票状态说明API

在某项目,客户需求获得AP发票的状态说明,例如对账系统或者某些报表。由于标准系统未提供状态说明,需要通过AP发票的标准Form获得相关业务逻辑,然后自定义AP发票状态说明API。

陈显平的专栏-Oracle EBS 607

设计原则之依赖倒置原则(DIP)

简介 依赖倒置原则是系统解耦的重要原则,遵循它可以让我们的系统更加健壮。 定义 依赖倒置原则(Dependency Inversion Principle)是 Robert C. Martin 提出的,原则声明了两个方面: 上层模块不应该依赖下层模块,双方都应依赖于抽象。 抽象不应依赖实现,...

chj287522860的博客 286

智能车图像处理14-进阶篇6--坡道的判定

这篇文章主要讲述智能车图像处理中 : 如何判断坡道

taiyuezyh的博客 9234

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

依赖倒置原则

依赖倒置原则定义 依赖倒置原则(Dependence Inversion Principle ,DIP)定义如下: High level modules should not depend upon low level modules,Both should depend upon abstractions.Abstractions should not depend upon detail...

ANGEL CITY 1756

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

了解依赖反转原则(DIP)、控制反转(IoC)、依赖注入(DI)及 IoC容器

在软件开发中,依赖反转原则(DIP)、控制反转(IoC)、依赖注入(DI)及IoC容器是几个重要的概念,它们相互关联且对于提高软件的可维护性、可扩展性和灵活性具有重要意义。

hpx666的博客 2106

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

[特殊字符]【设计模式 精髓】依赖倒置原则 (DIP) 透彻解析 | 面向接口编程?解耦利器,告别硬编码!

无论你是刚入门的小白,还是想让代码“活”起来的大佬,这篇保姆级教程都值得你马住⭐+关注👀!就像你渴了,直接去**找特定的“农夫山泉”**这个牌子的水来喝(高层依赖具体细节)。:以前是“你需要我(高层需要低层具体实现)”,现在是“你需要接口,我(低层实现)也需要实现这个接口”(大家都依赖抽象接口)。而 DIP 提倡的是**“倒置”这种依赖关系**:高层模块不直接依赖低层具体实现,而是依赖一个。希望这篇图文并茂(代码茂盛)的讲解,让你对这个重要的设计原则有了透彻的理解!你的支持是我持续输出高质量内容的动力!

WD1213484的博客 1123

详细示例解答什么是依赖倒置原则

依赖倒置原则的核心思想是要减少系统中高层模块与低层模块之间的依赖关系,从而提高系统的可维护性和扩展性。如果我们在系统中直接依赖具体的邮件发送实现(例如某个邮件服务提供商的API),那么当我们需要更换邮件服务提供商时,就需要修改高层模块的代码,这违背了依赖倒置原则。依赖倒置原则通过引入抽象层来减少高层模块与低层模块之间的耦合,从而提高代码的灵活性和可维护性。这样,当我们需要更换邮件服务提供商时,只需要提供新的实现类并确保它实现了。为了遵守依赖倒置原则,我们可以先定义一个抽象的接口,如。抽象接口,而不依赖于。

AI逍遥子 1225

依赖倒置DIP在系统架构中的应用

同样的,替换模板的生成也不应该关注R的业务,根据R定义的DTO/Entity 来动态生成的对应的XML。简单理解为: R项目 调用了 E项目的打印接口,但是E项目需要对R传来对数据传输对象DTO进行二次处理,甚至夹杂很多R项目的业务逻辑(去调用R项目的接口),经过多个迭代以后,R项目和E项目的接口对接人已经成为了相亲相爱一家人👨‍👩‍👧‍👧。从代码层面来说,E应该只定义接口的规范,具体的实现让R来做,比如打印类的定义可以直接继承自R项目的DTO,这样不会因为业务的频繁变动而导致对接人的工作量增加。

dongnihao的博客 471
上一篇: RocketMQ 用法详解,你学会了吗?
下一篇: 浅析 Apache Kafka 分区重分配的实现原理
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值