|
|
|
kafka - partition/topic/key
|
|||
|---|---|---|---|
|
#18+
При конструировании ProducerRecord https://kafka.apache.org/0102/javadoc/org/apache/kafka/clients/producer/ProducerRecord.html мы обязаны указать топик и значение. опционально можем указать дополнительно key key+partition key+partition+timestamp Объясните пожалуйста в чем будет разница? зачем нужен ключ вообще? я бы мог предположить, что для того, чтобы вычислить партишен, но зачем тогда констуктор партишен+ключ ? Если не указать партишен, то в какой будет записано? ну и таймстемп зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2017, 15:47 |
|
||
|
kafka - partition/topic/key
|
|||
|---|---|---|---|
|
#18+
почему один партишен может читать только один консумер в рамках консумер группы ? что будет если я таки начну это делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2017, 18:35 |
|
||
|
kafka - partition/topic/key
|
|||
|---|---|---|---|
|
#18+
ещё не могу найти ни одного примера где подписка идёт на конкретный партишен. все примеры типа Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. На какой партишен мы тут подписались? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2017, 18:38 |
|
||
|
kafka - partition/topic/key
|
|||
|---|---|---|---|
|
#18+
questionerопционально можем указать дополнительно key key+partition key+partition+timestamp key Если укажите только ключ, то партишен будет вычеслен по ключу, таймстам сообщения который будет виден консумеры через метаданные сообщения присвоится в зависимости от настроек топика, либо время когда месседж пришел на кафка сервер, либо время с продьюсера. Ключ можно не указывать(использовать null), если Вам не важно, чтобы месседжи с одним и тем же ключом, всегда попадали в одну и туже партицию. key+partition ключ если партиция >=0 не будет использован для партицирования, использовать такой вариант, когда вы сами лучше знаете в какую партицию должен попасть мессадж, ключ в этом варианте кстате то же можно оставить null, если он вам не нужен. key+partition+timestamp то же самое что и пункт 2, только можно еще указать свой таймстамп сообщения, нужно только учитывать, что кафка может и выбросить нафиг ваш таймстам, если в настройках топика сказано брать таймстам сервера. Вообще API конструирования ProducerRecord немного дебильный, поскольку поскольку все три параметра могут быть опциональны, тут лучше бы подошел билдер, но от скалистов хорошего кода сразу ждать не стоит, спасибо, что хоть java клиент написали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2017, 22:45 |
|
||
|
kafka - partition/topic/key
|
|||
|---|---|---|---|
|
#18+
questionerзачем нужен ключ вообще? я бы мог предположить, что для того, чтобы вычислить партишен, но зачем тогда констуктор партишен+ключ ? Даже если явно указать партишен, ключ может быть ценнен сам по себе, допустим он нужен получателю. Это конечно немного надуманный кейс, потому что ничего не мешало бы засунуть ключ внутрь сообщения. А вот где реально может понадобится ключ, даже если он не участвует в расчете партиции это механизм Log Compaction - который сжимает логи по ключу, оставляя только самое последнее значение(не бойтесь LogCompaction по умолчанию выключен). questionerЕсли не указать партишен, то в какой будет записано? Если указан ключ и он не null, то партиция вычислиться по ключу, алгоритм хеширования по памяти точно не помню, но кажись murmur. Если ключи у вас будут null, то кафка сама будет выберать партиции, стараясь равномерно заполнять все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2017, 22:51 |
|
||
|
kafka - partition/topic/key
|
|||
|---|---|---|---|
|
#18+
Какое-то дежа-вю. Хотя я читал не про Kafka, а про Cassandra. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2017, 22:56 |
|
||
|
kafka - partition/topic/key
|
|||
|---|---|---|---|
|
#18+
questionerпочему один партишен может читать только один консумер в рамках консумер группы ? А в чем собственно проблема? Мне кажется как раз таки это очень удобно. Кафка отптимизированна под работу бэтчами, толстый консумер читает много(если на сервере есть данные) за раз, обрабатывает и коммитит офсет сразу для пачки, подтверждение обработки в такой схеме очень дешевое, сродни перемещению указателя при выделении памяти в JVM, при этом данные самой партиции на диске вообще никак не меняются, от того что консумер их читает. В общем API как быспециально наталкивает вас на оптимальный путь обработки месседжей. questionerчто будет если я таки начну это делать? Что начнете делать? Попробуете заасайнить одну и туже партицию, на двух разных консумеров в группе? Я так не делал, попробуйте, должны по хорошему получить отлуп. Хоть сервер в кафке полностью избавлен от задач координации потребителей, я думаю полного хаоса устроить не удастся(по крайней мере оставаясь в рамках API официального java клиента), так как за координацию всех консумеров в группе отвечает лидер группы, и он следит, кто откуда читает, чтобы не было беспредела. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2017, 23:01 |
|
||
|
kafka - partition/topic/key
|
|||
|---|---|---|---|
|
#18+
questionerещё не могу найти ни одного примера где подписка идёт на конкретный партишен. Не можете найти примера, читайте документацию к KafkaConsumer , раздел Manual Partition Assignment . questioner Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. На какой партишен мы тут подписались? Неизвестно, может и не на один не подписались, в зависимости от числа партиций в топике, числа консумеров. Кстате если топика вообще нет на сервере, то эксепшена вы не получите, молча сасабскрайбитесь на несуществующий топик, скорее всего так сделано для того, что если вдруг топик появится в будущем, то Вы на него уже подписанны, и начнете по нему что-то получать после ребалансировки консумер группы. Так вот, по умолчанию партиции делятся одинаково между консумерами, если партиция только одна, то только один консумер будет читать из топика, остальные успешно подпишутся, но месседжей не получат, в случае например 8 партиций и 4-х консумеров, каждый будет подписан на 2 партиции, в случае 8 партиций 3 консумеров, кому-то достанется по три партиции, а одному консумеру останется только 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2017, 23:13 |
|
||
|
kafka - partition/topic/key
|
|||
|---|---|---|---|
|
#18+
vimbaquestionerзачем нужен ключ вообще? я бы мог предположить, что для того, чтобы вычислить партишен, но зачем тогда констуктор партишен+ключ ? Даже если явно указать партишен, ключ может быть ценнен сам по себе, допустим он нужен получателю. Это конечно немного надуманный кейс, потому что ничего не мешало бы засунуть ключ внутрь сообщения. А вот где реально может понадобится ключ, даже если он не участвует в расчете партиции это механизм Log Compaction - который сжимает логи по ключу, оставляя только самое последнее значение(не бойтесь LogCompaction по умолчанию выключен). Ведь вроде как кафка работает быстро за счет того, что файлы только инкрементно пишутся. Этот механизм работает в рамках топика или в рамках партиции? vimbaquestionerЕсли не указать партишен, то в какой будет записано? Если указан ключ и он не null, то партиция вычислиться по ключу, алгоритм хеширования по памяти точно не помню, но кажись murmur. Если ключи у вас будут null, то кафка сама будет выберать партиции, стараясь равномерно заполнять все. Почему тогда есть конструктор только key+partition и нет просто partition ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2017, 18:51 |
|
||
|
kafka - partition/topic/key
|
|||
|---|---|---|---|
|
#18+
Видимо ответ на второй вопрос VimbaВообще API конструирования ProducerRecord немного дебильный, поскольку поскольку все три параметра могут быть опциональны, тут лучше бы подошел билдер, но от скалистов хорошего кода сразу ждать не стоит, спасибо, что хоть java клиент написали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2017, 18:58 |
|
||
|
kafka - partition/topic/key
|
|||
|---|---|---|---|
|
#18+
questioner, Log Compaction в кафке работает также как и SSTable компакшн в кассандре, уже постфактум в бэкграунде, старые сегменты логов никак при этом не модифицируются, просто из нескольких старых сливается новый, при этом в новом сегменте будет только одна запись для каждого ключа. Вообще практическое применение Log Compaction для меня является загадкой, но я так думаю, что используется в архитектуре event sourcing, для сохранения снапшотов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2017, 21:55 |
|
||
|
kafka - partition/topic/key
|
|||
|---|---|---|---|
|
#18+
vimba, вот тут наткнулся на статью https://www.javaworld.com/article/3066873/big-data/big-data-messaging-with-kafka-part-2.html Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. вот тут в ветке else возвращается Код: java 1. Что это вообще такое написано? Код: java 1. это же количество топиков во всём кластере. Как это связано с количеством партиций? Даже если взять, что это количество партиций, то всё равно не понятно, что значит строка Код: java 1. Тут же явно можно вылезти за количество партиций P.S. partition метод возвращает идентификатор партиции как я понял. Они всегда начинаются с ноля ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 14:48 |
|
||
|
kafka - partition/topic/key
|
|||
|---|---|---|---|
|
#18+
questioner, Код абсолютно дебильный, но вы обратите внимание на то, что его писал индусс, я бы закрыл статью сразу после фото автора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2017, 08:31 |
|
||
|
kafka - partition/topic/key
|
|||
|---|---|---|---|
|
#18+
questionerТут же явно можно вылезти за количество партиций Ага, а еще и недолезть даже до нуля, выдав отрицательную партицию, потому что hashcode может вернуть отрицательное число, операция взятия остатка от деления отрицательного числа на положительное тоже даёт отрицательное число. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2017, 09:27 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39536702&tid=2122532]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
2ms |
| others: | 193ms |
| total: | 319ms |

| 0 / 0 |
