前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何在咨询项目开展Inception

如何在咨询项目开展Inception

作者头像
张逸
发布于 2018-03-07 07:04:06
发布于 2018-03-07 07:04:06
1.3K0
举报
文章被收录于专栏:斑斓斑斓
本文通过我在咨询工作中的真实案例讲解了如何将敏捷开发的Inception与可视化咨询手段结合。2014初,我作为咨询师为客户提供咨询服务,负责一个新项目的敏捷咨询、架构以及开发编码工作,距今已有四年时间,文中内容已经不再敏感。个人认为,这次咨询的一些方法与经验有值得借鉴之处,因而分享给大家,以资参考。

破冰之旅

我们要开始的项目是重写原有的一个版本管理系统,将其一部分内容从主控板中剥离出来,并将原有的C实现改为Java实现。项目的目标和范围相对确定,但架构方案还有待进一步确认。此外,团队成员只有C语言背景,没有任何Java语言的背景知识,也不了解面向对象编程。针对此情况,我决定对项目做一个Inception。下图是我确定的Inception计划:

我们召集相关干系人(包括支持软件产品部部长,部门的大项目经理,版本管理人员,项目组所有成员)参与了Inception的Kick Off会议。会议中,我们一起梳理了项目的目标与范围。整个咨询项目的目标为:

  • 高质量的交付NVUM(即NodeB Version Upgrade Manager)项目;
  • 设计优良的架构,保证架构的可扩展性,以支持未来需求的变化;
  • 培养团队成员的面向对象设计能力;
  • 打造敏捷团队;
  • 提炼项目最佳实践。

在确定项目的目标与范围后,我开展了破冰之旅,以热气球的形式展现团队的动力与阻力:

部门领导对这个项目非常重视,希望树立一个推行敏捷的模型,获得落地经验,并将这些经验分享和推行到整个部门。因此,部门领导给与了很大的支持。不过,挑战也非常大。

首先,团队成员完全不了解Java,也没有任何OO知识。其次,团队成员也不了解敏捷。同时,还需要承担相对紧张的交付压力。项目的特殊性决定了部门领导对项目高质量的重视。整个项目的主要功能点并不多,但涉及到的场景非常多,情形也比较复杂。同时,设计的系统必须具备良好的可扩展性和低缺陷率。在交付项目的同时,咨询师还需要培养团队成员,带领团队成员在技术和敏捷实践上获得提高。

需求的梳理

针对需求,在Inception阶段,我着重进行对Master Story的识别与拆分。由于该系统的主要工作是对原有系统进行重写,除了极个别的新需求外,需求功能与范围都是明确无误的。但考虑到我们需要在Inception阶段确定MVP(最小可用产品),从而获得发布计划与迭代计划,重新梳理需求是有必要的。而且,这个梳理过程要求整个团队的成员都参与,这也是一个极佳的通过协作明确需求的机会。

我在梳理需求时,首先还是从调用者(用户角色)的角度出发。这相当于Use Case中的Actor。从这个视角去分析需求功能,可以更容易帮助我们去识别需求的价值,并找到系统的边界。该项目的情况比较特殊,从使用者角度看,仅有外场的用服作为参与者;但调用或触发功能的角色却不仅限于用服,一些参与的系统也可以视为Actor,这其中包括:SCS、DBS和VMP Timer。

项目主要的功能就是对版本规格包的管理(包括升级、回退、删除等),因而有必要识别规格包的类型。可以分为:BBU、RRU和固件,而且BBU和RRU还包含了补丁规格包。补丁规格包又分为冷补丁和热补丁。这些规格包可能组合。同时,不同的产品制式包含的规格包也有所不同。

站在Actor的角度,我们梳理出了如下图所示的Master Story列表,并以用例图展示:

我们可以将这些用例视为系统的一级功能或者Feature,它有助于我们建立对整个系统的全局感官。但这样的分解太粗犷,因此还需要继续细化。我使用了卡片来帮助我们表现功能之间的层次关系。同时,根据规格包的类型,又以表格的方式展现各种规格包之间的异同。例如下图就是关于版本升级功能的需求分解:

