首页 文章 精选 留言 我的

精选列表

搜索[科大讯飞],共3628篇文章
优秀的个人博客,低调大师

深入理解Zookeeper——大牛带你~

随着互联网技术的发展,大型网站需要的计算能力和存储能力越来越高。网站架构逐渐从集中式转变成分布式。 虽然分布式和集中式系统相比有很多优势,比如能提供更强的计算、存储能力,避免单点故障等问题。但是由于采用分布式部署的方式,就经常会出现网络故障等问题,并且如何在分布式系统中保证数据的一致性和可用性也是一个比较关键的问题。 分布式的工作方式有点类似于团队合作。当有一项任务分配到某个团队之后,团队内部的成员开始各司其职,然后把工作结果统一汇总给团队主管,由团队主管再整理团队的工作成果汇报给公司。 但是,日常工作中,如果两个员工或用户对某件事产生了分歧,通常我们的做法是找上级,去做数据和信息的同步。 那么对于我们的服务呢,多个节点之间数据不同步如何处理? 对于分布式集群来说,这个时候,我们通常一个能够在各个服务或节点之间进行协调的服务或中间人 架构设计中,没有一个问题不能通过增加一个抽象层来解决的,如果有,那就增加两层。 集群管理 我们可以一起看看,协调服务中的佼佼者--ZooKeeper zookeeper起源 最初,在Hadoop生态中,会存在很多的服务或组件(比如hive、pig等),每个服务或组件之间进行协调处理是很麻烦的一件事情,急需一种高可用高性能数据强一致性的协调框架。 因此雅虎的工程师们创造了这个中间程序,但中间程序的命名却愁死了开发人员,突然想到hadoop中的大多是动物名字,似乎缺乏一个管理员,这个程序的功能有是如此的相似。因此zookeeper诞生。 Zookeeper是一个开放源码的分布式服务协调组件,是Google Chubby的开源实现。是一个高性能的分布式数据一致性解决方案。他将那些复杂的、容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并提供一系列简单易用的接口给用户使用。 zookeeper提供了哪些特性,以便于能够很好的完成协调能力的处理呢? 功能与特性 数据存储 zookeeper提供了类似Linux文件系统一样的数据结构。每一个节点对应一个Znode节点,每一个Znode节点都可以存储1MB(默认)的数据。 客户端对zk的操作就是对Znode节点的操作。 zookeeper数据结构 ·Znode:包含ACL权限控制、修改/访问时间、最后一次操作的事务Id(zxid)等等 ·说有数据存储在内存中,在内存中维护这么一颗树。 ·每次对Znode节点修改都是保证顺序和原子性的操作。写操作是原子性操作。 举个例子,在注册中心中,可以通过路径"/fsof/服务名1/providers"找到"服务1"的所有提供者。 每一个Znode节点又根据节点的生命周期与类型分为4种节点。 ·生命周期:当客户端会话结束的时候,是否清理掉这个会话创建的节点。持久-不清理,临时-清理。 ·类型:每一个会话,创建单独的节点(例子:正常节点:rudytan,顺序编号节点:rudytan001,rudytan002等等) 监听机制 zookeeper除了提供对Znode节点的处理能力,还提供了对节点的变更进行监听通知的能力。 监听机制的步骤如下: 1.任何session(session1,session2)都可以对自己感兴趣的znode监听。 2.当znode通过session1对节点进行了修改。 3.session1,session2都会收到znode的变更事件通知。 节点常见的事件通知有: ·session建立成功事件 ·节点添加 ·节点删除 ·节点变更 ·子节点列表变化 需要特别说明的是: 一次监听事件,只会被触发一次,如果想要监听到znode的第二次变更,需要重新注册监听。 到这里,我们了解到zookeeper提供的能力,那我们在哪些场景可以使用它?如何使用它呢? 应用场景 zookeeper用得比较多的地方可能是,微服务的集群管理与服务注册与发现。 注册中心 ·依赖于临时节点 ·消费者启动的时候,会先去注册中心中全量拉取服务的注册列表。 ·当某个服务节点有变化的时候,通过监听机制做数据更新。 ·zookeeper挂了,不影响消费者的服务调用。 目前还有个比较流行的服务Eureka也可以做注册中心,他们有什么优势和劣势呢? 注册中心的对比 通过上面的架构图,可以发现Eureka不同于zk中的节点,Eureka中的节点每一个节点对等。是个AP系统,而不是zk的CP系统。在注册中心的应用场景下,相对于与强数据一致性,更加关心可用性。 分布式锁 ·依赖于临时顺序节点 ·判断当前client的顺序号是否是最小的,如果是获取到锁。 ·没有获取到锁的节点监听最小节点的删除事件(比如lock_key_001) ·锁释放,最小节点删除,剩余节点重新开始获取锁。 ·重复步骤二到四。 redis和db也能创建分布式锁,那有什么异同呢? 分布式锁的对比 具体差异比较: 从理解的难易程度角度(从低到高)数据库 > 缓存(Redis) > Zookeeper 从实现的复杂性角度(从低到高)Zookeeper >= 缓存(Redis) > 数据库 从性能角度(从高到低)缓存(Redis) > Zookeeper >= 数据库 从可靠性角度(从高到低)Zookeeper > 缓存(Redis) > 数据库 集群管理与master选举 ·依赖于临时节点 ·zookeeper保证无法重复创建一个已存在的数据节点,创建成功的client为master。 ·非master,在已经创建的节点上注册节点删除事件监听。 ·当master挂掉后,其他集群节点收到节点删除事件,进行重新选举 ·重复步骤二到四 当然还有其他应用场景,不一一列举了。 有人说,zookeeper可以做分布式配置中心、分布式消息队列,看到这里的小伙伴们,你们觉得合适么? 到这里,可以基本上满足基于zk应用开发的理论知识储备。 高性能高可用强一致性保障 高性能-分布式集群 高性能,我们通常想到的是通过集群部署来突破单机的性能瓶颈。对于zk来说,就是通过部署多个节点共同对外提供服务,来提供读的高性能。 ·Master/Slave模式。 ·在zookeeper中部署多台节点对外提供服务,客户端可以连接到任意一个节点。 ·每个节点的数据都是一样的。 ·节点根据角色分为Leader节点与Learner节点(包括Follower节点与Observer节点)。 ·集群中,只有一个Leader节点,完成所有的写请求处理。 ·每次写请求都会生成一个全局的唯一的64位整型的事务ID(可以理解为全局的数据的版本号)。 ·Learner节点可以有很多,每个Leaner可以独自处理读请求,转写请求到Leader节点。 ·当Leader节点挂掉后,会从Follower节点中通过选举方式选出一个Leader提供对外服务。 ·Follower节点与Observer节点区别在于不参与选举和提议的事务过半处理。 ·集群通常是按照奇数个节点进行部署(偶然太对容灾没啥影响,浪费机器)。 数据一致性(zab协议-原子广播协议) 通过集群的部署,根据CAP原理,这样,可能导致同一个数据在不同节点上的数据不一致。zookeeper通过zab原子广播协议来保证数据在每一个节点上的一致性。原子广播协议(类似2PC提交协议)大概分为3个步骤。 ·Leader包装写请求,生成唯一zxid,发起提议,广播给所有Follower。 ·Follower收到提议后,写入本地事务日志,根据自身情况,是否同意该事务的提交。 ·Leader收到过半的Follower同意,自己先添加事务。然后对所有的Learner节点发送提交事务请求。 需要说明的是,zookeeper对数据一致性的要求是: ·顺序一致性:严格按照事务发起的顺序执行写操作。 ·原子性:所有事务请求的结果在集群中的所有节点上的应用情况是一致的。 ·单一视图:客户端访问任何一个节点,看到的数据模型都是一致的。 ·实时性:保证在极小一段时间客户端最终可以从服务读取最新数据状态(如果要实时,需要客户端调用syn方法)。 可用性-leader选举(zab协议-崩溃恢复协议) 在整个集群中,写请求都集中在一个Leader节点上,如果Leader节点挂了咋办呢? 当集群初始化或Follower无法联系上Leader节点的时候,每个Follower开始进入选举模式。选举步骤如下: 1.Follower节点第一次投票先投自己,然后将自己的选票广播给剩余的Follower节点。 2.Follower节点接收到其他的选票。 3.选票比较:比较自己的与接收的选票的投票更有。 4.如果资金的选票不是最优选票,变更自己的选票,投最优选票的节点。 5.统计自己收到的选票,如果某个节点获得了过半的节点的投票。确认该节点为新的Leader节点。 6.确认Leader节点后,每个节点变更自己的角色。完成投票选举。 选举原则:谁的数据最新,谁就有优先被选为Leader的资格。 举个例子,假如现在zk集群有5个节点,然后挂掉了2个节点。剩余节点S3,S4,S6开始进行选举,他们的最大事务ID分别是6,2,6。定义投票结构为(投票的节点ID,被投节点ID,被投节点最大事务ID)。 1.初始状态,S3,S4,S5分别投自己,并带上自己的最大事务ID。 2.S3,S4,S5分别对自己收到的2票与自己的1票做比较。 3.S5发现自己的是最优投票,不变更投票,S3,S4发现S5的投票是最优解,更改投票。 4.S3,S4广播自己变更的投票。 5.最后大家都确认了S5是Leader,S5节点状态变更为Leader节点,S3,S4变更为Follower节点。 到这里,就是选举的主要过程。 数据的持久化 ·zookeeper所有数据都存在内存中。 ·zookeeper会定期将内存dump到磁盘中,形成数据快照。 ·zookeeper每次的事务请求,都会先接入到磁盘中,形成事务日志。 ·全量数据 = 数据快照 + 事务日志。 Zookeeper和CAP的关系 前面提到了zk在可用性、数据一致性、性能等方面都表现的很优秀,也介绍了其中的原理。 但是分布式系统的CAP理论告诉我们:任何软件系统都无法同时满足一致性、可用性以及分区容错性。 那么,Zookeeper其实也是一个分布式系统,那么也就要满足CAP理论,也就是说,虽然在各个方面,ZK可以说是做了很多努力,但是在极端情况下,Zookeeper也需要在这三者之间有一些权衡,那么Zookeeper在CAP中是如何取舍的呢? ZooKeeper是个CP(一致性+分区容错性)的,即任何时刻对ZooKeeper的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性,但是它不能保证每次服务请求的可用性(注:也就是在极端环境下,ZooKeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果)。 但是别忘了,ZooKeeper是分布式协调服务,它的职责是保证数据(注:配置数据,状态数据)在其管辖下的所有服务之间保持同步、一致,所以就不难理解为什么ZooKeeper被设计成CP而不是AP特性的了。 如果是AP的,那么将会带来恐怖的后果(注:ZooKeeper就像交叉路口的信号灯一样,你能想象在交通要道突然信号灯失灵的情况吗?)。 而且, 作为ZooKeeper的核心实现算法 Zab,就是解决了分布式系统下数据如何在多个服务之间保持同步问题的。 如果 ZooKeeper下所有节点都断开了,或者集群中出现了网络分割的故障(注:由于交换机故障导致交换机底下的子网间不能互访)。 那么ZooKeeper 会将它们都从自己管理范围中剔除出去,外界就不能访问到这些节点了,即便这些节点本身是“健康”的,可以正常提供服务的;所以导致到达这些节点的服务请求被丢失了。 那么,再来深入原理看一下Zookeeper是如何在CAP之间做权衡的呢? 感悟 最后,说说在整个学习和使用zk过程中的一个感悟吧。 ·没有银弹,每一种技术或方案都有其优点和缺点。 ·做一件事情很简单,做好一件事件很难。 欢迎工作一到五年的Java工程师朋友们加入Java填坑之路:860113481 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

