美文网首页系统架构治理
系统设计中为什么要避免共享数据库

系统设计中为什么要避免共享数据库

作者: 踏浪听涛 | 来源:发表于2018-05-15 08:22 被阅读20次

    本文摘自sam newman 《微服务设计》

    目前为止,我和同事在业界所见到的最常见的集成形式就是数据库集成。使用这种方式时,如果其他服务想要从一个服务获取信息,可以直接访问数据库。如果想要修改,也可以直接在数据库中修改。这种方式看起来非常简单,而且可能是最快的集成方式,这也正是它这么流行的原因。

    图4-1展示了某商业系统的部分的应用级服务,其中用户注册服务直接使用SQL在数据库中创建用户。还可以看到,呼叫中心应用可以直接运行SQL来查看和编辑数据库中的数据。仓库应用通过查询数据库来显示更新后的客户订单信息。这是一种非常普通的模式,但实践起来却困难重重。

    图 4- 1: 使用数据库集成来访问和修改数据信息

    首先,这使得外部系统能够查看内部实现细节,并与其绑定在一起。存储在数据库中的数据结构对所有人来说都是平等的,所有服务都可以完全访问该数据库。如果我决定为了更好地表示数据或者增加可维护性而修改表结构的话,我的消费方就无法进行工作。数据库是一个很大的共享API,但同时也非常不稳定。如果我想改变与之相关的逻辑,比如说帮助台如何管理客户,这就需要修改数据库。为了不影响其他服务,我必须非常小心地避免修改与其他服务相关的表结构。这种情况下,通常需要做大量的回归测试来保证功能的正确性。

    次,消费方与特定的技术选择绑定在了一起。可能现在来看,使用关系型数据库做存储是合理的,所以我的消费方会使用一个合适的驱动(很有可能是与具体数据库相关的)来与之一起工作。说不定一段时间之后我们会意识到,使用非关系型数据库才是更好的选择。如果消费方已经和数据库具体技术非常紧密地绑定在了一起,那么能够轻易替换这个数据库吗?正如前面所讨论的,隐藏实现细节非常重要,因为它让我们的服务拥有一定的自治性,从而可以轻易地修改其内部实现。再见,松耦合。

    最后,让我们考虑一下行为。肯定会有一部分逻辑负责对客户进行修改。那么这个逻辑应该放在什么地方呢?如果消费方直接操作数据库,那么它们都需要对这些逻辑负责。对数据库进行操作的相似逻辑可能会出现在很多服务中。如果仓库、注册用户、呼叫中心都需要编辑客户的信息,那么当修复一个bug的时候,你需要修改三个不同的地方,并且对这些修改分别做部署。再见,内聚性。

    还记得前面提到过的关于好的微服务的核心原则吗?没错,就是高内聚和低耦合。但是使用数据库集成使得这两者都很难实现。服务之间很容易通过数据库集成来共享数据,但是无法共享行为。内部表示暴露给了我们的消费方,而且很难做到无破坏性的修改,进而不可避免地导致不敢做任何修改,所以无论如何都要避免这种情况。

    相关文章

      网友评论

        本文标题:系统设计中为什么要避免共享数据库

        本文链接:https://www.haomeiwen.com/subject/pdzsdftx.html