如何提供具有不同数据库模式的多个版本的 API?

2024-01-19

在 Kevin Goldsmith 2015 年的演讲中Spotify 的微服务 https://youtu.be/7LGPeBgNFuU?t=925(从 15:25 - 17:43),他提到,当他们创建新版本的 API 时,他们只是创建一个新服务器,并保持旧服务器与旧版本一起运行,只要仍有客户端调用它(在本例中,是嵌入了 Spotify 的智能灯)。

我很困惑他们如何能够在可能的几年内维护和提供旧版本,而在这段时间内肯定会有数据库架构更改?

我可以看到一些可能的解决方案,但没有一个看起来很合理:

  1. 在所有版本中使用相同的数据库,仅添加新表和新的可为空字段。切勿删除字段、重命名字段、将字段设置为不可空、删除表或重命名表。
  2. 每个版本使用不同的数据库,将每个版本的数据分开。
  3. 每个版本使用不同的数据库,将每个版本的数据分开,但编写一种方法将请求从一个版本迁移并传递到另一个版本,以便每个版本接收带有该版本的有效参数的请求。

解决方案 1 听起来会产生太多的代码味道,到处都是遗留代码(在我看来,Kevin 似乎表明他们肯定不会这样做)。

解决方案 2 听起来像是一场噩梦,无法从其他服务或报告中提取数据。如果您想要的实体信息位于另一个版本的数据库中,而不是您请求的数据库中,该怎么办?

解决方案 3 听起来更像是一场噩梦,因为您必须编写代码来将您的版本的请求迁移到您的版本之上和之下。这意味着您在创建新版本时不能仅保留现有(当前正在生产的版本)版本,因为您需要添加迁移以向前和向后移动请求,以便所有版本都收到请求的正确参数。

希望我只是在这里错过了一些简单的东西,并且有一个神奇的解决方案可以使这个问题变得更容易,但我真的不明白他们如何实现这一点?

Thanks!


我不知道 Spotify 内部是如何做到这一点的。

从他谈论的方式来看,我不确定这些微服务是否存储了任何数据。我感觉它们本质上是其他东西(可能是内部服务层)之上的表示层。

如果一个微服务可以有多个活动版本,并且它也是某些数据的所有者,那么可能会发生以下两种情况之一:

  • 架构一致性应用于服务级别,如果对架构进行更改,则必须在所有历史版本中进行更新。在独立部署多个版本的情况下,这将需要在架构更改时部署所有版本(他并没有像这样说,但这就是我一直进行版本控制的方式)
  • 每个版本都拥有数据的独立副本。为此,您确实需要在系统中拥有一个发布/订阅模型,并根据某种消息执行所有修改。 (对我来说,这似乎效率很低,除非其流失率非常低,但也许在这种规模上它可能是有意义的,还存在如何用数据启动新版本的问题)

我认为运行一个模式并且从不改变它不会真正长期有效。事情在变化,变化是必要的。微服务/SOA (IMO) 的最大好处之一是,由于域较小且包含在内,因此更改更容易。由于代码量很低,您可以相当安全、快速地完成诸如完全更改存储机制(甚至可能更改为新型存储)之类的事情。