优秀的个人博客,低调大师

建木 v2.6.3,“兔”猛进

建木是一个面向DevOps领域的极易扩展的开源无代码(图形化)/低代码(GitOps)工具。可以帮助用户轻松编排各种DevOps流程并分发到不同平台执行。 建木v2.6.3现已发布 主要更新:增强功能、修复若干已知bug enhancement: 建木服务镜像从DockerHub迁移到建木Hub镜像库 ui镜像 v2.6.3之前:jianmudev/jianmu-ci-ui:v2.6.2 v2.6.3开始:docker.jianmuhub.com/jianmu/jianmu-ui:v2.6.3 server镜像 v2.6.3之前:jianmudev/jianmu-ci-server:v2.6.2 v2.6.3开始:docker.jianmuhub.com/jianmu/jianmu-server:v2.6.3 worker-docker镜像 v1.0.6之前:jianmudev/jianmu-worker-docker:v1.0.5 v1.0.6开始:docker.jianmuhub.com/jianmu/jianmu-worker-docker:v1.0.6 worker-kube镜像 1.0.3之前:jianmudev/jianmu-worker-kube:1.0.2 1.0.3开始:docker.jianmuhub.com/jianmu/jianmu-worker-kube:1.0.3 # 注:启动server时的entrypoint有改动,请参考建木部署 # https://gitee.com/jianmu-dev/jianmu-deploy/blob/master/docker-compose.yml # v2.6.3之前 entrypoint: ["/wait-for-it.sh", "jianmu-mysql:3306", "-t", "0", "--", "java", "-Duser.timezone=Asia/Shanghai", "-cp", "/app/resources:/app/classes:/app/libs/*", "dev.jianmu.api.SpringbootApp"] # v2.6.3开始 entrypoint: ["wait-for-it.sh", "jianmu-mysql:3306", "-t", "0", "--", "java", "-Duser.timezone=Asia/Shanghai", "-jar", "jianmu-server.jar"] RFC-050-single-workflow-concurrent HA部署终止流程,或任务在WAITTING状态下终止流程时,无法通知worker终止任务 建议提供一个全局的配置,支持每个节点hosts文件的配置 shell节点推荐镜像优化成建木Hub镜像库中的镜像 fixed: 项目有待启动的流程实例,改为并发后,待启动流程实例开始执行,但卡片的状态未改变 trace配置为true时,shell节点命令中含有分号时,因echo原因,分号后面的命令会报错 无法下载之前失败任务的日志,都是下载的最新任务日志 官方示例 建木文档 建木官网