通过这样的需求分析活动,团队成员基本上就系统的功能达成了一致意见。现在,我们就可以把最高层次的Feature卡排列在白板上,根据大家对系统的认识来确定优先级,并基于功能完备性选择可以放在同一个MVP的Feature卡:

为了避免需求的缺失,并确定这些功能与网管系统能够对应,我们还做了Requirement Map,如下图所示:

我们将整个项目周期划分为四个MVP。我们一致认为版本的升级是整个系统最重要也是最主要的功能,它的价值最高,可能存在的风险也最高,完全有理由放在迭代的最前面。最初,我们并没有考虑将“查询”功能放在最高优先级,相较于“升级”和“上电”,甚至于“回退”,它的优先级都有所不如。但当我提出如何在每个发布阶段进行演示时,大家才认识到如果不尽快实现查询功能,可能会使得我们发布的最小版本并不可用。我们当然也可以考虑命令式脚本进行查询,但这样的开发成本相较于开发UI的查询功能而言,并没有太大的优势。

虽然所有规格包的升级功能在重要性方面都要高于“回退”以及“全同步”。但由于升级功能的工作量最大,所有规格包的升级功能开发完毕大约会占用超过1/2的时间。从最小可用的角度来看,我们选择了整体功能的完备性。因此将固件与补丁包的升级放到了更其次的MVP 3。而且我们认识到,一旦开发完BBU和RRU规格包的升级,对于固件与补丁包而言,实现就变得简单了。

我们之所以考虑将“全同步”与“预上电”功能放到了MVP 2,与它们的重要程度(从重要程度讲,它们要低于升级与回退)无关,而在于对它们的开发需要与其他团队协作。若能将这部分功能的迭代周期提前,可以便于我们更好地与其他团队进行协作,同时,帮助我们提前发现风险。

在分析需求时,团队还统一了主要的领域术语,并确定了各个领域对象之间的关系。我用各种颜色的即时贴来展现(并非采用四色建模),这其中,绿色即时贴代表受控板,白色即时贴为主控板,即CC。NodeB为基站,有时候也称为网元,为保持一致,我们决定统一为NodeB。我们还识别出Small NodeB的概念。对于Small NodeB而言,BBU和RRU是在一块单板上的:

RAID系统分析

在梳理了VPM的需求后,我在Inception阶段开展了对系统架构的分析。由于这个系统自身并不复杂,但牵涉到太多的系统,且系统与系统之间的通信采用了各种方式,且系统的稳定性和性能的要求都较高,因而需要对整个系统的风险进行充分地识别。为此,我引入了RAID(Risk, Assumption, Issue, Dependency)分析,如下图所示:

进行RAID分析要比单纯的问题分析更为收敛,因为它明确了头脑风暴的范围及其类别。

识别风险

通常而言,对风险的识别可以引导我们对系统质量属性的思考,利益相关者可以充分表达对这些属性的担心,从而驱动我们去寻找解决方案。

稳定性

在这次RAID分析中,网管系统的负责人明确提出了对稳定性的担忧。由于之前的版本管理系统驻留在主控板CC中,网管系统(Java平台)与主控板以及受控板之间的通信较少。在将版本管理系统的部分功能转移到Java平台之后,形成NVUM专有模块并由网管系统发起调用。这就导致网管与主控板之间的通信可能会增多。从过往的系统看,这种通信的稳定性欠佳。基于这一问题,我们在后续的架构设计中对此进行了深入分析,决定在主控板一端设计粗粒度的接口,一次性地传递升级需要的信息,并以写文件的方式,将返回的数据传递到NVUM。

可扩展性

风险对扩展性的识别,帮助我们确立了一个架构原则,就是版本规格包的结构不应该影响到主控板的系统。这是因为主控板系统的升级受到的制约最多,我们不希望当产品发生变化时,影响整个版本管理系统。

性能

