读程序员的README笔记17_构建可演进的架构(下)

这篇具有很好参考价值的文章主要介绍了读程序员的README笔记17_构建可演进的架构(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

读程序员的README笔记17_构建可演进的架构(下)

1. 可演进的API

1.1. 随着需求的变化,你需要改变你的API,即代码之间的共享接口

1.2. 改变API很容易,但很难做到正确

1.3. 保持API小巧

1.3.1. 小巧的API更易于理解和演进

1.3.2. 只添加即刻需要的API方法或字段

1.3.3. 带有许多字段的API方法应该有合理的默认值

1.3.3.1. 开发人员可以只专注于和自己相关的字段,因为它们会继承其他字段的默认值

1.3.3.2. 默认值可使大型API在感觉上很小巧

1.4. 公开定义良好的服务端API

1.4.1. 切记使用标准工具来定义服务端API

1.4.1.1. OpenAPI通常用于RESTful服务

1.4.1.2. non-REST服务则使用Protocol Buffers、Thrift或类似的接口定义语言(interface definition language,IDL)

1.4.1.3. 接口定义工具自带代码生成器,可以将服务的定义转换为客户端和服务端代码

1.4.1.4. 文档也可以被生成,测试工具可以使用IDL来生成stub数据和模拟数据

1.5. 保持API变更的兼容性

1.5.1. 向前兼容

1.5.1.1. 向前兼容的变更允许客户端在调用旧版的服务时使用新版的API

1.5.1.2. 一个正在运行1.0版API的网络服务,但可以接收来自使用1.1版API的客户端的调用,这就是向前兼容

1.5.2. 向后兼容

1.5.2.1. 向后兼容的变更:新版本的库或服务不需要改变旧的客户端代码

1.5.2.2. 如果针对1.0版API开发的代码在使用1.1版时能继续编译和运行,这种变更就被称为向后兼容

1.6. API版本化

1.6.1. 随着API的不断演进,你将需要决定如何处理多个版本的兼容性

1.6.2. 完全向后兼容和向前兼容的变更意味着API的所有的历史版本和未来版本都可以相互操作

1.6.3. 你会想变更你的API,使之与旧的客户端不兼容

1.6.3.1. 当客户端代码难以变更时,API的版本管理最有价值

1.6.4. 版本化你的API意味着你在做出改变时将引入一个新的版本

1.6.4.1. API版本化自有其代价

1.6.4.2. 旧的主版本服务需要被维护,修复的bug也需要回传到以前的版本

1.6.5. API版本通常由API网关或服务网格来管理

1.6.5.1. 管理版本所采用的方法要务实

1.6.6. 将文档与你的API一起保持版本化

2. 可持续的数据管理

2.1. API比持久化数据存续的时间更短

2.1.1. 一旦客户端和服务端API都升级了,就意味着工作完成了

2.2. 隔离数据库和使用明确的schema将使数据演进更易于管理

2.3. 数据库隔离

2.3.1. 共享的数据库很难演进,并且会导致丧失自主性

2.3.1.1. 图

读程序员的README笔记17_构建可演进的架构(下)

2.3.2. 拥有共享数据库的应用程序可以发展到直接依赖对方的数据,应用程序应该作为它们所使用的底层数据的控制点

2.3.3. 隔离的数据库只有一个读取者和写入者

2.3.3.1. 其他所有流量都通过远程过程调用

2.3.3.2. 图

读程序员的README笔记17_构建可演进的架构(下)文章来源地址https://www.toymoban.com/news/detail-760347.html

2.3.4. 隔离数据库为你提供了共享数据库所不具备的灵活性和隔离性

2.4. 使用schema

2.4.1. 僵化的预定义数据列和类型,以及它们演进的重量级过程,会导致流行的无模式(schemaless)数据管理的出现

2.4.2. 无模式并不意味着“没有模式”(数据将无法使用)

2.4.3. 不要将无模式的数据隐藏在已经模式化的数据中

2.4.3.1. 隐藏无模式的数据是“自取灭亡”,你获得了显式schema的所有痛苦,却没有任何收益

2.4.4. 无模式数据有一种隐含的模式,可以在读取时被提供或推断出来

2.4.5. 采用无模式的方法会产生明显的数据完整性和复杂性问题

2.4.6. 强类型的面向schema的方法降低了应用程序的隐蔽性,因此也降低了其复杂性

2.4.7. 为你的数据定义明确的schema将使你的应用程序保持稳定,并使你的数据可用

2.4.7.1. 明确的schema会让你在编写数据时可以对其进行合理性检查

2.4.7.2. 使用显式schema解析数据通常会更快捷

2.4.7.3. 架构还可以帮助你检测到前后不兼容的变化

2.4.8. 数据有时被描述为“一次写入,多次读取”,使用schema可以使读取更容易

2.4.9. schema自动化迁移

2.4.9.1. 改变一个数据库的schema是危险的

2.4.9.2. 可以管理数据库迁移的工具

2.4.9.2.1. Liquibase
2.4.9.2.2. Flyway
2.4.9.2.3. Alembic
2.4.9.2.4. GitHub的gh-ost
2.4.9.2.5. Percona的pt-online-schema-change
2.4.9.2.6. Skeema
2.4.9.2.7. Square的Shift

2.4.9.3. 大多数迁移工具都支持回滚,也就是可以撤销迁移产生的变化

2.4.10. 保持schema的兼容性

2.4.10.1. 写入磁盘的数据也有和API一样的兼容性问题

2.4.10.2. 变更数据捕获(change data capture,CDC)是一种基于事件的架构,将插入、更新和删除操作转换为下游使用者的消息

2.4.10.3. 数据仓库管道和下游用户必须受到保护,以免遭受schema变更带来的不良影响

2.4.10.4. 兼容性检查应该尽早地进行,最好是在提交代码时通过检查数据库DDL语句来进行

2.4.10.5. 独立的数据产品,可能只是数据库视图,允许团队与数据的消费者保持兼容,而不必冻结其内部的数据库schema

到了这里,关于读程序员的README笔记17_构建可演进的架构(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 读程序员的README笔记08_依赖管理

    2.6.1.1. 版本不应该被重复使用 2.6.1.2. 永远不要在现有版本下重新发布更改的代码 2.6.2.1. 版本应该帮助人们和工具对版本的优先顺序进行推断 2.6.3.1. 版本信息区分了预先发布的代码和已发布的代码,将构建流水号与构件相关联,并设置了稳定性和兼容性的合理预期 6.2.5.1

    2024年02月05日
    浏览(38)
  • 读程序员的README笔记09_代码评审

    4.4.1.1. walk-through 4.4.1.2. 一种面对面的会议,开发人员在会上共享他们的屏幕,并引导队友了解正在进行的修改内容 4.4.1.3. 是启发想法和让你的团队适应代码修改的好方法 5.1.2.1. 如果紧急度不明确,请询问提交者 5.4.4.1. SQL注入攻击、敏感数据泄露和跨站脚本攻击的漏洞

    2024年02月05日
    浏览(38)
  • 读程序员的README笔记11_软件交付(下)

    1.3.5.1. 通过持续交付,人力被完全从部署环节中移除 1.3.5.2. 打包、测试、发布、部署,甚至展开环节都是自动化的 1.3.6.1. Puppet、Salt、Ansible和Terraform等现成的解决方案可以与现有的工具集成,并且它们是专门为了自动化部署而设计的 1.4.4.1. 只需再次指向旧的版本 1.5.1.1. 

    2024年02月04日
    浏览(48)
  • 读程序员的README笔记10_软件交付(上)

    3.1.1.1. 打包一个构件称为发布 3.1.3.1. 部署的软件还不能被用户访问 3.1.3.1.1. 只是被安装了而已 3.1.3.2. 一旦部署,软件就会通过将用户转移到新的软件上而进行展开 3.1.4.1. 交付过程是更大的产品开发周期中的一部分 6.10.2.1. 每季度或每年发布一次

    2024年02月04日
    浏览(140)
  • 读程序员的README笔记01_学习如何学习

    6.3.2.1. 错误是不可避免的。成为一名软件工程师的路途艰辛,我们有时会失败 6.5.4.1. 代码从不说谎。注释有时却会。 6.5.4.1.1. Code never lies. Comments sometimes do 6.5.4.1.2. 去读源代码,因为它并不总是与设计文档相吻合 6.5.4.1.3. 不要只读你自己的代码库,还要去阅读高质量的开

    2024年02月05日
    浏览(36)
  • 读程序员的README笔记04_防御式编程

    1.2.1.1. 切记让你的代码安全而有弹性 1.2.1.2. 编写拥有良好防御性的代码是一种对那些运行你的代码的人(包括你自己!)富有同情心的表现 1.2.1.3. 防御性的代码较少发生故障,就算它发生故障,也更有可能恢复 1.2.1.4. 安全的代码利用编译时的校验来避免运行时的故障,使

    2024年02月05日
    浏览(37)
  • 读程序员的README笔记18_职业生涯规划

    3.1.5.1. 他们的工作职责之一是管理他们的团队,而管理的一部分就是对你投入时间 3.1.5.2. 对管理者而言,反复取消一对一面谈可以是一个有价值的信号 3.3.2.1. 每个目标都附有3到5个关键结果,它们是标志着目标达成的具体指标 3.3.2.2. 不要把关键结果变成待办事项清单 3.

    2024年02月04日
    浏览(37)
  • 读程序员的README笔记13_技术设计流程(上)

    3.4.1.1. 外界干扰是深度工作的“杀手” 3.4.1.2. 避免所有的交流方式 3.4.1.2.1. 关闭聊天 3.4.1.2.2. 关闭电子邮件 3.4.1.2.3. 禁用电话通知 3.4.1.2.4. 换个地方坐 3.4.2.1. 有形产出是一份设计文档 4.2.3.1. 如果有一个以上的问题,询问哪些问题是最优先的 4.3.7.1. 注意与外人交流时不

    2024年02月04日
    浏览(52)
  • 读程序员的README笔记14_技术设计流程(下)

    1.4.2.1. 该项目将需要至少一个月的工程时间 1.4.2.2. 变更将对软件的扩展和维护产生长期的影响 1.4.2.3. 变更将显著影响其他团队 1.5.2.1. 设计文档是一种工具,可以帮助你思考、获得反馈、让你的团队了解情况、培养新的工程师,并推动项目规划 1.5.5.1. 阅读大量的设计文档

    2024年02月04日
    浏览(31)
  • 读程序员的README笔记05_日志、监控与配置

    6.1.1.1. 测量的是某个事件发生的次数 6.1.1.2. 通过使用计数器获得缓存命中数和请求总数,你就可以计算出缓存命中率 6.1.2.1. 一个基于时间点的测量值 6.1.2.2. 既可以上升又可以下降 6.1.3.1. 根据事件的大小幅度分成不同的范围 6.1.3.2. 每一个范围都会有一个计数器,每当某

    2024年02月05日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包