DDD落地:从腾讯视频DDD重构之路,看DDD极大价值

news2024/10/7 20:28:29

尼恩说在前面

在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题:

谈谈你的DDD落地经验?

谈谈你对DDD的理解?

如何保证RPC代码不会腐烂,升级能力强?

微服务如何拆分?

微服务爆炸,如何解决?

你们的项目,DDD是怎么落地实操的?

所以,这里尼恩给大家做一下系统化、体系化的梳理,使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”

也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典PDF》V125版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请关注本公众号【技术自由圈】获取

除了本文,尼恩输出了一个 《从0到1,带大家精通DDD》系列,帮助大家彻底掌握DDD,链接地址是:

《阿里DDD大佬:从0到1,带大家精通DDD》

《阿里大佬:DDD 落地两大步骤,以及Repository核心模式》

《阿里大佬:DDD 领域层,该如何设计?》

《极兔面试:微服务爆炸,如何解决?Uber 是怎么解决2200个微服务爆炸的?》

《阿里大佬:DDD中Interface层、Application层的设计规范》

《字节面试:请说一下DDD的流程,用电商系统为场景》

《DDD如何落地:去哪儿的DDD架构实操之路》

大家可以先看前面的文章,再来看本篇,效果更佳。

另外,尼恩会结合一个工业级的DDD实操项目,在第34章视频《DDD的顶奢面经》中,给大家彻底介绍一下DDD的实操、COLA 框架、DDD的面试题。

DDD现在非常火爆,是有其巨大生产价值,经济价值的, 绝不仅仅是一套概念那么简单。

DDD的绝大价值,具体请参见以下视频:

从腾讯视频DDD重构案例,看看DDD极大价值

文章目录

    • 尼恩说在前面
    • 腾讯视频DDD重构之路
    • 01 领域驱动
      • 1.1 DDD 简介
      • 1.2 领域建模
      • 1.3 领域建模-例1
      • 1.4 领域建模-例2
    • 02 软件架构
      • 2.1 定义架构
      • 2.2 架构特征
      • 2.3 架构特征
      • 2.4 架构风格及度量
    • 03 架构映射
      • 3.1 DDD 过程模型
      • 3.2 架构映射
    • 04 架构映射
      • 4.1 DDD 与重构
      • 4.2 一起看的技术债
      • 4.3 发起重构
      • 4.4 架构重构
      • 4.5 逻辑重构
    • 05 效果评估
      • 5.1 问题与目标
      • 5.2 效果的定性说明
      • 5.3 效果的量化分析
      • 5.4 设计关键点
    • 06 几点说明
    • 说在最后
    • 尼恩技术圣经系列PDF

腾讯视频DDD重构之路

作者:刘啸南

DDD 的指导思想很多时候较为晦涩,与实际业务场景下的架构设计往往难以紧密结合。本文尝试通过引入架构映射等方法,将二者相互融合,旨在提供一套量化的评估体系,并通过腾讯视频一起看系统的实践案例阐述如何运用。

本文将以腾讯视频一起看系统的架构重构实践为例,展示一套具有参考价值的领域建模、架构设计与量化评估标准。

01 领域驱动

1.1 DDD 简介

视频会员部门正在推进一个领域驱动的项目,期望运用 DDD 的一些理论,对会员技术体系的进行全面梳理。内容作为其中的一个子领域,也希望借助 DDD 的一些方法进行整个体系的建设:

  • 复杂度:业务复杂性(包括播放、购买、活动、内容展示、内容互动等全场景),以及技术复杂性(如业务规则、模块繁多、高并发、信息安全等),需要全面考虑。

  • 跨部门合作:目前的会员内容体系,涉及会员、直播中台、腾讯云、安平审核等多个部门,是一个典型的跨部门合作项目。

  • 体系梳理:会员业务涵盖内容展示、内容互动、内容合作和内容创新四个方面。

  • 领域模型:本文将重点借助领域图,将整个会员内容体系以直观的方式展现出来。

DDD 的核心方法,总结起来是以下四点:

1.2 领域建模

在理解产品需求的基础上,从中提取出核心概念,然后建立起核心概念的逻辑结构,概念的逻辑结构即领域模型,通常可以用领域图或 ER 图来表示。领域模型有助于我们以一种抽象的视角来理解复杂业务。

