gpt4 book ai didi

java - 多个微服务一个数据库

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:07:45 25 4
gpt4 key购买 nike

我有多个正在运行的微服务 A 实例,它们除了将数据转储到数据库中并从那里提供给其他服务外什么都不做。

我正在使用 spring 的 CrudRepository 接口(interface)自动获取一个 bean,该 bean 实现了一些 sql 方法,例如 save()

因此,微服务 B 将通过负载均衡器发送一个序列化对象以保存到 A 的实例之一,然后将其保存到 oracle 数据库(由所有人共享服务实例 A)。当 A 的 2 个实例同时尝试访问 oracle 数据库时,我是否必须小心?

此外,如果我只有 1 个 A 实例和 2 个 B 实例,它们试图将序列化对象发送到 A,会发生什么情况同时?其中之一必须自动等待还是我必须以某种方式控制它?

感谢帮助

最佳答案

在深入细节之前;我只是想非常清楚地表明,像 oracle 这样的企业数据库旨在同时执行数百项操作……因此绝对没有必要一次只从您的应用程序执行一项操作。同样,微服务用于在许多地方每秒并行处理数千个请求。

当 A 的 2 个实例同时尝试访问 oracle 数据库时,我是否必须小心?

这完全取决于您对数据库运行的操作以及执行它们的方式。如果您使用数据库事务,即使是复杂的多语句工作流在并行完成时也可以是隔离的/安全的(这实际上很正常)。

但是...如果我针对您的微服务发送了两个并行请求,并且它导致两个线程(无论是哪个应用程序)试图在同一个表中创建相同的对象,那么其中一个会击败另一个和另一个会失败(假设您的数据库有适当的约束)。

如果您允许服务 A 有多个数据库连接(如果您使用的是库,这很可能发生),您的服务 A 的一个实例甚至可能会发生这种情况。

所以...如果您有多个微服务实例与数据库通信,您可能无法轻松控制以确保它们不会同时尝试做同样的事情,因此您必须防御性编码,用于检测和处理何时将重复数据发送到数据库等。此外,您必须意识到,数据库状态可能会由于该应用程序之外的应用程序而发生变化,如果您定期缓存任何内容,则会重新加载数据。

此外,如果我只有 1 个 A 实例和 2 个 B 实例同时尝试将序列化对象发送到 A,会发生什么情况?

通常这是正常的/预期的。这个想法是你产生更多的微服务副本,因为它们因负载而需要。通常微服务一次处理多个请求,无论是通过 REST、套接字等。

因此,请求不会等待...除非您有意将 A 的一个实例编码为具有单个数据库连接并处理队列中的请求。但同样,这取决于您的个人实现细节。

关于java - 多个微服务一个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52063123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com