業務層:
NewConsumer(client.mBrokers, group, topic, config)
cluster-comsuer.go
構造Consumer:
consumer, err := sarama.NewConsumerFromClient(client.Client)
c.client.RefreshCoordinator(groupID)//獲取組協調者
起循環
for {
c.nextTick
}
nextTick:
重平衡->訂閱主題->fetchOffsets->針對該主題分區下的offset起一個分區消費者->然後調用分區消費者的ConsumePartition
comsumer.go
ConsumePartition(topic string, partition int32, offset int64)->
c.refBrokerConsumer(leader)->
c.newBrokerConsumer(broker)->
go withRecover(bc.subscriptionConsumer)->
bc.fetchNewMessages()->
bc.broker.Fetch(request)
broker.go
b.sendAndReceive(request, response)->
versionedDecode(buf, res, req.version()) and res is
respons, response is FetchResponse type
encode_decoder.go
in.decode(&helper, version) FetchResponse type decode is:
fetch_repsonse.go
decode(pd packetDecoder, version int16)->
records.decode(recordsDecoder);
records.go
decode(pd packetDecoder)->
record_batch.go
decode(pd packetDecoder) include 解壓縮