【问题标题】:Should you store current application state in a database?您应该将当前应用程序状态存储在数据库中吗?
【发布时间】:2014-09-11 19:23:54
【问题描述】:

我已经开始从事一个项目,其中 Postgres 数据库被用作系统架构中的一个组成部分。这迫使我放弃了我以前认为数据库很好,可以存储东西的观念。

有一个 API 可以将传入的请求转换为数据库查询/更新。这会导致数据库中的触发器随后通知另一个应用程序相应地更新实际系统。

对我来说,这一切似乎都是不必要的。这也是在一个相当系统关键的架构中,但我们无法保证了解底层系统故障,使其备份链,因为一切都是异步的。简而言之,我一点也不喜欢它。我的观点是我们应该立即使用 API 和底层系统之间的直接通信从头开始,只使用数据库来存储持久状态更新/用户信息等。

我真正在这里寻找的是有人在我最终与团队闹翻之前向我解释为什么我错了,但欢迎所有意见。

【问题讨论】:

  • 在不了解相关要求的情况下很难知道为什么它的架构是这样的。一定有某种原因——即使被误导了——为什么要这样做。

标签: database architecture state


【解决方案1】:

支持这种集成的唯一原因是它的成本低,特别是如果两个集成系统使用自己的专有技术相互交流不好。此外,数据库集成呈现出旧式集成。

您想要实现(或至少增加)的东西称为“自治”。这个话题太大了,但我会根据您的情况尝试强调最重要的事情。

  1. 触发器和存储过程几乎总是邪恶的。它总是导致数据库“逻辑泄漏”,从而导致业务逻辑和整个应用程序的可移植性和可维护性差。存储过程唯一可能有用的是提高性能。但是没有它们,有很多方法可以调整性能。
  2. 一旦您的应用程序通过 DB 连接,您就会处理它们之间的紧密耦合,因此它们彼此紧密依赖,因此两个应用程序的可维护性和可重用性都会受到影响。
  3. 通过以某种复杂方式通过 DB 连接应用程序,您将来可能还会遇到扩展问题。
  4. 使用 DB 解决方案来调用您正在处理的与技术耦合的事情,而这并不是为了做到这一点而设计的。因此,由于缺乏灵活性和未来可能的限制,这很糟糕。如果使用一些非标准化的专有工具和协议,效果会更差。

今天(企业)的最佳实践是使用完全自治的应用程序和应用程序(非集成)非共享数据库,通过标准化协议进行通信,可能通过一些可靠的中间件。它更昂贵,但它提供了很多好处(可扩展性、可维护性、灵活性等)。

要决定你是否真的应该重写一些东西,首先你需要估计成本和收益。如果它是一个工作正常的大型遗留紧密耦合组合,那么最好不要触摸它,而是在需要时创建类似 Facade 的包装器。

最后,

我真正在这里寻找的是有人向我解释我为什么 错了

我认为你没有错。

【讨论】:

    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    相关资源
    最近更新 更多