优秀的个人博客,低调大师

MySQL每秒57万的写入,带你~

一、需求 一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使用。 二、实现再分析 对于单表20亿, 在MySQL运维,说真的这块目前涉及得比较少,也基本没什么经验,但对于InnoDB单表Insert 如果内存大于数据情况下,可以维持在10万-15万行写入。 但很多时间我们接受的项目还是数据超过内存的。 这里使用XeLabs TokuDB做一个测试。 三、XeLabs TokuDB介绍 项目地址: https://github.com/XeLabs/tokudb 相对官方TokuDB的优化: ·内置了jemalloc 内存分配; ·引入更多的内置的TokuDB性能指标; ·支持Xtrabackup备份; ·引入ZSTD压缩算法; ·支持TokuDB的binlog_group_commit特性; 四、测试表 TokuDB核心配置: 表结构: 利用load data写入数据: 计算一下每秒写入速度: 文件大小: 实际文件8.5G,写入TokuDB大小3.5G,只是接近于一半多点的压缩量。 对于20亿数据写入,实际测试在58分钟多点就可以完成。可以满足实际需求,另外对于磁盘IO比较好的机器(SSD类盘,云上的云盘),如果内存和数据差不多情况,这量级数据量测试在Innodb里需要添加自增列,可以在3个小多一点完成。 从最佳实战上来看,Innodb和TokuDB都写入同样的数据,InnoDB需要花大概是TokuDB3-4倍时间。文件大小区别,同样20亿数据: 文件大小在5倍大小的区别。 测试结论: 利用TokuDB在某云环境中8核8G内存,500G高速云盘环境,多次测试可以轻松实现57万每秒的写入量。 另外测试几种场景也供大家参考: 如果在TokuDB中使用带自增的主键,主键无值让MySQL内部产生写入速度,下降比较明显,同样写入2亿数据,带有自建主键: 同样的数据写入在主键自增无值产生时,不能使用TokuDB的 Bulk loader data特性,相当于转换为了单条的Insert实现,所以效果上慢太多。 关于TokuDB Bulk Loader前提要求,这个表是空表,对于自增列,如自增列有值的情况下,也可以使用。 建议实际使用中,如果自增列有值的情况下,可以考虑去除自增属性,改成唯一索引,这样减少自增的一些处理逻辑,让TokuDB能跑地更快一点。 另外在Bulk Loader处理中为了追求更快速的写入,压缩方面并不是很好。 关于TokuDB Bulk Loader : https://github.com/percona/PerconaFT/wiki/TokuFT-Bulk-Loader 五、测试环境说明 测试使用CentOS7环境,编译的XeLabs TokuDB版本百度云地址: https://pan.baidu.com/s/1qYRyH3I 。 欢迎工作一到五年的Java工程师朋友们加入Java填坑之路:860113481 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