对于复杂大系统,DDD 给出的基本操作方法就是<大分形>,即大而化之、分而治之、形而上之。将这个方法应用在内容体系上,可以做一个初步的领域建模。

1.3 领域建模-例1

将上述方法应用于视频会员内容体系,进行初步的领域建模。针对会员内容体系业务梳理,以内容为核心,划分为以下四个部分:

  • 内容展示:包括频道页、一起看底层页的 3tab、端外频道页等。
  • 内容互动:涉及一起看业务、观看剧集、聊天、赠票、连麦、陪看等。
  • 内容合作:涵盖小说、漫画、知识付费等。
  • 内容创新:如 NFT 等。

1.4 领域建模-例2

02 软件架构

2.1 定义架构

软件架构并无明确的定义,但我们可以通过【结构、架构特性、架构决策和设计原则】来阐述。

  • 结构:指的是系统的架构风格类型,如分层架构、微服务架构、管道架构、事件驱动架构等。
  • 架构特征:指的是系统必须支持的功能,如可用性、可扩展性、容错性、性能、可维护性等。
  • 架构决策:是一组构建系统的规则,例如规定表现层只能通过逻辑层访问持久层。
  • 设计原则:是构建系统的指导原则,如采用服务间的异步消息传递以提高性能。

相较而言,架构决策的约束力比设计原则更强。

2.2 架构特征

常见的架构特征有两大类,运营性架构与结构性架构,其定义如下:

2.3 架构特征

除开上述的运营性和结构性架构特性,我们在过去的系统开发实践中,似乎一直忽视了一个重要的架构特性——模块化。模块化可以被视为一种隐性的架构特性。

下面一段引用自《软件架构》的话,很好地解释了模块化的概念:

关于软件架构的用语中有95%以上都在称颂“模块化”,而关于如何实现“模块化”的用语却少之又少。-Glenford J.Myers(1978年)

不同的平台提供了不同的代码重用机制,但所有平台都支持以某种方式将相关代码分组到模块中。尽管模块化在软件架构中具有通用性,但却一直没有统一的定义。从 Myers 的引言中可以看出,这是一个历史悠久的问题。

对于架构师来说,了解模块化及其多种形式,在开发平台中至关重要。许多分析架构的工具(如度量指标、适应度函数和可视化)都依赖于模块化概念。模块化是一种组织原则。如果架构师在设计系统时没有关注各个部分如何相互连接,那么最终构建的系统必将出现问题。从物理学的角度看,软件系统是对趋于熵(或无序)的复杂系统进行建模,必须向物理系统添加能量以保持秩序。软件系统也是如此:架构师必须不断消耗精力以确保良好的结构稳定性。

保持良好的模块化体现了我们对一种隐式架构特性的定义:几乎没有项目要求架构师确保良好的模块化划分,并以模块化为主题与项目成员进行沟通。而可持续的代码需要秩序和一致性。

