【发布时间】:2021-11-06 00:41:53
【问题描述】:
下面是一个包含 3 个 Go-routines 的服务,用于处理来自 Kafka 的消息:
Channel-1 和 Channel-2 是 Go 中的无缓冲数据通道。 Channel 就像一种排队机制。
Goroutine-1 从 kafka 主题读取消息,在消息验证后将其消息负载扔到 Channel-1。
Goroutine-2 从 Channel-1 读取并处理 payload 并将处理后的 payload 扔到 Channel-2 上。
Goroutine-3 从 Channel-2 读取数据,并将处理后的 payload 封装成 http 数据包,然后向另一个服务执行 http 请求(使用 http 客户端)。
上述流程中的漏洞:在我们的例子中,由于服务之间的网络连接不良或远程服务尚未准备好接受来自 Go-routine3(http 客户端超时)的 http 请求,因此处理失败,因此,上述服务丢失该消息(已从 Kafka 主题中读取)。
Goroutine-1 当前订阅来自 Kafka 的消息没有向 Kafka 发送确认(通知 Goroutine-3 已成功处理特定消息)
正确性比性能更重要。
如何保证每条消息都处理成功?
【问题讨论】:
标签: go apache-kafka message-queue