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