首页 > 编程语言 >读程序员的README笔记17_构建可演进的架构(下)

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

时间:2023-12-21 22:22:36浏览次数:28  
标签:1.6 17 数据库 兼容 程序员 API README 2.4 schema

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. 图

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

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

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

2.3.3.2. 图

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

标签:1.6,17,数据库,兼容,程序员,API,README,2.4,schema
From: https://www.cnblogs.com/lying7/p/17910680.html

相关文章

  • [CF17E] Palisection 题解
    [CF17E]Palisection题解思路直接统计相交的字符串很难数,考虑正难则反。用总共的回文串对数减去相离的回文串个数。设总共有\(tot\)个回文串,用manacher跑出来每个位置的最大回文半径后,使用差分的技巧保存两个数组:\(f_i\)表示以\(i\)为开头的回文串个数,\(g_i\)表示以......
  • 为什么程序员会35岁失业?核心原因:一年工作经验用十年!
    前言分享一下身边朋友的亲身经历,也浅浅的安慰一下那些被优化之后,找不到工作的朋友的受伤的心灵,因为你不是一个人!!!(下面由第一人称描述这个故事)距离过年还有三个月了,在这个节骨眼上我失业了。在广州失业已经一个月了,压力大的睡不着,每天梦里都在不停的浏览招聘网站。今天到了一家公司去......
  • 临近年末,整理了一份 Android 程序员必看的面试合集
    前言总体来说,面试一般都是基于你的简历来进行的,一般先考察你的基础,然后考察你知识体系的完备程度,接着会考察你的极限,最后还会考察一些软技能,比如你的学习能力、协作能力、沟通能力、分析解决未知问题的能力、抗压能力等。个人心得凡事预则立,不预则废准备周期面试之前,最好先系统的复......
  • [Codeforces] CF1817A Almost Increasing Subsequence
    CF1817AAlmostIncreasingSubsequence题意给定长度为\(n\)一个序列\(a\)以及\(q\)次询问,每次询问给出\(l\)和\(r\),找出序列\(a\)在\([l,r]\)内最长的几乎递增子序列。对于几乎递增的定义:如果一个序列中不存在连续的三个数\(x\),\(y\),\(z\),使得\(x\gey\ge\......
  • Safari 17信任站点修改造成的工商银行网银控件无法正常使用
    MacOS14.1中,Safari浏览器版本17.1,变更了信任站点流程。在工商银行使用JSP技术开发的网页上存在点击“在此网站上启用”但是检测不到扩展已安装的问题。原因工行个人网银登录网⻚使用jsp开发,⻚面情况非常复杂,嵌套了多个不同网址。通过日志可以发现还请求了epass.icbc.com.......
  • 实验七 周天意 202383290417
    实验七1.实验任务1:文本文件格式化读/写验证性实验。task1_1.c把程序中的图书信息数据,写入文本文件data1.txt中task1_2.c从文件data1.txt读入数据,并在屏幕上打印输出在C编程环境下,依次输入task1_1.c和task1_2.c,结合程序运行结果,理解代码,掌握文件打开/关闭、格式化读写操作......
  • 10.17
    一个程序如果碰到了异常不处理,程序就会立即停止,异常处理就是在异常发生的情况下启动类似于备用方案使程序继续运行Java中的异常捕获结构由try,catch,finally三部分构成,其中,try和catch是必须同时存在的。try中的代码就是可能存在异常的代码,catch中的代码就是try中有异常时的执行方......
  • 程序员必知!开放封闭原则的实战应用与案例分析
    开放封闭原则是面向对象设计中的重要原则之一,它要求软件实体(类、模块、函数等)应该对扩展开放,但对修改关闭。这意味着当需要添加新功能时,不应该修改现有的代码,而是应该通过扩展来实现。这可以通过使用接口、抽象类和多态等机制来实现,从而使系统更加灵活和可扩展。定义开放封闭......
  • 大二打卡(11.17)
    今天做了什么:早上七点,昨天老姐说九点开席,我寻思我直接睡到八点,洗漱啥的半个小时,这不正好,结果炮仗声七点多就给我闹醒了,一堆不认识的亲戚开始上楼下楼,我躲在最深处的我的卧室根本不敢出去,谁也不认识,都不知道该怎么称呼,老爸老妈老姐都在忙,不躲着干嘛啊,过了会儿,八点多快九点了,表哥来......
  • 11/17
    又是一周五.Javaweb中的四大域对象:1、page:当前页面有效2、request:当前请求有效3、session:当前会话有效4、application:当前应用有效el表达式获取数据,会依次从这4个域中寻找,直到找到为止JSTL标签需要导入相关导包c:if标签——来完成逻辑判断,替换Javaifelsec:forEach标签......