0
点赞
收藏
分享

微信扫一扫

Flink SQL:debezium-json 格式的表一定是数据库的 CDC 数据吗?

        开发人员有时会误解context.Context类型,尽管它是Go语言的关键概念之一,也是Go中并发代码的基础之一。接下来让我们看看这个概念,并确保我们理解为什么乃如何有效地使用它。

根据官方文档:

        上下文(context)携带最后期限、取消信号和其他跨API边界的值。

        下面让我们来看下这个定义,以及和上下文相关的概念。

1. 最后期限

最后期限(deadline)是指通过以下方式明确指定的时间点:

  • 从当前开始的一个time.Duration
  • 一个time.Time

        最后期限的语义传达了如果到达此时间点则应停止当前的活动。例如,活动可以是一个I/O请求或者是一个等待从channel接收消息的goroutine。

        让我们考虑一个应用程序,它每4秒就从雷达那里接收一次飞行位置。一旦收到一个位置,我们希望能与其他关心最新位置的应用程序共享它。我们在我们所掌握的逻辑中定义了一个publisher接口,它只包含一个方法:

type publisher interface {
    Publish(ctx context.Context, position flight.Position) error
}

这个方法接收一个上下文参数和一个位置参数。我们假定这个具体的实现会调用一个函数来给代理(broker,就像使用Sarama库发布Kafka消息一样)发布消息。这个函数是上下文敏感的(context aware),也就是说,一旦上下文被取消,它就可以取消请求。

        假定我们没有收到上游的上下文,那应该提供给Publish方法什么上下文呢?我们提到过,应用程序只对最新的位置感兴趣,所以我们自已构建的上下文应该传达4秒超时的信息,如果4秒后还没有发布新的飞行位置,那就应该停止调用Publish方法:

type publishHandler struct {
    pub publisher
}
 
func (h publishHandler) publishPosition(position flight.Position) error {
    ctx, cancel := context.WithTimeout(context.Background(), 4*time.Second)
    defer cancel()
    return h.pub.Publish(ctx, position)
}

这段代码使用context.WithTimeout函数创建了一个上下文对象,它接收一个超时参数和一个上下文参数,因为publishPosition没有接收一个已存在的上下文,所以我们使用cont

举报

相关推荐

0 条评论