规模化微服务

拥抱故障

非功能需求

  • 响应时间/延迟
  • 可用性
  • 数据持久性

功能降级

对于每个使用多个微服务的面向用户的界面,或每个依赖多个下游合作者的微服务来说,你都需要问自己:“如果这个微服务宕掉会发生什么?”然后你就知道该做什么了。

架构性安全措施

正确地设置超时,实现舱壁隔离不同的连接池,并实现一个断路器 ,以便在第一时间避免给一个不健康的系统发送调用。

反脆弱的组织

混乱猴子(Chaos Monkey) https://github.com/Netflix/SimianArmy

  • 超时

  • 断路器

  • 舱壁

为每个下游服务的连接使用不同的连接池;关注点分离

  • 隔离

一个服务越依赖于另一个,另一个服务的健康将越能影响其正常工作的能力。

幕等

对幂等操作来说,其多次执行所产生的影响,均与一次执行的影响相同。如果操作是幂等的,我们可以对其重复多次调用,而不必担心会有不利影响。当我们不确定操作是否被执行,想要重新处理消息,从而从错误中恢复时,幂等会非常有用。

我们认为那些业务操作是幂等的,而不是整个系统状态的。

扩展

弹性扩展 异地机房

扩展数据库

  • 扩展读取

几年前,使用只读副本进行扩展(读写分离)风靡一时,不过现在我建议你首先看看缓存,因为它可以提供更显著的性能改善,而且工作量往往更少。

  • 扩展写操作

分片

缓存

HTTP 在处理大量请求时,伸缩性如此良好的原因之一就是内置了缓存的概念。

客户端、代理和服务器端缓存

哪种缓存最合理取决于你正在试图优化什么。

  • 客户端缓存

客户端缓存可以大大减少网络调用的次数,并且是减少下游服务负载的最快方法之一。但是使用由客户端负责缓存这种方式,如果你想改变缓存的方式,让大批的消费者全都变化是很困难的,让过时的数据失效也比较棘手。

  • 代理服务器

使用代理服务器缓存时,一切对客户端和服务器都是不透明的。这通常是增加缓存到现有系统的一个非常简单的方法。

  • 服务器缓存

使用服务器缓存,一切对客户端都是不透明的,它们不需要关心任何事情。缓存在服务器外围或服务器限界内时,很容易了解一些类似数据是否失效这样的事情,还可以跟踪和优化缓存命中率。在你有多种类型客户端的情况下,服务器缓存可能是提高性能的最快方式。

HTTP缓存

cache-control Expire

ETag

保持简单

缓存越多,就越难评估任何数据的新鲜程度。所以如果你认为缓存是一个好主意,请保持简单,先在一处使用缓存,在添加更多的缓存前慎重考虑

缓存中毒

Expires:Neve「的页面,停留在很多用户的缓存里,永远不会失效,直到缓存已满或者用户手动清理它们。

自动伸缩

如果你足够幸运,可以完全自动化地创建虚拟主机以及部署你的微服务实例,那么你已经具备了对微服务进行自动伸缩的基本条件。

CAP定理

一致性(consistency)、可用性(availability)和分区容忍性(partition tolerance)

系统放弃一致性以保证分区容忍性和可用性的这种做法,被称为 最终一致性

服务发现

  • DNS

  • 动态服务注册

Zookeeper本身所提供的特性是相当通用的,你可以认为它只是信息树的一个副本,当它发生更改时对你做出提醒。

文档服务

转载请注明:转载自srzyhead的博客(https://srzyhead.github.io)

本文链接地址: 微服务设计 (11-规模化微服务)