概要
kafka-go区分同步写与异步写。同步写能严格确保写入的顺序,因为在写成功之前它会block住应用程序,同时返回错误信息。有三种控制写入完成的时机,1是消息发送完成即返回,2是leader收到后即返回,3是isr收到后即返回,越往后数据的可靠性更高,它们均是通过配置参数来控制。异步写不用等返回结果,而是传入一个回调函数来接收处理返回结果(同步写也支持返回前回调)。异步写的性能更优异,而且在很多场景下(有一定的额外逻辑)也仍能保证数据的可靠性。
为了提升写的性能,无论是同步写还是异步写都是以batch的方式执行的。
写模型

代码
核型类型:Writer, partitionWriter,batchQueue,writeBatch 。后文会逐一来介绍。
Writer
直接暴露给应用程序使用的类型
类型
type Writer struct {
Addr net.Addr // broker地址
Topic string
Balancer Balancer // 消息分发(partition)策略
MaxAttempts int // 投递最大重试次数
BatchSize int // 一次batch写入的最多消息条数
BatchBytes int64 // 一次batch写入的最大数据量
BatchTimeout time.Duration // 一次batch写入的最大间隔时间
ReadTimeout time.Duration
WriteTimeout time.Duration
// RequireNone (0) 发送出去就认为成功
// RequireOne (1) leader接收就返回
// RequireAll (-1) 等待所有ISR的返回结果
RequiredAcks RequiredAcks
Async bool // 异步写
Completion func(messages []Message, err error) // 回调函数
Compression Compression // 压缩方式
Transport RoundTripper // 底层数据传输类型
group sync.WaitGroup
mutex sync.Mutex
closed bool
writers map[topicPartition]*partitionWriter // 一个Writer会对应多个partition writer,它们和partition一一对应
once sync.Once
*writerStats // 状态记录
}
核心方法
1 写消息
func (w *Writer) WriteMessages(ctx context.Context, msgs ...Message) error {
if !w.enter() { // flag标识,防止在写的过程中Writer被关闭
retur

&spm=1001.2101.3001.5002&articleId=123676500&d=1&t=3&u=493f465ede27416c9df6b8b67af444b9)
1722

被折叠的 条评论
为什么被折叠?



