go-zero的kafka

265 阅读2分钟

配置

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"`
}

关键参数

image.png

  • 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?留给大家思考