Как вычисляется позиция сообщения Кафки - PullRequest
0 голосов
/ 12 апреля 2020

Я просматривал эти две статьи , касающиеся Apache внутренних органов Кафки. Однако в обеих этих статьях используются примеры журнала сообщений, в которых позиция не совпадает с фактическим размером полезной нагрузки.

Пример из статьи 1

Starting offset: 0
offset: 0 position: 0 CreateTime: 1533443377944 isvalid: true keysize: -1 valuesize: 11 producerId: -1 headerKeys: [] payload: Hello World
offset: 1 position: 79 CreateTime: 1533462689974 isvalid: true keysize: -1 valuesize: 6 producerId: -1 headerKeys: [] payload: intuit

Пример из статьи 2

Starting offset: 3065011416
offset: 3065011416 position: 0 isvalid: true payloadsize: 2820 magic: 1 compresscodec: NoCompressionCodec crc: 811055132 payload: {"name": "Travis", msg: "Hey, what's up?"}
offset: 3065011417 position: 1779 isvalid: true payloadsize: 2244 magic: 1 compresscodec: NoCompressionCodec crc: 151590202 payload: {"name": "Wale", msg: "Starving."}

Пары смещения и положения также содержатся в индексе, который позволяет быстро осуществлять поиск для издателей и потребителей. Насколько я понимаю, значение этого значения заключается в том, что он сообщает вам, где смещение (сообщение) появляется в сегменте журнала, и поэтому вы можете быстро перейти к нему, используя его байтовую позицию в файле. Если я попытаюсь проверить, что положение действительно продиктовано размером записи в файле журнала, я получу следующие результаты в python3 .6:

import sys

with open('first_article.log', 'rb') as fh:
    fh.read(79)   # I would assume this would read the entire first log entry (and maybe the header, too)

# outputs
b'Starting offset: 0\noffset: 0 position: 0 CreateTime: 1533443377944 isvalid: tru'


with open('second.article.log', 'rb') as fh:
    x = fh.read(1779)

# outputs
b'Starting offset: 3065011416\r\noffset: 3065011416 position: 0 isvalid: true payloadsize: 2820 magic: 1 compresscodec: NoCompressionCodec crc: 811055132 payload: {"name": "Travis", msg: "Hey, what\'s up?"}\r\noffset: 3065011417 position: 1779 isvalid: true payloadsize: 2244 magic: 1 compresscodec: NoCompressionCodec crc: 151590202 payload: {"name": "Wale", msg: "Starving."}\r\n' # it just reads to the end of the file

message = b'offset: 3065011416 position: 0 isvalid: true payloadsize: 2820 magic: 1 compresscodec: NoCompressionCodec crc: 811055132 payload: {"name": "Travis", msg: "Hey, what\'s up?"}\r\n'

## calculating the byte-size (excluding the Starting offset header entry)
len(message)
174
sys.getsizeof(message)
207

Я ожидаю, что значения будут в минимум закрыть до позиции сообщения. Я, должно быть, неправильно понимаю, как вычисляется позиция сообщения в журнале, и, возможно, я даже зацикливаюсь на деталях, которые не имеют значения. Как рассчитывается это значение? Верно ли мое понимание того, что представляет собой это значение?

...