MST

星途 面试题库

面试题:Go语言中Context在分布式系统传递时如何处理超时

在Go语言的分布式系统中,当使用Context进行跨服务传递时,假设一个下游服务调用可能会花费较长时间,你如何通过Context来设置一个合理的超时时间,以防止系统资源的浪费?请用代码示例说明。
16.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "context"
    "fmt"
    "time"
)

func downstreamService(ctx context.Context) {
    select {
    case <-time.After(5 * time.Second): // 模拟下游服务调用可能花费较长时间
        fmt.Println("下游服务处理完成")
    case <-ctx.Done():
        fmt.Println("下游服务超时,被取消:", ctx.Err())
    }
}

func main() {
    // 创建一个带有超时的Context
    ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
    defer cancel()

    // 调用下游服务
    downstreamService(ctx)
}

在上述代码中:

  1. context.WithTimeout(context.Background(), 3*time.Second) 创建了一个带有3秒超时的 Context 以及对应的取消函数 cancel
  2. downstreamService 函数中,通过 select 语句监听 ctx.Done() 通道,如果在5秒的模拟处理时间内收到 ctx.Done() 信号,说明超时,会打印超时信息并结束处理;如果正常完成模拟处理(5秒内未超时),则打印处理完成信息。
  3. main 函数中,调用 downstreamService(ctx) 时传递带有超时设置的 Context,这样下游服务就可以根据 Context 的设置来判断是否超时。