当选择的基站数量较多时,系统的版本升级过程会变得缓慢。而版本升级必须要求无线基站不能处于shutdown状态,否则会影响业务。因此,升级过程通常会选在凌晨,并且必须在较短时间内完成整个升级工作,故而性能可谓重中之重。目前网管采用并发方式为每个基站分配一个线程进行升级。由于本次系统的设计采用了配置文件的形式,网管担心在启动多个并发线程时同时加载多个配置文件,可能会导致OutOfMemory异常。这个风险的识别及时地为我们敲响了警钟。我们为此安排了技术Spike,并确定确实存在这方面的问题,目前还在解决之中。此外,为了提升性能,主控板与受控板之间的版本下载也需要并发进行,即当一个版本文件下载到主控板时,不必等到所有文件下载完毕,就可以并行地传递给受控板。就这个风险,我们讨论的结果是在新版本中可以支持这一功能,但在旧版本升级到新版本场景下,无法支持。

给出假设

Assumption可以是关键的架构约束,也可以是系统功能性的约定。架构约束既可能是设计的阻力,也可以成为动力。经过讨论,我们基本上确定了两条最为重要的架构约束,包括:

  • 系统必须支持双向兼容,即网管一侧的NVUM(Java以及Scala)与主控板一侧的VMP Manager(C语言)互为兼容。例如,倘若NVUM升级为新版本,同样可以管理旧版本的主控板系统;反之亦然。这个约束的提出,要求我们在开发过程中,只要我们的接口已经发布,则不能再修改接口。除修复缺陷外,我们不能删除旧有功能,只能增加新功能。若旧有功能不合适,我们也不能删除,但可以将其置为@deprecated标注。
  • 版本升级过程中,若前后操作具有依赖关系,则必须保证事务的一致性,要么全部成功,要么全部失败。事实上,这一条也是对质量属性“可靠性”的一个回应。

现有问题

整个RAID的识别都针对技术层面,而非管理层面。因此我们识别的问题也限制在技术范围。

在我们识别出来的问题中,最致命的一个问题是关于NVUM模块的加载。NVUM是一个Jar包(即本项目最主要实现的内容)。在我们现在的设计中,希望的部署方式是在网管系统中动态加载这个Jar包。之所以选择动态加载,而非静态依赖,原因有二:

  • NVUM由我们项目组维护,网管系统则属于另外一个项目,两边的版本计划完全不一致。网管系统为CS系统,被独立地部署到全球多个外场。若采用静态依赖,需要我们将其纳入到网管系统中,但NVUM的版本更新会更频繁,外场不可能因为NVUM一个模块的调整,而付出频繁更新网管系统的代价。
  • 网管系统负责监控外场各个基站的设备运转状况。虽然网管系统的重启(耗时数十分钟)并不会影响设备的功能,但却可能在重启过程中,因为未能及时掌控设备状态,而导致无法及时发现问题去解决。这样的事故是必须避免的。换言之,网管系统的重启代价太高,不能经常重启。

目前的设计是由技术部制作规格包,规格包会包含我们的NVUM Jar包。外场人员得到规格包后,导入规格包,此时,网管系统会动态加载NVUM。具体流程如下:

这就需要解决动态加载的问题。网管系统的开发人员认为无法完成Jar包的动态加载。但就这一点,我已经给出明确答复,从技术上是可行的,并且做了一个Demo来演示,方法是通过URLClassLoader实现加载。当然,我们也可以选择OSGI,但我认为这个方案过于重型,成本太高。

但是,动态加载也存在一个问题,即我们需要将NVUM分为interface和impl两个模块,并保证interface的稳定性。规格包中应该只包括impl模块。

另一个方案是采用脚本。我比较倾向于选用Groovy,因为它能很好地与Java集成。我们只需要在Java中调用Groovy提供的GroovyShell,就能直接读取groovy脚本文件;然后调用run()方法即可执行脚本。

识别依赖

