猿问

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

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

我正在使用 spring 的CrudRepository接口自动获取一个 bean,该 bean 具有几个 sql 方法,例如已save()实现。

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

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


HUH函数
浏览 606回答 1
1回答

杨魅力

在深入研究细节之前;我只想说清楚,像 oracle 这样的企业数据库旨在同时处理数百件事……所以一次只从您的应用程序做一件事绝对没有必要。类似地,微服务在许多地方用于每秒并行处理数千个请求。当 A 的 2 个实例尝试同时访问 oracle 数据库时,我必须小心吗?这完全取决于您对数据库运行的操作以及您如何执行它们。如果您使用数据库事务,即使是复杂的多语句工作流在并行完成时也可以被隔离/安全(实际上这很正常)。但是...如果我针对您的微服务发送了两个并行请求并且导致两个线程(无论哪个应用程序)尝试在同一个表中创建相同的对象,那么其中一个将击败另一个另一个会失败(假设您的数据库有适当的约束)。如果您允许服务 A 的一个实例具有多个数据库连接(如果您使用的是库,则可能会发生这种情况),这甚至可能发生在您的服务 A 的一个实例上。所以......如果你有多个微服务实例与数据库通信,你可能无法轻松控制确保它们不会同时尝试做同样的事情,所以你必须有防御性编码检测和处理何时将重复数据发送到 DB 等。此外,您必须意识到 DB 状态可能会由于此应用程序之外的应用程序而发生变化,如果您定期缓存任何内容,请重新加载数据。另外,如果我只有 1 个 A 实例和 2 个 B 实例尝试同时向 A 发送序列化对象,会发生什么?通常,这是正常/预期的。这个想法是你产生更多的微服务副本,因为它们是由于负载而需要的。通常微服务一次处理多个请求,无论是通过 REST、套接字等。因此,请求不会等待……除非您有意将 A 的一个实例编码为具有单个数据库连接并处理队列中的请求。但同样,这取决于您的个人实施细节。
随时随地看视频慕课网APP

相关分类

Java
我要回答