kafka-go源码解析四(Writer)

概要

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值