除了NVUM与网管系统(OMMB、LMT),NVUM与主控板,主控板与受控板之间的依赖外,牵涉到依赖的还有很多。有的属于输入依赖,例如ACS、SCS;有的则属于输出依赖,例如OSS、BSP、TCM、SCS、DBS、COM、BRS等。此外,还有版本制作工具等系统也会受到NVUM的影响。同时,NVUM还需要访问OMMB文件系统,FTP,读取诸多外部文件。通信则可能采用Telnet、SNMP、SSH等多种协议。

这些依赖的识别便于确定本系统对其他系统可能造成的影响,事先识别有利于我们及时做好沟通,同时还需要就一些架构约定以及接口定义达成一致意见。依赖的识别也有利于我们设计系统的物理架构,并考虑系统的部署方式。

架构设计

在经过项目的需求分析与风险问题的识别后,就进入系统的架构设计阶段。我在Inception计划中安排了将近两天的时间,用以开展“设计工作坊”活动,通过引入可视化的架构设计手段带领整个团队一起开展架构设计。团队参与的形式有助于促进交流与沟通,形成架构知识的共享。因为只有团队共享了架构知识,并能就架构的思想和原则达成一致,架构才能在软件开发过程中发挥作用。同时,这种活动也是培养团队成员架构设计能力的一种手段。

由于在咨询开始之前,该项目已经开展了足够深入与详细的架构分析与设计,因而我的工作主要是在现有方案基础上,引入一些架构设计手段,使得整个系统架构更加清晰直观,并从面向对象设计的角度,对设计进行调整和优化。其中,主要是建立系统的物理架构与逻辑架构。

物理架构与系统(模块)之间的通信、部署有关。我们运用了Cockburn提出的六边形(Hexagon)架构模式来展现。Hexagon架构并不深入关注内部边界中的领域逻辑,仅仅将领域逻辑简单地划分为Application与Domain两层。但它有助于我们获得基础设施层以及相关集成点的包结构。在RAID分析中识别出项目依赖的前提下,运用六边形架构就显得水到渠成。它更贴近应用逻辑架构(相对业务逻辑架构而言),也可以作为系统的物理架构(例如部署视图),并可以驱动我们去发现诸多集成点,寻找集成模式。内外边界的分离也有助于我们将业务逻辑与应用逻辑分离开。这实际上符合“关注点分离”的架构原则。

对于我们的系统,一方面需要与前台的主控板(CC)和受控板通信,通信的协议包括FTP、SFTP、HTTP、Telnet、SNMP等多种协议;另一方面在后台又要与网管系统(OMMB、LMT)通信。除此之外,还需要与诸如OSS、BSP、TCM等多个“第三方”系统通信。如果不通过划分边界将这种通信方式直观地展现出来,将不利于我们系统的架构设计,而且可能会导致在设计过程中出现疏漏。六边形架构通过内外边界很好地体现了这种进程内与进程外的通信方式。如下图所示:

图中的三个六边形分别表示三个独立进程的系统(模块),分别为驻留在JVM中被网管系统动态加载的NVUM、主控板(VMP Manager)以及受控板(VMP Agent)。六边形边界的贴纸代表端口与适配器,并与六边形外的系统或外部资源通信。注意,在六边形内,还绘制有一个小六边形,它代表的是当前系统(模块)的内部边界,我们采用领域驱动设计的应用层服务来公开服务接口。事实上,在这个内部六边形中,将通过逻辑架构的形式来体现。我们运用了领域驱动设计的分层架构模式,获得NVUM的逻辑架构图:

由于我们的NVUM模块会被网管系统动态加载,因而它自身并没有UI展现层,因此被分为Application Layer(应用层)、Domain Layer(领域层)与Infrastructure Layer(基础设施层)三层。

我们的系统不需要访问数据库,因此基础设施层主要针对文件和网络进行处理。由于系统的逻辑功能模块并不多,在对领域层进行模块设计时,仅仅是通过领域驱动设计中给出的标准模块结构,按照对象的类型及其承担的职责分为Repository、Service、Entity以及Value Object。至于应用层,因为它是整个系统的发布接口(Published Interface),我们需要站在接口的消费者(即网管系统)的角度思考,因而,该层按照业务逻辑进行了划分。应用层应该是一个非常薄的层,其中的应用服务对象(注意它与领域层的服务对象是两个完全不同的概念)不应该包含业务逻辑,而仅仅是对领域对象的组合与调用,同时可能包含事务、安全等方面的处理。由于我们在系统中引入了验收测试(基于ScalaTest框架),针对验收测试而言,它应该只关心应用服务接口。考虑部署问题,这些接口会被抽象出来,形成一个单独的Jar包,并在发布后,保持接口的稳定性以及向后兼容性。

为了让整个团队分享与理解整个系统的物理架构与逻辑架构,我们通过这种可视化的手法绘制在白板上,使其更加直观。一旦架构发生变化,我们也可以及时进行更新。

在对整个系统进行了高屋建瓴似的架构概览之后,我们又针对一些核心模块进行了更深入,更牵涉细节的设计。主要的手法是以用例(Use Case)为入口点,站在Actor的角度,通过绘制时序图来推导参与该用例的对象、扮演的角色、承担的职责以及它们之间的协作方式,如下图所示:

我们还引入了领域驱动设计的Bounded Context(限界上下文)与Context Map(上下文映射)来帮助我们识别系统的模块,以及模块之间的关系。例如下图是针对升级功能绘制的上下文映射:

整体而言,在整个“设计工作坊”活动中,我们通过需求分析以及RAID分析建立的基础,围绕着领域驱动设计的主要思想与原则,通过引入一些可视化手段与架构模式,对整个系统的架构进行了宏观的梳理,并针对部分核心内容进行了深入分析与设计。然而,这样建立的架构并非在将来是一层不变的,而是会随着项目迭代式的增量开发,通过引入ATDD、TDD与重构,并在持续集成环境的保障下,演进式地对整个系统架构进行改进、完善乃至于重构。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 逸言 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
以RAID分析作为架构驱动力
寻找架构驱动力 人类自开始学会以智慧洗亮观察世界的双眼之后,就明白观察事物不能浅尝辄止停留在表面现象,而要去看透本质。通过本质规律去建模世界,才能以“一”推演万物。种种推演的过程,皆是要去寻找某种驱动力量作为分析或建构的起点。 例如,当我们要分析一个运动中的物体会形成如何的运动轨迹时,就需要寻找产生运动的力,包括初始的动力、重力、摩擦力以及其他可能干扰物体运动的力。有的力会推动者物体向前,例如初始动力以及与运动方向保持一致的作用力;有的力会阻碍物体的运动,如摩擦力或者空气阻力等。通过分析这些力的方向及度量,
张逸
2018/03/07
1.9K0
以RAID分析作为架构驱动力
了解不同架构思维,赏析架构之美
系统架构(System Architecture),软件架构(Soft Architecture)是 IT 领域常见的名词,架构设计是软件系统构建过程中极其关键的一部分。
码哥字节
2020/08/31
1.1K0
教你画图;架构图、拓扑图、用例图、流程图、建模图、分层图!
😂 现在的面试是不是为难小朋友,怎么刚一毕业的面试,就让现场手画简历项目的系统架构图。面试官说,你不是计算机专业毕业🎓的吗,这不是你的基础吗?你作为一个合格的毕业生,不就应该学习到这些吗?
小傅哥
2024/09/24
1.9K0
教你画图;架构图、拓扑图、用例图、流程图、建模图、分层图!
【工作坊】可视化设计
之所以选择可视化手段来进行软件设计——非UI或UX的设计——是基于我对设计的理解:设计并非文档,而是交流。那种依靠一位英雄来完成所有的设计,并编撰为详尽的文档,然后让程序员连蒙带猜按图索骥的设计方式,完全不可取。尤其在一个自组织的开发团队中,我们希望人人都是程序员,人人都是软件设计师,人人都是架构师。 那么,该如何做到充分的交流,就像风吹过树林,不分彼此的摇动每一片树叶?我想到最简单直截的方式:可视化。然而,此可视化非UML之所谓的“一图胜千言”。没错,我们当然需要绘制设计图,而且必须绘制设计图,但我们更希
张逸
2018/03/07
7970
【工作坊】可视化设计
【系统架构】可视化与领域驱动设计
从DDD的角度,领域逻辑的分析可以运用战略方法Bounded Context。可是,一个问题是:如何获得Bounded Context ? 我查看了许多关于Bounded Context的书籍与文章,虽然都着重强调了它的重要性,也给出了一些实例,却对如何从需求——>Boundex Context这一点上语焉不详。 一个初步设想 我的初步设想是通过绘制场景图(但并不成熟)。我认为有三种绘制场景图的方式:商业画布,体验地图和流程图。我认为,商业画布可以作为需求分析(尤其针对初创产品)的起点。商业画布如下图所示:
张逸
2018/03/07
1.3K0
【系统架构】可视化与领域驱动设计
《IT架构师成长和认证指南》简介及第2章 IT架构师角色和素养
作者写了一本关于IT架构师成长和认证的书,希望先通过连载的形式拿出来分享,结合读者的反馈来不断调整完善,也作为全文校对完善的一种方法。本书希望对于那些想成长为架构师,并在架构师职业发展道路上不断进阶的读者们有所借鉴和指导,也欢迎业内专家不吝赐教和斧正。
企业架构师思维
2025/05/30
880
《IT架构师成长和认证指南》简介及第2章 IT架构师角色和素养
六边形架构和分层架构的区别?
六边形架构(Hexagonal Architecture)和分层架构(Layered Architecture)是两种常见的软件架构模式。 六边形架构强调将核心业务逻辑与外部依赖解耦,通过接口与外部世界进行通信。核心业务逻辑位于架构的中心,而外部依赖通过适配器与核心业务逻辑连接在一起。这种架构具有灵活性高、易于测试和扩展的优点。 分层架构将软件系统划分为多个逻辑层,每个层具有特定的职责和功能。常见的层包括表示层、应用层、领域层和基础设施层。分层架构提供了清晰的分离和组织方式,使得各个层的职责清晰可见,并且易于理解、测试和维护。 这两种架构模式在软件系统设计和开发中有不同的应用场景和优势,可以根据具体需求选择适合的架构模式。
逍遥壮士
2023/09/01
7780
六边形架构和分层架构的区别?
Golang整洁架构实践
👉 腾小云导读 为了降低系统组件之间的耦合、提升系统的可维护性,一个好的代码框架显得尤为重要。本文将为大家介绍众所周知的三种代码框架,并从三种框架引申出COLA 架构以及作者基于 COLA 架构设计的 Go 语言项目脚手架实践方案。希望能给广大开发爱好者带来帮助和启发! ---- 👉 看目录,点收藏 1.为什么要有代码架构 2.好的代码架构是如何构建的     2.1 整洁架构     2.2 洋葱架构     2.3 六边形架构     2.4 COLA架构 3.推荐一种 Go 代码架构实践 4.
腾讯云开发者
2023/04/06
1.9K0
Golang整洁架构实践
微服务:如何拆分服务?
在微服务的落地中,第一步就需要进行微服务的拆分,服务的拆分很困难也很重要,本文就讲讲怎么进行服务的拆分。
oec2003
2022/04/26
1.3K0
微服务:如何拆分服务?
领域驱动设计对软件复杂度的应对
不管是因为规模与结构制造的理解力障碍,还是因为变化带来的预测能力问题,最终的决定因素还是因为需求。Eric Evans认为“很多应用程序最主要的复杂性并不在技术上,而是来自领域本身、用户的活动或业务”。因而,领域驱动设计关注的焦点在于领域和领域逻辑,因为软件系统的本质其实是给客户(用户)提供具有业务价值的领域功能。
张逸
2019/03/07
1.1K0
领域驱动设计对软件复杂度的应对
领域驱动应对业务复杂度
之前的文章提到过,领域驱动设计分成战略层次和战术层次,战略层次我们讨论的很多了,接下来我们主要看下战术层次要搞哪些事情,以及领域驱动如何以架构的形式落地呢。
春哥大魔王
2020/07/24
1K0
领域驱动应对业务复杂度
领域驱动设计(DDD)架构演进和DDD的几种典型架构介绍(图文详解)
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/24
9300
一网打尽,全面讲解交换机的来龙去脉,基础+拓展史上最全干货
  交换机(Switch)意为“开关”,是一种用于电(光)信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。其他常见的还有电话语音交换机、光纤交换机等。
