配置
type KqConf struct {
service.ServiceConf
Brokers []string
Group string
Topic string
CaFile string `json:",optional"`
Offset string `json:",options=first|last,default=last"`
Conns int `json:",default=1"`
Consumers int `json:",default=8"`
Processors int `json:",default=8"`
MinBytes int `json:",default=10240"` // 10K
MaxBytes int `json:",default=10485760"` // 10M
Username string `json:",optional"`
Password string `json:",optional"`
ForceCommit bool `json:",default=true"`
}
关键参数
- Partition:分区,一般在创建topic的时候,分区的个数已经确定
- queue:队列,参数conn默认值是1,只会创建一个队列。可以创建和分区数目相同的queue,并发读取partition的数据
- readerMessage:一个带有缓冲的channel,默认是1000个。从kafka的服务端批量读取数据,最小MinBytes默认是10k,最大MaxBytes默认是10M。
- Consumers:可以配置多个goroutine,从channel中获取message写入到channel中
- channel:kq中固定一个channel。
- Processors:可以配置多个goroutine,处理从channel中获取到的message
- Commit Message:处理之后的message,放入到commit的channel中,等待提交offset
- CommitInterval:kq中固定一秒提交一次。
- ForceCommit:kq设置的默认值是true,用在处理message的时候,如果函数返回了error,这条记录的offset也会被提交
问题点
- offset的提交是自动么?
- 不是,kq中是每隔1秒提交
- 会出现消息丢失么?
- 会
- 如果有消息1,2.对应offset的值分别为100,101.消息2执行的offset先提交之后,由于某种原因程序退出,则消息1虽然还未执行完,但是也不会再次执行
- 会重复消费么?
- 会
- 消息消费完之后,未及时放到Commit Message的channel中,由于某种原因程序退出,则会出现重复消费
- 进程关闭时会提交消费完的commit么?
- 会
- go-zero封装的kq,使用了serviceGroup,在进程提出时会调用reader.close,从而Commit Message的channel数据会提交
如果使用的是zero提供的默认参数,那么一个partition中的数据会顺序消费么?可以怎么样设置来保证顺序消费?为什么consumers的goroutine拿到数据之后是放到了不带缓冲的channel?留给大家思考