在功能修改数据库时,是否可以使用功能标志/切换?

2022-09-04 21:04:58

在考虑在应用程序中使用功能切换时,这个问题最让我感到困惑。大多数功能都需要对数据库进行一些更改。然后如何实现功能标志,以便能够顺利地恢复数据库更改以及打开/关闭功能切换?特别是当使用一些数据库迁移工具时,如flyway或lquibase。

让我们举个例子。例如,我有简单的表播放列表,带有Id,名称列。我想添加在应用程序中向播放列表添加描述的功能。需要更改数据库表。添加了新列。列值不是必需的。到目前为止很简单。一段时间后,功能将从生产中关闭。解决方案非常简单但很混乱 - 我们可以在数据库中保留列,并且不再在代码中使用它。迁移工具以增量方式工作,因此当我关闭功能切换时,我看不到任何选项可以恢复到以前的数据库状态(或者我错了吗?更难的例子是当字段需要是强制性的。然后我不能只把那个字段留在db中。它将向后不兼容。那么那又是什么呢?如何处理这种情况?我认为这是很常见的情况。

此外,即使对 db 稍有更改,该类的应用程序模型也会更改。(假设使用某些 ORM)。这并不像用策略模式取代实现那么容易。除非您为ORM模型的使用提供了很多抽象。因此,添加这样的功能标志似乎非常复杂。任何人都可以帮助我理解它是如何使用功能图格尔的?或者也许有人有完整的例子来展示?在 Java 中首选


答案 1

功能切换是一种在不更改代码的情况下更改行为的方法 - 这意味着它们也不与数据库架构更改相关联。关闭切换应该执行可逆操作,例如从 UI 中隐藏字段,而不是像删除数据库列那样永久执行操作。考虑到这一点,您的示例将如下所示:

  1. 发布播放列表的 v1
  2. 在 v2 中,为说明添加 UI,但被功能标志禁用。迁移数据库以添加新的描述列。船。
  3. 启用功能标志。用户现在可以使用说明
  4. 禁用功能标志。用户无法使用描述,但它仍在应用程序和数据库中
  5. 在 v3 中,删除休眠的 UI 元素和逻辑。迁移数据库以删除不需要的描述列。船。

答案 2

同时支持同一系统的多个版本是这个问题的根源,也是我积极思考的问题。让我们一次只走一块!

什么是功能切换?

对不起,其他答案!功能切换只需要做一件事:将功能发布与部署分离。对于任何任意更改,切换如何执行此操作是一个棘手的问题,正如这个问题所标识的那样。

通常,为切换供电的系统必须满足两个条件才能被视为完整:

  • 向后兼容性。无论此切换的状态如何,较旧的功能仍必须正常工作。这包括此功能的旧行为!
  • 向前兼容性。无论此切换的状态如何,新功能都必须正常运行。

对于任何非平凡的更改,这是...挑战。无论如何,这是一个词


推荐