在微服务中使用共享的读取数据库

时间:2019-05-27 17:56:14

标签: microservices

众所周知,在微服务中使用共享数据库不是一个好主意,但是当我们需要另一个微服务中的数据时,我们应该使用RabbitMQ之类的消息代理。如果只需要数据来构建一个新的物化视图,那么如果有某种共享的读取数据库就不会变得容易吗?还是我们应该读到“您不应该跨微服务共享数据库”,因为不共享可写或可读的数据库?

1 个答案:

答案 0 :(得分:1)

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

使用这种方法时,您需要了解一致性。这种设置最终将是一致的,因此,如果您的主数据库被更新,则将需要一些时间才能反映在只读副本中,并且在复制数据时可能会得到陈旧的副本。如果您追求强一致性,那么这可能不是一个好的策略。

基于以下评论

材料化视图和只读副本是两回事。您将只使用只读副本来创建实体化视图。但是您不会在副本本身内执行任何操作。您需要将实例化视图创建到cache,单独的DB甚至NoSQL db中。我们仅使用只读副本来减轻写数据库的查询负载。物化视图是一次性的。您可以简单地处置它们并使用只读副本重新创建。通过这种方法,您可以有一个定期的工作,该工作将根据您选择的间隔重新创建实例化视图。如果您有大量的写负载数据库,那么创建只读副本来创建物化视图始终是一个好主意。在这种情况下,只读副本没有其他目的。您甚至可以使用只读副本动态创建视图,但是它们是简单的视图,并且您将动态查询数据,其速度可能不如物化视图。

您说的第二种方法是听事件。它们很简单,您只要听事件即可更新实例化视图。但是它们又是一次性的,您始终可以查询您的实际/主数据库来重新创建/更新实例化视图。