在Microservices中使用共享读取数据库

在Microservices中使用共享读取数据库,microservices,Microservices,众所周知,在微服务中使用共享数据库不是一个好主意,但当我们需要另一个微服务中的数据时,我们应该使用RabbitMQ之类的消息代理。如果数据仅仅是为了构建一个新的物化视图而需要的,那么如果某种共享读取数据库可用,这不是更容易吗?或者我们应该读一读“你不应该在微服务之间共享数据库”,就像不共享可写或可读的数据库一样?在微服务中,没有正确或错误,只有最佳实践。微服务的目的是它们可以独立操作和工作。记住这一点,只要读取副本是独立运行的,并且仅用于创建物化视图,读取副本就可以了。如果主数据库出现故障,您的

众所周知,在微服务中使用共享数据库不是一个好主意,但当我们需要另一个微服务中的数据时,我们应该使用RabbitMQ之类的消息代理。如果数据仅仅是为了构建一个新的物化视图而需要的,那么如果某种共享读取数据库可用,这不是更容易吗?或者我们应该读一读“你不应该在微服务之间共享数据库”,就像不共享可写或可读的数据库一样?

在微服务中,没有正确或错误,只有最佳实践。微服务的目的是它们可以独立操作和工作。记住这一点,只要读取副本是独立运行的,并且仅用于创建物化视图,读取副本就可以了。如果主数据库出现故障,您的读取副本应继续运行。从技术上讲,它们都是用于不同目的的独立数据库

使用此方法时,您需要注意一致性。这种设置最终会保持一致,因此,如果主副本更新,则需要一些时间才能反映在读取副本中,并且在复制数据时,您可能会得到过时的副本。如果你追求强烈的一致性,这可能不是一个好的策略

基于以下评论

物化视图和读取副本是两件不同的事情。您只能使用读取副本来创建物化视图。但在复制副本本身内不执行任何操作。您需要将物化视图创建到缓存、单独的DB甚至NoSQL DB中。我们仅使用读取副本从写入数据库中卸载查询负载。物化视图是一次性的。您可以简单地处置它们并使用读取副本重新创建。在这种方法中,您可以有一个定期作业,该作业将根据您选择的时间间隔重新创建物化视图。如果您的数据库写负载很重,那么最好创建读取副本来创建物化视图。在此上下文中,读取副本没有其他用途。您甚至可以使用读取副本动态创建视图,但它们是简单视图,您将动态查询数据,速度可能不如物化视图快


正如你所说的第二种方法是倾听事件。它们很简单,只要你一听到事件,你就可以更新你的物化视图。但它们也是一次性的,您可以随时查询实际/主数据库以重新创建/更新物化视图

谢谢您的回答,但是跨微服务共享读取副本是一种好的做法吗?假设物化视图的某个部分已经构建并存储在读取副本中,因此如果我们在另一个地方需要该部分,我们已经拥有了它。关键是,如果共享不是一个好的做法,我将不得不侦听总线上的所有消息,以便构建视图的同一部分。我明白了,这是一个出色的编辑,稍微改变了一点问题,我应该共享读取副本吗?您可以保留单个读取副本,因为您最终将达到读取副本的限制。但每个微服务都将使用此读取副本来创建物化视图,该视图保存在其自身的上下文数据库/缓存等中的某个位置。但是,如果您在不同的区域拥有用户群,跨区域使用单独的读取副本将更有意义,您可以在区域内使用它们来创建物化视图,而不是跨区域海洋查询。