微服务:每个实例或每个微服务的数据源?

Microservices: datasource per instance or per microservice?

构建微服务架构我遇到了同一个微服务实例之间数据共享的问题

我有微服务,它大量使用它的数据源——每个服务请求都会导致数据库请求(通常是插入)。该服务将被大量使用,我计划将多个实例隐藏在 Load Balancer 后面。这里出现了一个问题:这些实例应该使用一个数据库(数据库会成为瓶颈吗?)还是多个(每个实例的数据源)?

根据我对 mSOA 架构的经验,我从未见过

MULTIPLE (datasource per instance)

待用。即使您计划大量加载它,最常见的数据库本质上也支持多线程访问。通常数据库系统的瓶颈(或最慢的部分)是磁盘。我们不得不多次扩展我们的集群(如果你在云中,相对便宜,但可扩展性也可能成为一个问题,因为需要更多的线程来管理和执行扩展的数据库系统)。请记住,某些 RDBMS 使用临时数据库 (tempdb),该实例上的所有数据库都使用该临时数据库进行排序、散列、临时变量等。多线程和拆分此 tempdb 文件可用于提高 tempdb 的吞吐量,从而提高整体服务器性能。

自从我现在使用 Orchard 以来,我不得不说有一些极端情况,当您对一个实例的操作不完全(及时)同步时。这会导致对资源的访问被拒绝(在事件注册之后),即使在正确的身份验证之后也是如此。

I plan to hide multiple instances behind Load Balancer

这是适合您的应用服务器的设计,因此使用数据库集群也应该是合适的。针对完整答案 - 你可以考虑 DWH,如果你有很多服务并且你希望能够从他们所有的数据库中进行一些数据挖掘和分析。

很大程度上取决于您的实际用例,但我认为后写或回写可能是您的解决方案之一。 This link 谈到了 EhCache 的技术,我认为应该有其他缓存支持该功能,你可能想 google 稍微了解一下。

每个微服务实例有一个数据库实例是一种非常不寻常的架构。如果您担心数据库的负载,您可以将其集群以获得更高的吞吐量,但是,插入不会造成太多负载。

如果您担心数据库会成为瓶颈,我建议您查看 NoSQL 数据库。 NoSQL 数据库旨在更好地扩展以实现高吞吐量并很好地处理大量数据。当然缺点是他们不能很好地处理复杂的数据模型。

这实际上取决于您的可扩展性要求,how/if您的微服务实例需要协作以提供单一结果。它有助于了解权衡是什么:

将所有内容保存在一个数据库中

  • 更简单的配置

  • 与您服务的其他实例没有协调或通信 需要

  • 更容易发现您的完整数据集
  • 系统性能受数据库性能限制

保持数据库分离

  • 请求的完整答案可能分布在微服务中 实例 在那种情况下,你增加了沟通和 协商解决请求处理数据,当你失去 微服务节点(即使数据库还在,你也无法获取 直到重新安装一个配置正确的新设备)

  • 配置复杂性增加

我的方法是服务本地数据库(读取:每个实例的数据源)。在内存中或在同一个 Pod 中。为了同步启动时总是新鲜的数据库,我会使用 Apache Kafka。一旦服务开始初始化,它就会向 Kafka 查询它感兴趣的所有条目(注意 compact log-Kafka 的特性,只有 returns实体)填充其数据库并开始服务请求。

这当然会增加启动时间,但好处是,数据库可以是服务希望它成为的任何技术或方案(这甚至可以随着服务的版本而改变)。也不需要数据库集群,但你需要一个正确配置的 Kafka 服务,但它也可以用于你的服务中的事件源。