【架构笔记1】剃刀思维-如无必要,勿增实体

欢迎来到文思源想的架构空间,前段时间博主做了一个工作经历复盘,10年开发路,走了不少弯路,也算积累了不少软件开发、架构设计的经验和心得,确实有必要好好盘一盘,作为个人的总结,同时也留给有缘读过的人,带给一丝启发或者少走一点坑,都是好事。于是有了这个文思架构笔记这个专题的想法,未来会陆陆续续梳理一些自己总结的东西和正在发生的事情,作为留存,也作为纪念。今天是第一篇——关于剃刀思维!

“如无必要,勿增实体” ,这句话来自奥卡姆剃刀原理的核心说明,针对云服务架构它也是非常必要。老子说大道至简,亚里士多德说自然界选择最短的道路,产品交互设计也有个理念叫less is more -- 少即是多。它不只是告诉人们要做减法,而是更多去思考我们实现功能外引入新的复杂度和问题,充分考虑和权衡。

在云服务架构演进中我们看到了许多演进共同的现象,为了多活我们引入了多活控制器,为了一个新增业务避免老功能受到影响,采用新增服务的方式隔离变化,为了调用尽量少的改动,我们将一个请求扩充到五六跳甚至更多。但是做法却同时也带了一些新的影响:

  • 首先服务调用链路更长了,这引入了更高的服务治理复杂度,我们不再是简单几跳解决一个请求,而是更多的中转也带了更多定位问题的复杂性,功能实现或许改动小了,但是未来压测、定位复杂问题更多了。
  • 其次引入新服务和模块,拆分微服务,更多的其实应该考虑的是业务的解耦,功能的复用,而不是站在小组的角度,考虑什么好做把几个功能聚合在一起,微服务架构设计虽然必然走向康威定律的方向(组织结构决定代码架构),但是实际上是需要有人做好评审和管控的。新增服务并不一定是好事,这个事情是需要评审和确定的,或者做一做减法,常常问一些新的问题:
    • 如果不要新增,是否能完成功能;
    • 如果新增服务带来哪些运维架构、安全、服务治理的隐患;
    • 是否还有其他更好的解决思路。

接着还有多活这个话题,通常多活在云服务架构里面有多种拆分方式,集群方案和多活控制器,当然采用上游负载均衡hash或者一致性hash找到下游服务的方式,这无疑是最常用的解决思路,但是他的问题也同样多:

  • 服务实体增多,部署复杂度、部署规格要求逐步放大,以前可能一个服务搞定的事情现在可能需要两个或者三个,这里是实打实的成本上升,私有云环境下以前可以四五十核搞定一个环境,而如今不下数百核一个最小系统都不能完备。诚然我们功能在增多、业务在复杂,但是我们每套云的用户数、规模并没有增大到数量翻倍的情况,这里的问题就是引入实体,但是没有做减法,没有定期回顾,看看哪里不合理。
  • 服务发现、服务间通信问题变得更加紧密,定位问题也成为了一个难点,再加上某些开源软件在调用链上的特殊性,导致治理和灰度成为了很棘手的问题。

最后我想到的则是设计和建模中的抽象,通常通过业务场景分析、用户动作行为拆解,我们会在概要设计中产生许多概念,但是落地的时候实际上是需要区分什么是视图层什么是核心层模型的,把变化留在视图层,而核心层模型的定义,我认为是要经过头脑风暴和反复核对的:

  • 把多余属性拆解到极致,去除掉一切冗余字段
  • 反思如何把业务用几句话说清楚,弄清楚关键模型和关键动作,然后还能看到未来的变化,以及未来我们怎么应对变化

虽然他们不全是领域驱动设计,但是也包含了领域驱动的一些思想。分析业务场景时候由少到多,遍历细节,建模归纳时候由多到少,用核心模型、动作,充分裁剪,最后通过考虑特殊情况,补充场景。最后的最后就是问一问能不能少一些实体,少一些不一样的接口,能否复用。

总之,接口、模型、字段、调用、服务、业务他们都是所谓的实体,如无必要勿增实体,我们设计时候就需要考虑这些实体存在的必要性,同时反思是否会带来影响其他必要实体的问题。功能实现简单性只是一个新增的理由,我们更多想想未来治理的代码,部署的复杂性,额外新增的机器和研发消耗更多的精力,以及冗余引起的争议和误会。我们不仅要实现功能,还需考虑业务的解耦,更要考虑实体的熵增。人熵增需要断舍离,软件系统熵增则需要重构,盘点、分析、归纳合并、设计、重构,这个事情是需要持续进行,是需要自上而下倡导,最终最下而上显现。

当然剃刀思维还有一个关键,就是我们有他,但是最好不需要它当一个不需要的实体存在,这个实体就会开始证明自己存在的必要,其他原来必要存在的实体也会因为他的存在而容易自发建立一套与它有关的新协作或者新习惯。老业务会通过新部门形成砍不掉的冗余流程,豆浆机也会在你买菜时候提醒你多买一些吃不完的豆子,这个时候在用剃刀就很难了,剃了就会很疼很受伤,然后就需要权衡有了犹豫。勿增实体而不是剃掉实体,是因为剃刀思维的关键是一开始就找到这些不需要的实体,防患于未然,所以需求评审、架构设计、模型设计、调用流程设计都需要有这样的思考和审核,从一开始就找到这些没有必要存在的实体。

剃刀的真意在于止“繁”存"简" ----心存一刀,只留必要,心中有刀无需用刀,才是最好的状态,或许这是必字的另一种解释,也是我们设计架构的一个需要重视的要诀。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哪个牌子的电视盒子好用?2024超强电视盒子排名

最近很多朋友问我电视盒子的相关问题,就目前来说,电视盒子的地位依然是不可取代的。我近来要发布的测评内容是哪个牌子的电视盒子好用,耗时两周进行对比后整理了电视盒子排名,看看哪些电视盒子是最值得入手的吧。 NO.1——泰捷新品…

milvus upsert流程源码分析

milvus版本:v2.3.2 整体架构: Upsert 的数据流向: 1.客户端sdk发出Upsert API请求。 import numpy as np from pymilvus import (connections,Collection, )num_entities, dim 4, 3print("start connecting to Milvus") connections.connect("default",…

AD9851——FPGA调试(并行模式)

AD9851——FPGA调试(并行模式) 工程功能:使用FPGA来调试AD9851芯片,使用的是并行模式 芯片手册:AD9851 CMOS 180 MHz DDS/DAC Synthesizer Data Sheet (Rev. D) (analog.com) 管脚功能 管脚名称管脚功能D0-D78位数据输…

水库安全监测方案(福建地区水库安全监测案例分享)

我司星创易联最近在福建省受到了一个水库安全监测系统项目的委托。该水库位于福建中部山区,作为该地区的重要防洪与供水工程,对下游数十万人的生活产生重大影响。但是因为水库附近地质情况复杂,水库大坝在多次洪水冲击下出现一定病害,亟须全面加强对水库大坝安全状况的监测,以确…

Rocky Linux 运维工具yum

一、yum的简介 ​​yum​是用于在基于RPM包管理系统的包管理工具。用户可以通过 ​yum​来搜索、安装、更新和删除软件包,自动处理依赖关系,方便快捷地管理系统上的软件。 二、yum的参数说明 1、install 用于在系统的上安装一个或多个软件包 2、seach 用…

常用git 打tag命令

1.查看所有tag git tag 2.创建 v5.0.0的tag git tag v5.0.0 git tag (创建后查看) 3.推送到远程tag git push origin v5.0.0 4.删除远程tag git push origin --delete v5.0.0 5.删除本地tag git tag -d v5.0.0 6.添加带有备注信息的tag git tag v5.…

golang学习5,glang的web的restful接口

1. //返回json r.GET("/getJson", controller.GetUserInfo) package mainimport (/*"net/http"*/"gin/src/main/controller""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/get", func(ctx *…

Oracle中序列

1. Sequence 定义 在Oracle中可以用SEQUENCE生成自增字段。Sequence序列是Oracle中用于生成数字序列的对象,可以创建一个唯一的数字作为主键。 2. 为什么要用 Sequence 你可能有疑问为什么要使用序列? 不能使用一个存储主键的表并每次递增吗&#xf…

golang使用gorm操作mysql1

1.mysql连接配置 package daoimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/logger" )var DB *gorm.DB// 连接数据库,启动服务的时候,init方法就会执行 func init() {username : "roo…

【virtual Box】功能速通:安装 Windows 和 Ubuntu

文章目录 一、虚拟机1.1 概述1.2 virtual box概述 二、新建虚拟机、删除、注册三、虚拟机内部设置3.1 安装增强功能驱动3.2 分辨率问题3.3 网络链接方式 一、虚拟机 1.1 概述 虚拟机(Virtual Machine,VM)是一种软件实现的计算机系统&#x…

EMR StarRocks实战——Mysql数据实时同步到SR

文章摘抄阿里云EMR上的StarRocks实践:《基于实时计算Flink使用CTAS&CDAS功能同步MySQL数据至StarRocks》 前言 CTAS可以实现单表的结构和数据同步,CDAS可以实现整库同步或者同一库中的多表结构和数据同步。下文主要介绍如何使用Flink平台和E-MapRed…

【appium】App类型、页面元素|UiAutomator与appium|App元素定位

目录 一、App前端基础知识 1、App类型划分 2、App类型对比 3、App页面元素 App页面元素分为布局和控件两种 常见布局: 常见控件:定位软件:appium和sdk自带的uiautomatorviewer都可以定位 二、App元素定位 1、id定位 2、text定位 3…