使数据访问层成为与服务层分开的层好吗

is it good to make Data Access Layer a separate layer from service layer

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

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

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

之所以要分开,一个是我们希望将数据逻辑(查询逻辑)与我们的业务逻辑(后端服务)隔离。

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

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

查看您正在讨论的体系结构,您的项目必须足够大以证明其开发成本合理。对于小型项目,这种架构会有点矫枉过正。

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

好处是清晰的分离可以增进理解,让您可以控制每个部分并降低维护成本。

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

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

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

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

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

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