我们用模块化来描述代码的逻辑分组,可以是面向对象语言中的一组类,也可以是结构化语言和函数式语言中的函数。大多数编程语言都提供了模块化的机制(如 Java 中的包(package)、NET 中的命名空间(namespace)等。开发人员通常使用模块作为将相关代码分组在一起的一种方式。

模块化对架构师至关重要,研究人员创建了各种跨语言的度量标准来帮助架构师理解模块化。我们重点关注三个关键概念:内聚性、耦合性和共生性。

通过对模块化特性的深入了解,架构师可以更好地应对复杂多样的系统架构挑战,确保软件系统的稳定性和可持续发展。在实际项目中,了解并践行模块化原则,对于提升系统质量及降低维护成本具有重要意义。

内聚性及其度量:

耦合性及其度量:

共生性及其度量:

统一耦合性与共生性:

2.4 架构风格及度量

平时的实际工作中,常见的是以下六种架构:

分层架构。管道架构。微内核架构。微服务架构。事件驱动架构。编制驱动架构。

我们可以通过以下特征来对各个架构进行评级:

03 架构映射

3.1 DDD 过程模型

作为开发,我们工作的本质就是把一个产品需求转化成一个可以运行的系统,中间涉及产品设计、领域建模、架构设计、详细设计、代码编写、测试等步骤。

如果不考虑编码过程,就 DDD 的基本过程进一步展开来说,大体是以下三点:

  1. 基于产品需求,提取核心概念,并构建核心概念的逻辑结构,即领域模型。领域模型通常可以用领域图或 ER 图表示。领域模型帮助我们以抽象视角理解复杂业务,但仅限于理解业务。我们最终目标是将领域模型转化为实际可运行的系统。
  2. 从领域模型到代码实现,通常需要通过系统架构进行衔接。将领域模型映射为系统架构至关重要。通常采用分层微服务架构,将领域模型中的概念分解到架构的各层。
  3. 在拥有领域模型和系统架构的基础上,对各个模块进行详细设计,包括模块流程、数据结构设计、数据库表设计等。完成这一步后,即可启动编码工作。

在整个 DDD 开发流程中,我们需要不断迭代和优化领域模型、系统架构和模块设计,以确保最终实现的系统能够满足业务需求并具备良好的可维护性。在实际项目中,合理运用 DDD 开发流程模型,有助于提高开发效率,降低维护成本,并使系统更具可扩展性。通过遵循这一流程,我们可以更好地应对业务的变化和挑战,为客户提供高质量的软件产品。

为便于理解,以下是我自己梳理的一个 DDD 过程模型:

3.2 架构映射

在过去的项目中,很多时候我们在开始系统架构设计之前并没有进行领域建模。这主要是因为:

  1. 业务本身并不复杂,例如核心实体只有一个,然后仅需针对这个核心实体进行属性增删改查操作。大部分管理系统开发都属于这种情况。产品的交互和视觉设计基本可以替代领域建模,尤其在腾讯的研发体系中,我们通常根据产品 UI 稿来设计系统架构。
  2. 对于一些特别复杂的业务,我们需要在理解产品需求的基础上,提取核心概念构建领域模型,并将领域模型中的概念分解到系统架构的各层和模块。架构映射就是将领域模型映射到系统架构的过程。
  3. 在进行架构映射时,我们需要关注以下几个方面:
  • a. 分析业务需求,找出核心概念,构建领域模型。领域模型可以帮助我们更好地理解业务,为后续架构设计提供指导。

  • b. 将领域模型分解为系统架构的各层和模块。这样可以将复杂的业务逻辑分解为更易于管理和维护的模块。

  • c. 在架构设计中充分考虑系统性能、可扩展性、安全性等因素,确保系统能够稳定运行并适应业务发展。

  • d. 随着业务的发展和变化,不断优化和调整架构,使其保持与业务需求的匹配。

架构映射,以视频一起为例:

04 架构映射

4.1 DDD 与重构

领域驱动设计的焦点在于系统设计阶段,但同样重视重构。在一定程度上,软件工程师仍是手工艺者,软件开发没有绝对的银弹,重构在系统成长过程中是不可或缺的调整手段。

因此,我们无需迷信所谓的银弹,也不必担心过度设计或设计不足,通过多次重构迭代,让合适的设计逐步浮现。

4.2 一起看的技术债

视频一起看,经过几年不断的功能开发,已经堆砌了比较多的模块,而且是由两个跨部门的团队一起开发的,整体上缺乏统一设计,技术债务积累较多,亟需来一次整体重构。

4.3 发起重构

整个重构规划如下:

4.4 架构重构

在架构方面,分层不明确,下层服务过于理解业务逻辑,存在下层调用上层的问题。部分接口或函数职责重复,可以合并或归为一处。重复代码和逻辑较多,缺乏公共抽象。

老系统架构图:room_adapter 是结构瓶颈。

具体的解决办法分为两点

  1. 明确架构分层,降低模块间不必要的耦合;

    严格遵守分层架构原则,上层服务可调用下层服务,下层服务不涉及业务逻辑。如上下层服务需交互,可通过逻辑解耦方式实现,如消息队列或中转。

  2. 调整领域划分,合理分配功能,避免模块过大或过小;

    重新规划领域划分,使功能分配更合理,各模块专注专属领域能力,便于后续开发与维护。

重构前后架构对比:

4.5 逻辑重构

涉及较多业务逻辑的部分,重构方法主要包括以下两点:

  1. 剥离非核心逻辑子域,确保业务主流程可读性;

    将非核心业务逻辑从主流程中抽取出来,作为子域进行封装,提高可读性和可维护性。

  2. 提取公共组件,消除代码复制,提高复用性;

下面是一个房间重构的例子:

以 room_adapter 为例,因为属于业务适配层,掺杂过多特殊业务逻辑,导致可读性和可维护性差。

通过梳理服务流程,将非核心业务逻辑剥离为子域,并封装为 trpc 拦截器,确保业务主流程的可维护性。

在进一步分析系统重构完之后的效果时,我们先补充一点架构方面的知识点,这可以更方便地以一种量化的方式来评估重构效果。

05 效果评估

这部分通过介绍视频会员今年做的一个系统重构项目,结合上面的知识点,对这个项目做一整体量化分析。

5.1 问题与目标

一起看房间系统,这是一个重构项目,如果说明这个项目的意义,通常的结构就是“问题-目标-方案-效果”。

5.2 效果的定性说明

在系统架构层面,重构前后的架构对比:

重构前后,到底有什么效果,我们可以定性来说,比如:

  • 重构前:单体架构,难维护难扩展;

  • 重构后:微服务架构,内核简单,易于扩展。

  • 重构前:功能堆砌,没有整体规划;

  • 重构后:架构清晰,产品功能有序扩展。

对于非技术同学(产品、运营)来说,定性说明可能更容易理解,但定性说明本身比较随意,任何一个重构都可以讲出以上这些好处,所以没有区分度。

5.3 效果的量化分析

在定性说明的基础上,有必要做进一步的量化分析,这样效果就更有说服力。

  • 在架构层面,重构前后的改进

我们可以利用上一节的架构风格及特征参数,从而能够做出量化分析,这样得出的结论就更有说服力。

  • 重构前系统:可以看做是微内核模式;

  • 重构后系统:可以看做是微服务模式。

这样我们就可以对比重构前系统与重构后系统的区别,可以看到重构后的系统在可测试性、扩展性及模块化方面都有明显改进。

  • 在模块层面,重构前后的改进

  • 重构前:room adapter 模块包含了太多低耦合逻辑,除房间业务逻辑外,还有定时任务、房间回调、进房审批鉴权、消息发送。

  • 重构后:room_adapter 模块只保留房间业务逻辑,其他逻辑按高内聚低耦合拆分为独立小模块。

  • 在代码层面,重构前后在四个维度(代码规范、千行问题、圈复杂度、千行超标复杂度)上的改进

  • 代码量方面,重构前代码量约 4w 行,重构后 1.8w 行,降幅55%

  • 性能方面,重构后 Top4 接口耗时都有明显优化,平均耗时降低45%左右

  • 成本方面,通过下图趋势线可以看出,Top4 成本均呈下降趋势,其中 PCG-123 和日志服务 CLS 成本降幅明显,达到40%左右

5.4 设计关键点

这里不准备长篇大论,通过以下几个关键设计点,从整体上了解一下【视频一起看房间系统】:

  • 系统架构

  • 核心数据结构

  • 技术与业务指标

关键技术指标:请求量 QPS 峰值:约3万/QPS,Redis 存储占用量:11.16GB;

关键业务指标:线上房间总数:约6k+,其中用户房约3K,系统房3k,运营房0.25k。

06 几点说明

在开发领域耕耘多年,我一直被以下几个问题所困扰。现在,我想针对这些问题分享自己的见解并进行深入探讨:

  • 当我们描述系统架构时,通常会提及高性能、可扩展性、可观察性等关键词。然而,我们缺乏一个统一的量化分析框架,以便不同架构风格之间进行对比。本文将尝试解决这一问题,使各种架构风格具有可比性;

  • 领域建模和架构设计之间的关系是什么,本文提出“架构映射”的概念,试图建立二者之间的转换关系;

  • 本文将研究如何将架构理论与实际架构设计相结合,以提供一套具有操作性、可行性且能进行量化对比的设计方法;

  • 做过很多重构,重构前后系统效果的说明,通常会采用定性描述,或者列举单点说明,比如性能、扩展性等,如何以一种可量化的整合的方式说明重构的效果。

说在最后

DDD架构如何落地,是是非常常见的面试题。

以上的内容,如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。

在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典PDF》,并且在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。

最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。

当然,关于DDD,尼恩即将给大家发布一波视频 《第34章:DDD的顶奢面经》, 帮助大家彻底穿透DDD。

尼恩技术圣经系列PDF

  • 《NIO圣经:一次穿透NIO、Selector、Epoll底层原理》
  • 《Docker圣经:大白话说Docker底层原理,6W字实现Docker自由》
  • 《K8S学习圣经:大白话说K8S底层原理,14W字实现K8S自由》
  • 《SpringCloud Alibaba 学习圣经,10万字实现SpringCloud 自由》
  • 《大数据HBase学习圣经:一本书实现HBase学习自由》
  • 《大数据Flink学习圣经:一本书实现大数据Flink自由》
  • 《响应式圣经:10W字,实现Spring响应式编程自由》
  • 《Go学习圣经:Go语言实现高并发CRUD业务开发》

……完整版尼恩技术圣经PDF集群,请找尼恩领取

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

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

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

相关文章

Python 如何实现 Mediator 中介者设计模式?什么是中介者设计模式?Python 设计模式示例代码

什么是中介者设计模式&#xff1f; 中介者&#xff08;Mediator&#xff09;设计模式是一种行为型设计模式&#xff0c;其主要目的是通过将对象之间的直接交互转变为通过中介者对象进行的间接交互&#xff0c;从而减少对象之间的耦合度。中介者模式通过集中控制对象之间的通信…

【基础算法】筛质数

文章目录 问题描述解决方法朴素筛法线性筛法 问题描述 给定一个正整数 n n n&#xff0c;请你求出 1 ∼ n 1∼n 1∼n 中质数的个数。 输入格式 共一行&#xff0c;包含整数 n。 输出格式 共一行&#xff0c;包含一个整数&#xff0c;表示 1∼n 中质数的个数。 数据范围 …

关于python中内存分配的问题,运行一些操作可能会导致为新结果分配内存,用Python的id()函数演示

一、考虑背景&#xff1a; 一般在python中不会考虑像C中的内存问题&#xff0c;但是在一些高级应用中会考虑&#xff0c;例如有一个特别特别大的矩阵&#xff0c;最好不要不断的赋值&#xff0c;导致内存问题产生。 二、python中的id&#xff1a; 在python中有个id&#xff…

Postman:API测试之Postman使用完全指南

Postman是一个可扩展的API开发和测试协同平台工具&#xff0c;可以快速集成到CI/CD管道中。旨在简化测试和开发中的API工作流。 Postman工具有Chrome扩展和独立客户端&#xff0c;推荐安装独立客户端。 Postman有个workspace的概念&#xff0c;workspace分personal和team类型…

Java JVM虚拟机

加载字节码文件.class 1字节一般为8位 字节码结构: 第一部分 4字节 cafebaby 第二部分 版本号 00 00 00 32, 第三部分 常量数量 count 第四部分常量池 常量类型表示: 继承关系改变 1.1以后 后面是属性方法 等参数 通过javap 反编译class ,javap xx.class javap -c xxx.…

redis实战篇(2)

优惠卷秒杀 通过本章节&#xff0c;我们可以学会Redis的计数器功能&#xff0c; 结合Lua完成高性能的redis操作&#xff0c;同时学会Redis分布式锁的原理&#xff0c;包括Redis的三种消息队列 3、优惠卷秒杀 3.1 -全局唯一ID 每个店铺都可以发布优惠券&#xff1a; 当用户抢…

京东数据采集与挖掘(京东大数据):2023年10月京东冰箱品牌销售排行榜

鲸参谋监测的京东平台10月份冰箱市场销售数据已出炉&#xff01; 10月份&#xff0c;冰箱市场的销售额有小幅上涨。鲸参谋数据显示&#xff0c;在京东平台上&#xff0c;今年10月冰箱市场的销量为94万&#xff0c;销售额将近23亿&#xff0c;同比增长超过1%。从价格上看&#x…

【Java 进阶篇】揭秘 JQuery 广告显示与隐藏:打造令人惊艳的用户体验

在当今互联网时代&#xff0c;广告已经成为网页中不可忽视的一部分。然而&#xff0c;如何通过巧妙的交互设计&#xff0c;使广告既能吸引用户的眼球&#xff0c;又不会给用户带来干扰&#xff0c;成为了许多前端开发者需要思考的问题之一。在这篇博客中&#xff0c;我们将深入…

vscode文件夹折叠问题

今天发现一个vscode的文件夹显示的问题&#xff0c;首先是这样的&#xff0c;就是我的文件夹里又一个子文件夹&#xff0c;子文件夹里有一些文件&#xff0c;但是我发现无法折叠起这个子文件夹&#xff0c;总是显示全部的文件&#xff0c;这让我备份很难&#xff0c;具体参考 h…

pipeline agent分布式构建

开启 agent rootjenkins:~/learning-jenkins-cicd/07-jenkins-agents# docker-compose -f docker-compose-inbound-agent.yml up -d Jenkins配置添加 pipeline { agent { label docker-jnlp-agent }parameters {booleanParam(name:pushImage, defaultValue: true, descript…

vscode中vue项目引入的组件的颜色没区分解决办法

vscode中vue项目引入的组件的颜色没区分解决办法 图中引入组件和其他标签颜色一样没有区分&#xff0c;让开发者不易区分&#xff0c;很蓝瘦 这个就很直观&#xff0c;解决办法就是你当前的vscode版本不对&#xff0c;你得去找找其他版本&#xff0c;我的解决办法就是去官网历…

Python入门简介及下载安装,超详细教学!

文章目录 一、Python简介&#xff1a;Python解释器的类型Python的运行机制1、查看 Python 版本2、第一个Python3.x程序3、Python 应用 二、Python安装&#xff08;windows&#xff09;1、下载2、安装步骤&#xff1a; 三、运行Python1、交互式解释器&#xff1a;扩展&#xff1…

美团外卖APP如何查看使用美团外卖红包优惠券?

美团外卖APP如何查看美团外卖红包优惠券&#xff1f; 1、手机打开美团外卖APP&#xff1b; 2、点击底部我的>我的资产>红包/神券&#xff0c;即可查看到美团外卖红包优惠券&#xff1b; 美团外卖红包优惠券怎么免费领取&#xff1f; 关注「草柴」公众号&#xff0c;回复…

JAVA深化篇_42—— 正则表达式

3 正则表达式 3.1正则表达式介绍 3.1.1 什么是正则表达式 正则表达式&#xff0c;又称规则表达式。&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为 regex、regexp 或 RE&#xff09;&#xff0c;是计算机科学的一个概念。正则表达式通常被用来…

【Linux】:进程间通信

进程间通信 一.基本概念二.简单的通信-管道1.建立通信信道2.通信接口 一.基本概念 是什么 两个或多个进程实现数据层面的交互。 因为进程独立性的存在&#xff0c;导致进程间的通信成本比较高。 为什么 因为我们有多进程协同的需求。 怎么办 a.进程间通信的本质:必须让不…

新手必看!!STM32定时器简介

一、定时器有哪些&#xff1f; 定时器分为三大类&#xff1a;基本定时器、通用定时器和高级定时器。 二、每个定时器的功能以及使用场景 1. 基本定时器&#xff08;Basic Timers&#xff09;&#xff1a; 功能&#xff1a; 基本定时器具有较为简单的功能&#xff0c;通常用于…

2023.11.17 hadoop之HDFS进阶

目录 HDFS的机制 edits和fsimage文件 HDFS的存储原理 写入数据原理: 读取数据原理: 元数据简介 元数据存储流程 HDFS安全机制 HDFS归档机制 HDFS垃圾桶机制 接着此前的内容 https://blog.csdn.net/m0_49956154/article/details/134298109?spm1001.2014.3001.5501 …

三菱FX3U小项目—传输带定分级控制

目录 一、项目描述 二、IO口分配 三、项目程序 四、总结 一、项目描述 两条运输带顺序相连&#xff0c;为了避免运送的物料在1号运输线上堆积&#xff0c;所以启动时&#xff0c;1号运输带开始运行&#xff0c;5S后2号运输带自动启动。停机时顺序与启动刚好相反&#xff0c…

基于数据库(MySQL)与缓存(Redis)实现分布式锁

分布式锁 分布式锁&#xff1a;分布式锁是在分布式的情况下实现互斥类型的一种锁 实现分布式锁需要满足的五个条件 可见性&#xff1a;多个进程都能看到结果互斥性&#xff1a;只允许一个持有锁的对象的进入临界资源可用性&#xff1a;无论何时都要保证锁服务的可用性&#x…

Kafka入门教程与详解(一)

Kafka入门教程与详解&#xff08;一&#xff09; 一、Kafka入门教程 1.1 消息队列&#xff08;Message Queue) Message Queue消息传送系统提供传送服务。消息传送依赖于大量支持组件&#xff0c;这些组件负责处理连接服务、消息的路由和传送、持久性、安全性以及日志记录。消…