我的文章中有关微服务版本控制的更多想法,微服务版本控制;如何在不破坏内容的情况下进行重大更改 http://blog.staticvoid.co.nz/2017/microservice_versioning;_how_to_make_breaking_changes_without_breaking_stuff/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何提供具有不同数据库模式的多个版本的 API? 的相关文章

  • .Net 将 NULL 值从变量值插入 SQL Server 数据库

    也有类似的问题 但答案不是我想要的 如果引用为 NULL 或尚未分配值 我想将 NULL 值插入 SQL Server 数据库 目前我正在测试 null 它看起来像 String testString null if testString
  • 创建用于插入、修改和删除的数据库触发器的正确​​语法是什么

    我有一个看起来像是 SQL Server 中数据库触发器的基本场景 但我遇到了一个问题 我有桌子Users 身份证 姓名 电话等 我有桌子用户历史记录 id user id 操作 字段 时间戳 我想要一个数据库触发器 可以随时插入 更新或删
  • 仅包含主键和外键的数据库表的用途是什么?

    我试图理解一个简单的音乐数据库设计 有些表只包含外键和主键 我不确定如何以及何时使用这些表或向其中插入什么内容 设计如下 Track id primary key title duration live performance true o
  • 何时使用 JCR(内容存储库)而不是其他选项?

    我正在尝试评估内容存储库 JSR283 http www jcp org en jsr detail id 283 like 长耳大野兔 http jackrabbit apache org and 模式形状 http www jboss
  • 使用 versioneer 和 GitHub 更新版本号

    我在用versioneer适用于多个 GitHub 托管的 Python 项目 看来 versioneer 已安装并且工作正常 我可以调用project version 但是我忘记了如何更新版本号的过程 如果有什么东西在setup cfg
  • 使用 SQL Server 作为具有多个客户端的数据库队列

    给定一个充当队列的表 如何最好地配置表 查询 以便多个客户端同时处理队列 例如 下表指示了工作人员必须处理的命令 当worker完成后 它会将处理后的值设置为true ID COMMAND PROCESSED 1 true 2 false
  • 如何在javascript中设置从数据库输入的最大数量?

    我希望根据数据库中的数量设置 输入类型 数字 中输入的最大数量 目前 我正在尝试让它在数据最大的基础上工作 然后再尝试从数据库中获取最大值 但它似乎无法工作 之前已经在这里问过 但我仍然无法理解 在 php javascript 中设置数据
  • 每个“容器”类一个 DAO 还是每个表一个 DAO?

    我有一个 容器 类 其中的字段包含在多个数据库表中 并且我使用 DAO 模式来访问数据 问题是 我应该为这个 容器 类创建一个 DAO 还是每个表都有一个 DAO 并合并它们的数据更好 您应该根据应用程序的需求而不是数据库的布局来设计 DA
  • 一组记录中某些值相同的唯一约束

    DBMS MS Sql Server 2005 标准版 我想创建一个表约束 以便只有一个记录在表的子集中具有特定值 其中行共享特定列中的值 这可能吗 Example 我的 myTable 中有一些记录 其中有一个非唯一的外键 fk1 以及一
  • 如何使用 django 更新会计应用程序中的余额?

    我正在学习 Django 尝试制作一个会计应用程序来跟踪我的开支等 我使用两种模型创建数据库 一种用于帐户 一种用于操作 但我不知道如何在每次操作时更新我的 余额 我在想 也许每次我保存一个新操作时 我都会通过覆盖操作模型的保存方法来更新余
  • InnoDB 或 MyISAM - 为什么不两者都使用呢?

    我读过各种关于两者之间哪个更好的主题InnoDB and MyISAM 看来争论的都是使用还是其他 根据表的不同 是否不能同时使用两者 这样做会有什么缺点 据我所知 发动机可以在CREATE TABLE命令 因此 某些经常读取的表可以设置为
  • Firebird数据库模式/数据差异工具

    RedGate http www red gate com为 Microsoft SQL Server 制作一个工具 允许您捕获两个数据库之间的差异 它生成更新数据库模式所需的脚本 同时保留数据 我需要为 Firebird 数据库找到这样的
  • Docker-compose v3 不持久保存 postgres 数据库

    在 docker compose v3 容器关闭并重新启动后 我很难保留 postgres 数据 这似乎是一个常见问题 但经过大量搜索后我无法找到有效的解决方案 我的问题与这里类似 如何使用卷将数据保存在 dockerized postgr
  • 如何对 mongodb/mongoid 脚本进行基准测试,以比较两种不同的查询技术

    您对如何测试两种不同的 mongoid mongodb 查询实现的性能有什么建议吗 要比较的实现与以前的相关 问答 https stackoverflow com questions 10121977 extracting modellin
  • 产品和变体 - 设计数据库的最佳方法

    描述 商店可以有产品 鞋子 T 恤等 每个产品可以有许多变体 每个变体可以有不同的价格和库存 例如T 恤有不同的颜色和尺寸 颜色 蓝色 尺寸 L 价格 10 美元 库存 5 颜色 蓝色 尺寸 XL 价格 10 美元 库存 10 颜色 白色
  • 如何在Oracle数据库11g中创建新模式/新用户?

    我已经申请了一家公司的实习机会 作为一个问题 他们要求我为他们的公司创建一个具有一定要求的架构 并将DDL文件 我已经安装了 Oracle 数据库 11g Express 版本 但如何在 Oracle 数据库 11g 中创建新架构 我在网上
  • 如何在数据库中对 (Java) 枚举进行建模(使用 SQL92)

    您好 我正在使用名为 性别 的列对实体进行建模 在应用程序代码中 性别应该是一个 Java 枚举类型 有 2 个值 男性和女性 知道作为数据类型的枚举不是通用 SQL 语言 92 的一部分 您将如何建模它 数据模型必须是可移植的 以便由多个
  • 术语 SSTable 和 LSM Tree 之间有什么区别

    这两个术语可以互换使用吗 我读过有关 SSTable 工作原理的文章 通常文章都会开始提到 LSM Tree 然而 它们似乎是同一件事 我什么时候应该使用一个术语而不是另一个术语 对于凡人来说 SSTables 和 LSM Trees 的最
  • 如何记录数据库代码以查看数据库对象之间的依赖关系? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想为我的宠物项目编写文档 我的 PostgreSQL 数据库中有 30 个表 近 50 个视图和大约 30 个函数 存储过程 我想看
  • 将 Access 数据库转换为 SQL Microsoft DTS - 数据类型“130”不在映射文件中

    我正在尝试将大型 Access mdb 数据库导出到 SQL Server 数据库 但遇到了 Microsoft DTS 无法识别 Access 数据库中特定类型字段的数据类型的问题 我查看了相关的访问表 它们被设置为长度为 1 的 文本

