【问题标题】:Using a shared read database in Microservices在微服务中使用共享读取数据库
【发布时间】:2019-10-13 07:02:57
【问题描述】:

众所周知,在微服务中使用共享数据库并不是一个好主意,但是当我们需要另一个微服务中的数据时,我们应该使用像 RabbitMQ 这样的消息传递代理。如果只需要数据来构建新的物化视图,那么如果某种共享读取数据库可用,会不会更容易?或者我们应该将“您不应跨微服务共享数据库”视为不共享可写或可读数据库?

【问题讨论】:

    标签: microservices


    【解决方案1】:

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

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

    基于以下 cmets

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

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

    【讨论】:

    • 感谢您的回答,但跨微服务共享只读副本是一种好习惯吗?想象一下,物化视图的某些部分已经构建并存储在只读副本中,因此如果我们需要在另一个地方使用该部分,我们已经拥有它。关键是,如果共享不是一个好习惯,我将不得不收听来自总线的所有消息,只是为了构建视图的相同部分。
    • 我明白了,这是一个出色的编辑,稍微改变了问题,我应该分享只读副本吗?
    • 您可以保留单个只读副本,因为您最终会达到只读副本的限制。但是每个微服务都将使用这个只读副本来创建物化视图,该视图保存在它自己的上下文数据库/缓存等中的某个位置。但是如果您在不同区域的用户群具有跨区域的单独只读副本将更有意义,您可以使用他们在区域内创建您的物化视图,而不是跨洋查询。
    猜你喜欢
    • 2018-05-01
    • 1970-01-01
    • 2019-01-31
    • 2016-07-30
    • 2015-06-10
    • 1970-01-01
    • 2019-12-06
    • 2019-02-27
    • 2017-05-29
    相关资源
    最近更新 更多