网络工程师笔记
2021/09/30
8.4K1
一网打尽,全面讲解交换机的来龙去脉,基础+拓展史上最全干货
手机端本地服务与后端微服务的技术差异
以下是手机内部本地服务与后端微服务架构及通信协议的对比分析,结合两者的核心设计差异与技术实现特点展开:
用户2755790
2025/04/24
1270
当我们谈论DDD时我们在谈论什么
谈论到 DDD,我们会聊事件风暴,会聊限界上下文,会聊六边形架构,会聊实体值对象。这些概念各不相同,相关的概念也很不一样,但都属于DDD的范畴。见过了很多DDD的讨论和工作坊,我发现大家唇枪舌剑无法达成一致,往往是因为各自脑中的问题并不相同。
ThoughtWorks
2023/04/28
2760
当我们谈论DDD时我们在谈论什么
DDD分层架构浅析
微服务架构模型有好多种,例如整洁架构、CQRS和六边形架构等等。每种架构模式虽然提出的时代和背景不同,但其核心理念都是为了设计出“高内聚低耦合”的架构,轻松实现架构演进。而DDD分层架构的出现,使架构边界变得越来越清晰,它在微服务架构模型中,占有非常重要的位置。
架构狂人
2023/08/16
1.8K0
DDD分层架构浅析
程序员过关斩将--从未停止过的系统架构设计步伐
谈到系统架构的分层和系统领域边界的划分,每个架构师,每个技术经理,甚至每个程序员都有自己的一套想法。无论是怎么样的划分方案,总体的目标始终是一致的,打造一个高性能,高可用,高可扩展,高安全性的系统,甚至会附加上一大堆的专业名词,例如:高度一致性,可重用性,幂等性,兼容性 等等。对于最终用户来说,无论系统怎么样架构设计,稳定性是第一位的。假如系统三天两头打不开,报500服务器错误,程序员岂不是天天要被祭天?
架构师修行之路
2020/11/11
3940
我,前端,不想卷技术了……卷下整洁架构
行为是指系统实现的功能特性,一般是比较紧急的,需要按时上线。架构就是指系统架构,是重要的,但是并不总是特别紧急。因此导致我们常常忽视系统的架构价值,使得系统越来越难于理解、修改,导致系统功能迭代成本逐步上升,生产力逐步下降。
腾讯云开发者
2023/10/19
7520
我,前端,不想卷技术了……卷下整洁架构
如何有效的进行架构设计?
最近描述产品或者架构解决方案的经验总结写的相对较多,这篇暂时不谈具体问题场景了,想聊一下关于架构设计的一点方法论和经验总结。之前的很长一段时间都在实践和学习架构等相关的内容,回想了一下工作以来接触到的系统:广告系统、营销活动系统、权益系统、支付&账务系统、资金决策系统,然后还有那些看起来规模庞大的重点项目,也算是有了一点自己的总结和思考,在这里表述出来分享给大家。
邹志全
2021/11/24
5160
如何有效的进行架构设计?
干货 | 后微服务时代,领域驱动设计在携程国际火车票的实践
Ma Ning,携程国际火车票后端开发工程师,关注系统架构、微服务、高可用等技术领域。
携程技术
2021/08/13
1K0
推荐阅读
相关推荐
以RAID分析作为架构驱动力
更多 >
目录
  • 破冰之旅
  • 需求的梳理
  • RAID系统分析
    • 识别风险
      • 稳定性
      • 可扩展性
      • 性能
    • 给出假设
    • 现有问题
    • 识别依赖
  • 架构设计
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档