将数据访问层与服务层分开是否很好[关闭]

Posted

技术标签:

【中文标题】将数据访问层与服务层分开是否很好[关闭]【英文标题】:is it good to make Data Access Layer a separate layer from service layer [closed]将数据访问层与服务层分开是不是很好[关闭] 【发布时间】:2017-07-26 22:10:54 【问题描述】:

我对我正在使用的架构有疑问。

我们有一个后端restful服务,一个数据层(由python eve实现,也是一个restful服务)和数据库。数据(访问)层本身就是一个独立的restful api。

在我们的后端服务应用程序中,我们有一个自定义的 python eve 存储库,它调用数据(访问)层,然后数据层将查询数据库调用所要求的任何内容。

将其分开的原因,一个是我们希望将数据逻辑(查询逻辑)与我们的业务逻辑(后端服务)隔离开来。

成本是显而易见的,每一个查询再增加一层,又一轮 I/O。

任何有架构经验的人都可以告诉我这个单独的数据访问层是否是一个好的做法,为什么?

【问题讨论】:

【参考方案1】:

看看您正在讨论的架构,您的项目必须足够大,以证明其开发成本是合理的。对于小型项目,这种架构将是多余的。

假设您的项目足够大,是的;将 DAL、BLL 和应用层分开总是好的。参考this和this。

好处是干净的分离,可以提高理解,让您控制每个部分并降低维护成本。

另一方面,正如您所说,成本是显而易见的(另一层,另一轮 I/O)。是的;这就是为什么我的第一段讨论了项目的规模。在大型项目中,这是一种权衡;您正在选择一个而不是另一个。

在大型项目中,主要目标应该是 IMO 的可维护性。了解premature optimization is the root of all evil。因此,您从良好的可维护架构开始。每种技术都推荐了提高性能的基本规则;最初实施它们。如果您在一段时间内发现任何性能问题,请查找并修复它。事实上,由于分层,很容易发现瓶颈。

还有其他好处。您可以单独对每一层进行单元测试。您可以独立处理每一层,以提高性能、转移技术等。调试太容易了。

【讨论】:

【参考方案2】:

基本上设计一个微服务架构对于大型项目是有好处的,否则会浪费资源。但是您需要在创建单独的微服务之前考虑一些事情,因为存在复杂性,例如 IPC 的开销时间、分布式数据、分发不是免费的,更改数据不再容易,因为它需要跨不同的服务进行协调,这些服务是该微服务(在您的案例数据访问层)。由于 IPC 的数量可能会导致大量的开销时间。因此,API 的设计需要使其不会显着增加开销时间。数据分布在各个服务之间,因此需要妥善处理。

是的,这是一个很好的做法,原因很简单,您正在对服务进行抽象。这样做可以独立开发,因为这些服务是松散耦合的。即使数据库需求发生变化,其他服务也不必为此烦恼。意思是说,即使整个项目从 mysql 迁移到 Cassandra 或 Hadoop,只需要更改 DAA(数据访问安排层),其余的服务将保持不变。而且调试和测试这些服务也容易得多。

因此,在选择微服务架构(一个具有多个服务来分离业务和数据逻辑的服务)或单片架构(一个包含所有逻辑的服务)时总是需要权衡取舍。因此,基本上,如果项目很大并且您使用的是单体架构,那么它可能会将您带入单体地狱。随着应用变得非常庞大,就像一团大泥球,快速、频繁和可靠的交付变得不可能,技术栈越来越过时,重写也不可行。

【讨论】:

以上是关于将数据访问层与服务层分开是否很好[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Spring数据访问和数据访问层与业务或服务层之间的交互

Spring数据访问和数据访问层与业务或服务层之间的交互

在 Delphi 中分离数据访问、业务逻辑和 GUI 的任何建议

DDD中的数据访问层设计

EntityManager 应该如何在一个很好的解耦的服务层和数据访问层中使用?

实现服务层方法的指南