随机推荐

  • Linux 下的 Ruby 不区分大小写地打开文件

    有没有办法在Linux下的Ruby中不区分大小写地打开文件 例如 给定字符串foo txt 我可以打开该文件吗FOO txt 一种可能的方法是读取目录中的所有文件名并手动搜索所需文件的列表 但我正在寻找一种更直接的方法 一种方法是编写一个小
  • 将 EAR 模块转为 OSGI 包的正确方法

    有必要将 EAR 的一部分 即战争 转变成 OSGI 包并保留其互操作性 Glassfish 3 0 1 已经有了osgi web container模块 我成功部署了独立的 OSGI war 但如果是前企业战争 我觉得有点困难 我该如何处
  • solr 地理层次结构

    我一直在试图找出一种在 solr 中实现层次结构分面的方法 但不知道在我的情况下如何做到这一点 我读过几篇关于在 solr 中进行层次结构的文章以及补丁 64 和 792 中的解决方案 我遇到的主要问题是我的实体可以属于层次结构的多个分支
  • R ggplot2 - 简单绘图 - 无法指定对数轴限制

    我正在尝试在 R 中的 ggplot2 中创建一个简单的密度图 这是我的代码 效果很好 d lt ggplot result aes x result baseMeanA d geom density colour darkgreen si
  • 如何将 java.time.Instant 格式化为本地时区的字符串?

    如何格式化javax time Instant http threeten sourceforge net apidocs 2011 01 07 javax time Instant html作为本地时区的字符串 以下是本地翻译的Insta
  • RadDateTimePicker + 用于数据输入的掩码

    要求 允许用户以 格式输入日期 同时还可以从 DatePicker 中选择日期 假设输入的所有年份都是 2000 年之后 例如 用户输入 050513 它会变成 5 5 2013年 或者 如果他们从 DatePicker 中选择它 则提供相
  • Scalatest 和 Spark 给出“java.io.NotSerializedException:org.scalatest.Assertions$AssertionsHelper”

    我正在借助 测试 Spark Streaming 应用程序com holdenkarau spark 测试基地 and 分级测试 import com holdenkarau spark testing StreamingSuiteBase
  • Rails 包含范围

    我有一个名为 Author 的模型 一个作者有很多文章 文章有一个名为 published 的范围 它的作用是 where published true 我想加载作者以及已发表的文章 我试过 Author includes articles
  • Pandas 的部分总和和小计

    I m trying to achieve a table with subtotals as shown here http pandas pydata org pandas docs stable cookbook html pivot
  • pandas 行值到列标题

    我有一个像这样的数据框 df pd DataFrame id1 1 1 1 1 2 2 2 id2 1 1 1 1 2 2 2 value a b c d a b c id1 id2 value 0 1 1 a 1 1 1 b 2 1 1
  • 使用 Google Maps API 绘制地图路径/航点并播放路线

    我试图在播放映射路线时绘制访问的路径 如下例所示 加载地图时 我希望绘制的点 A B C D E 然后 F 依次连接 我已成功绘制了这些点 但无法将这些点逐个动态链接 这是我的代码
  • UICollectionView 单元格视图重叠

    我的单元格重叠 如下所示 my cellForItemAtIndexPath是这样的 func collectionView collectionView UICollectionView cellForItemAtIndexPath in
  • 如何在 Windows 窗体应用程序中构建启动屏幕?

    我需要在应用程序启动时显示启动画面几秒钟 有人知道如何实施吗 将非常感谢您的帮助 首先 将启动屏幕创建为无边框 不可移动的形式 并在其上显示图像 设置为最初显示在屏幕中央 并按您想要的方式着色 所有这些都可以在设计器内部设置 具体来说 您想
  • PHP Amazon S3 上传和标签

    我正在编写一个视频共享网站 我正在使用 S3 来存储和提供视频 我已经在 MySQL 数据库中为视频编写了标签 但我发现 S3 支持上传文件上的设置标签 这是我用来上传文件的代码 try Create a S3Client s3Client
  • 返回Json,但其中包含反斜杠“\”,这是我不想要的

    我使用 MVC4 web api c 并且想要返回 Json使用 Json net 问题是它带有 反斜杠 我还将此代码添加到 Global asax 中 GlobalConfiguration Configuration Formatter
  • WPF 根据条件隐藏数据网格中的行

    我需要根据数据网格中的参数和值隐藏数据网格中的行 我想做这样的事情 foreach System Data DataRowView dr in myDataGrid ItemsSource Logic to determine if Row
  • opengl中使用哪种图像类型

    当使用 OpenGL 为 Android 编程时 我似乎可以为图像使用 BMP JPG 和 PNG 文件类型 哪一个 如果有的话 最好 非常感谢 这不是 OpenGL 的问题 因为一旦你有了Graphics Bitmap对象来源很大程度上无
  • yarn-client模式和yarn-cluster模式的区别

    我在纱线客户端模式和纱线集群模式上运行类似的代码时遇到了一些问题 当我在客户端模式下运行我的代码时 它可以完美执行 但在纱线集群节点上运行时会失败 它抛出文件非文件异常 指出找不到 pyspark zip 文件 对此的任何见解都会有所帮助
  • Python 中与语法、标记、词干和词义消歧有关的一些 NLP 内容

    背景 TLDR 为了完成而提供 寻求有关奇怪需求的最佳解决方案的建议 我是一名大学四年级的 文学 学生 只有我自己的编程指导 我对Python有足够的能力 所以我不会在实现我找到的解决方案 大多数时候 并在它们的基础上进行开发时遇到麻烦 但
  • 如何提供具有不同数据库模式的多个版本的 API?

    在 Kevin Goldsmith 2015 年的演讲中Spotify 的微服务 https youtu be 7LGPeBgNFuU t 925 从 15 25 17 43 他提到 当他们创建新版本的 API 时 他们只是创建一个新服务器