...
Code Block | ||||
---|---|---|---|---|
| ||||
// ProduceRequest v3 ProduceRequest => TransactionalId RequiredAcks Timeout [TopicName [Partition MessageSetSize MessageSet]] TransactionalId => nullableString RequiredAcks => int16 Timeout => int32 Partition => int32 MessageSetSize => int32 MessageSet => bytes |
Code Block | ||||
---|---|---|---|---|
| ||||
// ProduceResponse v3 ProduceResponse => [TopicName [Partition ErrorCode Offset Timestamp]] ThrottleTime TopicName => string Partition => int32 ErrorCode => int16 Offset => int64 Timestamp => int64 ThrottleTime => int32 |
...
Code Block | ||
---|---|---|
| ||
MessageSet => FirstOffset => int64 Length => int32 CRC => int32 Magic => int8 /* bump up to “2” */ Attributes => int16 LastOffsetDelta => int32 {NEW} FirstTimestamp => int64 {NEW} MaxTimestampDeltaMaxTimestamp => int64 {NEW} PID => int64 {NEW} Epoch => int16 {NEW} FirstSequence => int32 {NEW} Messages => Message1, Message2, … , MessageN {NEW} Message => {ALL FIELDS NEW} Length => uintVar Attributes => int8 TimestampDelta => intVar OffsetDelta => uintVar KeyLen => uintVar [OPTIONAL] Key => data [OPTIONAL] Value => data [OPTIONAL] |
...
The length field of the message format is encoded as an unsigned variable-length int, abbr. “uintVar”. Similarly the offset delta and key length fields are encoded as unitVar as well. The message’s offset can then be calculated as the offset of the message set + offset delta. At the end we still maintains a message-level CRC (reason discussed below).
Message Attributes: In this format, we have also added a single byte for individual message attributes. Only message sets can be compressed, so there is no need to reserve some of these attributes for the compression type. Instead, we use the first bit to indicate a null key and the second bit to indicate a null value (1 indicates null, 0 indicates non-null). This allows us to use an unsigned variable length encoding for the key and value length fields. When the key or value is null, we can omit the corresponding fields:
...