Java - 多个微服务共用一个数据库

4
我有多个运行着的微服务A实例,它们仅将数据转储到数据库中并从中提供给其他服务。我使用Spring的CrudRepository接口自动获取一个bean,该bean具有一些SQL方法(如save())的实现。
因此,微服务B通过负载均衡器向A的一个实例发送序列化对象以保存它们到Oracle数据库(由所有A服务实例共享)。当两个A实例同时尝试访问Oracle数据库时,我需要小心吗?
另外,如果只有一个A实例和两个B实例同时尝试将序列化对象发送到A,会发生什么?其中一个必须自动等待还是我需要以某种方式进行控制?
感谢您的帮助。

如果我只有一个A实例和两个B实例同时尝试向A发送序列化对象,会发生什么?在这种情况下,如果对象不同,则可以并行保存,因为插入操作不会锁定Oracle中的任何其他行。 - DEVAS
1个回答

3
在深入了解细节之前,我想明确一点:企业数据库(如Oracle)被设计为可以同时处理数百个任务...因此,从您的应用程序一次只做一件事情绝对不是必要的。同样地,许多地方使用微服务来并行处理数千个请求。
当两个A实例同时尝试访问Oracle数据库时,我需要小心吗?
这完全取决于您针对数据库运行的操作以及您如何执行它们。如果使用数据库事务,则即使在并行执行复杂的多语句工作流时,也可以隔离/安全地进行(这是非常正常的)。
但是...如果我发送了两个并行请求到您的微服务,并且结果是两个线程(无论是哪个应用程序)尝试在同一张表中创建相同的对象,则其中一个会比另一个快,而另一个则会失败(假设您的数据库具有适当的约束)。
即使您允许一个实例的服务A具有多个数据库连接(如果您使用库,则很可能),这也可能发生。
因此...如果有多个微服务实例与DB通信,则您可能无法轻松控制它们不同时尝试做相同的事情,因此您必须具有防御性编码,以检测和处理发送到DB的重复数据等。此外,您必须注意,由于此之外的应用程序而导致DB状态发生更改,并定期重新加载任何缓存数据。
此外,如果我只有一个A实例和两个B实例同时尝试将序列化对象发送到A,会发生什么?
通常这是正常/预期的。想法是根据负载要求生成更多的微服务副本。通常,微服务通过REST、套接字等方式处理多个请求。
因此,请求不会等待...除非您特意编写了一个具有单个数据库连接并且按队列处理请求的A实例的代码。但再次强调,这取决于您的个人实现细节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接