【发布时间】:2019-10-13 07:02:57
【问题描述】:
众所周知,在微服务中使用共享数据库并不是一个好主意,但是当我们需要另一个微服务中的数据时,我们应该使用像 RabbitMQ 这样的消息传递代理。如果只需要数据来构建新的物化视图,那么如果某种共享读取数据库可用,会不会更容易?或者我们应该将“您不应跨微服务共享数据库”视为不共享可写或可读数据库?
【问题讨论】:
标签: microservices
众所周知,在微服务中使用共享数据库并不是一个好主意,但是当我们需要另一个微服务中的数据时,我们应该使用像 RabbitMQ 这样的消息传递代理。如果只需要数据来构建新的物化视图,那么如果某种共享读取数据库可用,会不会更容易?或者我们应该将“您不应跨微服务共享数据库”视为不共享可写或可读数据库?
【问题讨论】:
标签: microservices
在微服务中没有对错之分,只有最佳实践。微服务的目的是它们可以独立运行和工作。牢记这一点,只读副本很好,只要它们独立运行并且仅用于创建物化视图。如果主数据库出现故障,您的只读副本应继续运行。从技术上讲,它们都是用于不同目的的独立/独立数据库。
使用这种方法时,您需要注意一致性。这种设置最终将是一致的,因此如果您的主数据库已更新,则需要一些时间才能反映在只读副本中,并且在复制数据时您可能会得到陈旧的副本。如果您追求强一致性,这可能不是一个好策略。
基于以下 cmets
物化视图和只读副本是两个不同的东西。您只会使用只读副本来创建物化视图。但是您不会在副本本身内做任何事情。您需要将物化视图创建到缓存、单独的数据库甚至 NoSQL 数据库中。我们仅使用只读副本来卸载写入数据库的查询负载。物化视图是一次性的。您可以简单地处理它们并使用只读副本重新创建。在这种方法中,您可以有一个定期作业,该作业将根据您选择的时间间隔重新创建物化视图。如果您的数据库写入负载很重,那么创建只读副本以创建物化视图总是一个好主意。在这种情况下,只读副本没有其他用途。您甚至可以使用只读副本动态创建视图,但它们是简单视图,您将动态查询数据,可能不如物化视图快。
您所说的第二种方法是监听事件。它们很简单,只要您听到事件,您就可以更新您的物化视图。但同样它们是一次性的,您始终可以查询您的实际/主数据库以重新创建/更新物化视图。
【讨论】: