21.异步执行和服务降级

Posted hualou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21.异步执行和服务降级相关的知识,希望对你有一定的参考价值。

异步执行和服务降级,使用hystrix.Go()函数的返回值是chan err

package main

import (
    "fmt"
    "github.com/afex/hystrix-go/hystrix"
    "math/rand"
    "time"
)

type Product struct {
    ID    int
    Title string
    Price int
}

func getProduct() (Product, error) {
    r := rand.Intn(10)
    if r < 6 { //模拟api卡顿和超时效果
        time.Sleep(time.Second * 4)
    }
    return Product{
        ID:    101,
        Title: "Golang从入门到精通",
        Price: 12,
    }, nil
}

func RecProduct() (Product, error) {
    return Product{
        ID:    999,
        Title: "推荐商品",
        Price: 120,
    }, nil

}

func main() {
    rand.Seed(time.Now().UnixNano())
    configA := hystrix.CommandConfig{ //创建一个hystrix的config
        Timeout: 3000, //command运行超过3秒就会报超时错误
    }
    hystrix.ConfigureCommand("get_prod", configA) //hystrix绑定command
    resultChan := make(chan Product, 1)
    for {
        errs := hystrix.Go("get_prod", func() error { //使用hystrix来讲我们的操作封装成command,hystrix返回值是一个chan error
            p, _ := getProduct() //这里会随机延迟0-4秒
            resultChan <- p
            return nil //这里返回的error在回调中可以获取到,也就是下面的e变量
        }, func(e error) error {
            rcp, err := RecProduct() //推荐商品,如果这里的err不是nil,那么就会忘errs中写入这个err,下面的select就可以监控到
            resultChan <- rcp
            return err
        })
        select {
        case getProd := <-resultChan:
            fmt.Println(getProd)
        case err := <-errs: //使用hystrix.Go时返回值是chan error各个协程的错误都放到errs中
            fmt.Println(err,1)
        }
    }
}




以上是关于21.异步执行和服务降级的主要内容,如果未能解决你的问题,请参考以下文章

在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段

cling的异步操作

对SpringCloud Hystrix服务降级的浅显理解

错误记录Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. | Android Studio 降级 )(代码片段

错误记录Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. | Android Studio 降级 )(代码片段

NodeJs异步的执行过程