我有多个运行的微服务A
实例,除了将数据转储到数据库并将数据从那里提供给其他服务外,什么也不做。
我正在使用spring的CrudRepository
接口来自动获取一个已实现了像save()
这样的sql方法的bean。
因此,微服务B
将通过负载均衡器发送一个序列化对象,以保存到A
的一个实例中,然后将其保存为一个oracle数据库(由服务{{1的所有实例共享) }})。当A
的2个实例尝试同时访问oracle数据库时,我是否要小心?
而且,如果我只有1个A
实例和2个A
实例试图同时将序列化对象发送到B
会发生什么情况?他们其中之一必须自动等待还是我必须以某种方式控制它?
感谢您的帮助
答案 0 :(得分:2)
在深入细节之前;我只想非常清楚地表明,像oracle这样的企业数据库被设计为可以同时执行数百项工作……因此绝对不需要一次只在您的应用程序中做一件事情。同样,在许多地方,微服务用于并行处理每秒数千个请求。
当A的2个实例尝试同时访问oracle数据库时,我是否要小心?
这完全取决于您对数据库运行的操作以及执行方式。如果您使用数据库事务,则即使并行执行复杂的多语句工作流也可以被隔离/安全(实际上这非常正常)。
但是...如果我针对您的微服务发送了两个并行请求,并且导致两个线程(无论哪个应用程序)试图在同一张表中创建相同的对象,那么其中一个就会击败另一个将失败(假设您的数据库具有适当的约束)。
如果您允许服务A的一个实例具有多个数据库连接(甚至在使用库的情况下,则可能会发生这种情况)。
因此...如果您有多个与数据库通信的微服务实例,则可能无法轻松控制以确保它们不会尝试同时执行同一操作,因此您必须防御性编码,以检测和处理何时将重复数据发送到数据库等。此外,您还必须注意,数据库状态可能由于该应用程序之外的应用程序而改变,并且如果您定期缓存任何内容,则会重新加载数据。
而且,如果我只有1个A实例和2个B实例试图同时将序列化对象发送给A会发生什么情况?
通常,这是正常/预期的。这样做的想法是,由于加载而需要生成更多的微服务副本。通常,微服务无论是通过REST,套接字等方式一次处理多个请求。
因此,请求将不会等待...除非您故意将A的一个实例编码为具有单个数据库连接并处理队列中的请求。但这又取决于您的个人实施细节。