容错

未匹配的标注
本文档最新版为 3.x,旧版本可能放弃维护,推荐阅读最新版!

在分布式系统中, 各种故障随时随地都可能发生. Micro 试图用一些容错的最佳实践来解决这个问题. 本文介绍了一些可以配置的方法.

心跳

心跳是服务发现中刷新注册的机制.

基本原理

服务在启动时注册服务发现, 并在关闭时取消注册. 有时这些服务可能会意外死亡, 被强行杀死或面临暂时的网络问题. 在这些情况下, 遗留的节点将存在服务发现中. 理想的话服务会被自动删除.

解决办法

由于这个确切原因, Micro 支持注册的 TTL 选项和间隔. TTL 指定在发现之后注册的信息存在多长时间, 然后过期并被删除. 时间间隔是服务应该重新注册的时间, 以保留其在服务发现中的注册信息.

这些选项可以用 micro 工具包中提供的标志.

用法

对于 micro 工具包, 只需使用内置标志来设置 ttl 和间隔.

micro --register_ttl=30 --register_interval=15 api

以上这个例子, 我们设置了一个 30 秒的 ttl, 重新注册间隔为 15 秒.

对于 go-micro, 当声明一个微服务时, 你可以通过 time.duration 传递选项.

service := micro.NewService(
        micro.Name("com.example.srv.foo"),
        micro.RegisterTTL(time.Second*30),
        micro.RegisterInterval(time.Second*15),
)

负载均衡

负载均衡是传输请求负载或维持高可用性的一种方式

基本原理

任何单个流程应用程序的可用性和扩展都存在限制. 如果应用程序因任何原因死亡, 您将无法再处理请求. 如果有足够的请求负载发送到应用程序, 它可能会开始缓慢响应或根本不响应. 通过发送请求至多个应用程序副本可以解决这些问题.

解决办法

Micro 通过 选择器 接口进行客户端负载平衡, 以在任意数量的服务节点上传播请求. 当服务启动时, 它将服务发现注册为具有唯一地址和 ID 的服务节点. 在发出请求时, Micro 客户端使用选择器来决定向哪个节点发出请求. 选择器使用服务注册表查找服务的节点, 然后使用负载均衡策略 (例如: 随机哈希或循环法) 选择要发送请求的节点.

用法

客户端负载平衡内置于 go-micro 客户端. 这是自动完成的.

重试

重试是一种在不成功时重试请求的方法

基本原理

由于许多原因, 请求可能会失败, 网络错误, 请求加载中, 应用程序死亡. 在这些情况下, 如果我们可以针对不同的应用程序副本重试请求以获得成功的响应, 那是比较理想的.

解决办法

微客户端包括一个重试请求的机制. 选择器 (如上所述) 返回一个 Next 函数, 该函数在执行时使用负载平衡策略从列表中返回一个节点. Next 函数可以执行多次, 根据负载均衡策略返回一个新节点. 如果设置了重试次数, 如果请求失败, 则会执行 Next 函数, 并且将针对新节点重试请求.

用法

重试可以设置为客户端的标志或选项. 它默认为 1, 意味着 1 次尝试请求.

可以通过标志进行更改.

micro --client_retries=3

通过选项进行设置。

client.Init(
    client.Retries(3),
)

缓存发现

发现缓存是服务发现信息的客户端缓存

基本原理

服务发现是微服务的核心依赖, 但如果架构不正确, 也可能成为单点故障. 每个发现系统都有自己的扩展性和高可用性. 在事件发生下降的情况下, 由于服务不知道如何解析名称到地址, 系统的其余部分将无法使用. 如果为系统中的每个请求执行查找, 服务发现也可能成为瓶颈.

解决办法

客户端缓存是一种消除服务发现瓶颈和单点故障的方法. Micro 包含一个选择器 (客户端负载平衡器), 它在服务发现信息的内存缓存中维护与之相关的信息. 如果发生缓存未命中, 选择器将使用服务注册表进行查找并缓存数据. 缓存也会周期性地被 TTL 掉, 以确保陈旧的数据不会存在.

用法

高速缓存选择器可以通过标志或在创建新服务时进行设置.

作为工具包的标志执行以下操作

micro --selector=cache api

如果调用 Init 方法, Go-micro 服务也可以使用相同的标志. 或者, 选择器可以用代码设置.

import (
    "github.com/micro/go-micro/client"
    "github.com/micro/go-micro/selector/cache"
)

service := micro.NewService(
    micro.Name("com.example.srv.foo"),
)

service.Client().Init(cache.NewSelector())

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
taadis
讨论数量: 0
发起讨论 只看当前版本


暂无话题~