优秀的个人博客,低调大师

:老码农的技术理想

小时候,老师问我,你的理想是什么?我不假思索说是工程师,于是长大之后果然成了工程师。 工作这么多年,一直在思考工程师这三个字的意义,终于有一天恍然大悟,原来就是:用技术手段改进世界。 那么,在软件方面,目前的世界有哪些问题需要解决呢?有这么一些问题可以思考: 现在整个世界的信息化程度是偏高还是偏低? 程序员的人数够用吗? 软件行业的生产力是偏高还是偏低? 大部分软件系统都可靠吗? 我想说说自己对这几个问题的理解。 虽然现在我们的生活与十年前相比,已经发生了巨大变化,比如智能手持设备已经非常普及,可穿戴设备也在蓬勃发展。十年前我们用手机收发短信或者邮件,浏览非常简单而老土的wap页面,但现在,绝大部分人的手机已经取代了电脑,成为日常生活中不可缺少的工具。 我们用手机交流,购物,欣赏影视,阅读书籍,玩各类游戏,尤其是飞速发展的移动购物和支付体系,使得我们能在任意场合购买心仪的物品,订购旅游服务和宾馆,叫快餐,打车等等,生活非常美好,那么,整个世界的信息化程度处于什么级别呢? 我觉得,才刚刚相当于小学二年级,整个世界的信息化程度仍然严重偏低。从现在算起,往前10年,往后10年,这20年时间中,面向个人的信息化服务 处于高速发展期,这个领域非常吸引眼球,因为它与每个人的生活息息相关。可是,另外有一些领域,却非常需要发展,那就是传统行业的信息化。 之前有不少传统行业,进行了一定程度的信息化,但这个信息化仅仅能满足自身运作的基本要求,当它与整个社会的潮流相对接的时候,就显得非常落后,迟缓。比如说在网购这个大体系中,普通用户所能看到的是商品展示,比价,下单的过程,但背后的核心环节却是配货与物流。 我还在上学的时候,有老师这么说过,现在计算机行业非常火热,很可能要饱和了,你们不一定非要从事这方面的工作。现在回头看这句话,觉得很有趣,人 真的很难有眼光看到未来。去年我入职苏宁培训的时候,孙为民副总讲了当年一个决策失误的例子。90年代末,公司统计发现全国空调的年销售量达到数百万台, 觉得很可怕,这个行业可能要饱和,估计要再想办法拓展别的商品经营了,但现在,全国空调的保有量为七亿台,即使完全没有新增,十年换一轮,每年也卖得出去 七千万台,当年凭什么说这就饱和了? 所以我现在看程序员的状况,仍然是供不应求,尤其是高端程序员,十分抢手。这个问题的背景就是全社会的信息化进程在加速,之前的程序员人数远远跟不上需求量。 那么,如何解决这个问题呢?一方面是继续培训,促使更多新人来到这个行业,并且认真做下去,另外还有一些别的手段需要考虑。 我想追问一个问题:世界上懂业务的人多,还是懂技术的人多?很明显,懂业务的人要多很多,什么叫业务?其实就是行业常识,生活经验。 比如说,一个有经验的仓库保管员,可能文化程度不高,理解不了软件的运行原理之类,但一定对产品出库入库的流程非常熟悉,包括各种审批过程和异常状 况,但这些,程序员是不懂的。那如果要促进这个领域的信息化,必然要在两者之间寻找一个结合点,程序员可以学业务,业务人员也可以尝试参与软件研发过程, 目前来说,都是前者比较多,因为程序员相对来说还是比较年轻,学东西快些。但从整体社会效益来说,这其实是不利的,因为程序员是更稀缺资源,而传统业务人 员非常多。 之前见过一个问题:如何让业务人员更好地参与软件研发过程。这个问题的根本解决方法是DSL(Domain Specific Language),核心解决方案是二次开发平台。 什么是DSL和二次开发平台呢,这两个词听上去很高端,但其实大家有很常用的东西就属于这个范畴,比如Excel,它提供了各种各样的公式,还有VBA,使用这些东西的人绝大部分不是软件行业的,Excel就是一种很成功的二次开发平台,公式和VBA就可以算DSL了。 很多时候这些东西还不够直观,我们可以看到一些图形化的编程语言,比如Scratch,现在很多小学生的兴趣班就会学,这些东西相对学起来就比较容 易了,我们也可以做一些类似的抽象,以图形化的方式让业务人员能够参与,比如流程配置等等。图形化的东西,是最适合非技术人员理解的。 所以,要促进社会的信息化程度,最好是能够想办法把各行业的业务人员都拖进来一起搞。具体的分工大致是:技术人员和业务人员一起定义DSL,技术人员负责DSL的底层平台实现,业务人员负责使用它来构建业务模型和业务流程,甚至业务界面。 那么,软件行业的生产力是偏高还是偏低呢?我认为严重偏低。什么叫严重偏低?如果以机械力量的变革来对比,软件行业目前的生产力水平处于蒸汽机发明 之前。也就是说,生产力远远没有被解放,大家做的大部分东西将来是会被机械化的,不再需要这么多人来做这么重复的劳动。可能很多人会对这段话不满,怎么就 重复劳动了,你说说我做的什么是可以被机器替代的? 换个角度看,为什么几乎所有外行都觉得软件贵呢?因为人力成本太高了,他们觉得,做出这么多东西,应该是不需要这么多时间。为什么双方的反差这么大呢? 我觉得其中的关键点在于绝大部分工作的抽象程度严重不足,另外有很大一部分效率损失在编程平台或编程语言的不完善,比如Web前端。 从第一代到第四代编程语言,每一代都是损失一定运行效率,而大幅提升编写效率。随着硬件技术的发展,软件编程必然越来越粗放,大的趋势是不特别重视细节效率,只要没有数量级的性能损耗。 所以我们可以预期,会有越来越多的人使用一些运行效率相对不怎么高的语言或框架,只是为了提高单位时间的生产力。从老板们角度想,也会明白,提升运 行机器的性能,要比多雇几个程序员便宜多了。因此,从整体趋势看,追求细节性能的程序员们恐怕会离自己的理想越来越远了,除非是在某些特定领域。 那么,绝大部分软件系统都可靠吗?我换一句话来问:各位程序员朋友,如果你们住的房子质量跟你们正在做的软件一样,你敢住吗?感觉大家都在笑,笑是什么意思,我们都懂的。 那为什么软件系统的质量不容易高呢?我觉得主要原因是流程不完善。那为什么不完善?需求容易变。为什么容易变?是因为不论程序员自己,还是需求方,其实潜意识都认为自己做的东西是变更成本较低的。 试想一下,为什么没人在盖高楼盖一半变更需求?为什么没人修大桥修一半变更需求?甚至做衣服做一半的时候变更需求,理发到一半变更需求,都会被人认为是不讲理。但是在软件领域,好像这倒成了普遍现象。 因为整个软件系统的实现,都是虚拟的,看不见摸不着,并不消耗什么物料,所以从这个角度想,变起来当然是容易的。但软件系统的架构,其实也跟实体的 没本质区别,变更时候要考虑很多关联因素,并不是就那么孤立的看一小块地方,当然,也会有一些不影响全局的变更。打个比方说,如果你在盖房子盖到一半,那 变更外墙颜色肯定是要比变更窗户大小容易的。要是想变得太多,估计只好拆了重来。 我见过不少公司是通过加强测试的方式来试图控制质量,但个人觉得这种方式不划算,而且收效不高。要想很好地应对需求变更,很重要的一点就是不要有这个软件一定不会改的想法,然后,从架构上做拆分,隔离,组件化等等,力争做到即使要改,也只改某一块的内部,不影响别的地方。 很多软件公司,一方面不注重架构的设计与宣贯,导致变更的时候问题多多,程序员也不能很好领会架构意图,一方面忽视整个过程中对架构的管控,认为架构只是最初那张静态图。 任何一种架构方案,都需要一个良好的管控机制。没有哪个盖大楼的只认真管设计图纸,不控制施工过程。架构其实是跟施工过程严格相关的,架构并不是一 张扁平的图,而是一个立体的东西,作为整个系统工程的骨架。如果能在开发的时候看到这个骨架逐渐建立,血肉充盈的过程,对整个系统的成功把握一定会大 得多,这也就是开发过程中架构管控的理念,具体实现要依赖于不同场景。 所以,将来的软件开发方案,一定是会朝着几个方向发展: 高生产力,单位时间生产效率更高,普通人员也可以参与 高可控性,整个生产过程更加完备可靠 有时候看现在的小孩子,会觉得他们很幸福,因为等他们这代长大,就不需要像我们现在这样编写程序了,那时候,编程已经成了一种令人习以为常的通用技能,就像现在的人用Office软件一样,所谓的编程,很可能已经不需要敲代码了,而是图形化,设置几个参数就完事了。 来源:51CTO

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册