存储过程是否被认为是微服务体系结构中的不良实践?
以下是我的想法:
对此有什么想法吗?
发布于 2019-09-16 08:12:06
没有任何东西明确禁止或反对在微服务中使用存储过程。
免责声明:我不喜欢开发人员POV中的存储过程,但这与微服务没有任何关系。
存储过程通常在单核数据库上工作。
我觉得你是在屈服于逻辑谬误。
存储过程现在正在下降。大多数仍在使用中的存储过程来自一个较旧的代码库,该代码库一直保存在其中。那时,单块数据库也比微服务流行的时候普遍得多。
存储的procs和单块数据库都发生在旧的代码库中,这就是为什么您经常看到它们在一起的原因。但这不是因果关系。您不使用存储的进程,因为您有一个单一的石器时代数据库。您没有单块数据库,因为您使用的是存储过程。
大多数关于微服务的书推荐每个微服务一个数据库。
没有任何技术原因可以解释为什么这些较小的数据库不能有存储过程。
正如我所提到的,我不喜欢存储过程。我觉得它们很烦琐,对将来的维护也很难。我确实认为,在许多小型数据库上扩展sprocs进一步加剧了我已经不喜欢的问题。但这并不意味着这是不可能的。
同样,大多数微服务体系结构书籍都指出,它们应该是自主的和松散耦合的。使用专门用Oracle编写的存储过程,将微服务与该技术紧密结合在一起。
另一方面,无论您的微服务使用什么ORM,都可以使用相同的论点。也不是每个ORM都支持每个数据库。耦合(特别是它的紧密性)是一个相对的概念。这是一个尽可能宽松的问题。
无论微服务,Sprocs在一般情况下都会受到紧耦合的影响。我建议总体上不要使用sprocs,但不是特别因为您使用的是微服务。这和以前的观点是一样的:我不认为sprocs是可行的(一般情况下),但这可能只是我的偏见,而且与微服务无关。
大多数msa书籍(我已经读过)都建议微服务应该面向业务(使用ddd设计)。通过将业务逻辑移动到数据库中的存储过程中,情况不再是这样了。
这一直是我对sprocs的主要抱怨:数据库中的业务逻辑。即使不是意图,它往往总是以这样的方式结束。
但是,不管你是否使用微服务,这种抱怨依然存在。它看起来是一个更大的问题的唯一原因是因为微服务推动了整个体系结构的现代化,而sprocs在现代体系结构中不再那么受欢迎。
发布于 2019-09-16 10:07:17
要编写软件,需要将
。
至少对于正在开发的编程语言所提供的运行时环境。
但更普遍的是,您会发现您的微服务与几种技术紧密耦合在一起:
这是一种简单的微型服务。
存储过程只是您可以选择使用或不使用的另一种技术。它不会神奇地使您的代码变得单一,或微。
然而,它的实质是:
每一个都是真正的代价。在某些情况下,成本是合理的,而在另一些情况下则不然。
您将通过托管脚本引擎来支付几乎相同的成本。唯一的简化是您可以选择与宿主语言相同的编程范式。
将业务规则迁移到数据库中是错误的做法。不是因为存储过程。
这是一个糟糕的实践,因为数据库和业务逻辑在不同的剪切级别上运行。
如果业务逻辑分布在剪切层上,特别是分布到一个较慢且寿命更长的层,它将产生对更改的抵抗。这不一定是坏事。毕竟,只有一个数据库中的业务逻辑为零,那就是一个三重存储。
仅仅指定表模式的行为就是将业务逻辑移动到数据库中。
您正在努力使用适当的工具来解决适当的问题,而不需要太多的工具,也不会使它太难解决,以便制定和维护解决方案。
这可不容易。
但是,让我们想想不可思议的是,您将如何维护跨几种语言的业务逻辑?
但这也是有代价的。
发布于 2019-09-16 18:09:37
在开始我的回答时,我会说我实际上维护了几个使用存储过程的微服务。而且,在我的职业生涯中,我已经写了很多存储过程,我绝对同意,如果使用不当,事情会变得非常非常糟糕。
所以简单的回答是,不,存储过程在微服务体系结构中本质上并不坏。但你需要明白:
这些是存储过程的一些用途,我认为它们通常是值得的:
一般来说,我建议你先尝试一下意见,必要时才诉诸程序。设计良好的视图实际上可以充当API,抽象出底层表如何被查询的细节。在某些情况下,使用存储过程增强API (视图)是有意义的。甚至可以直接从SQL查询发出JSON,从而绕过将数据从查询结果映射到应用程序的数据模型。这是否是一个好主意是由你根据自己的需要来决定的。
因为您应该已经在管理数据库资源(模式、权限等)通过一些自动化工具,不,存储过程本质上并不是对微服务不利的。
https://softwareengineering.stackexchange.com/questions/398436
复制相似问题