powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / kafka - partition/topic/key
16 сообщений из 16, страница 1 из 1
kafka - partition/topic/key
    #39528462
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При конструировании ProducerRecord
https://kafka.apache.org/0102/javadoc/org/apache/kafka/clients/producer/ProducerRecord.html

мы обязаны указать топик и значение.

опционально можем указать дополнительно

key

key+partition

key+partition+timestamp


Объясните пожалуйста в чем будет разница?

зачем нужен ключ вообще? я бы мог предположить, что для того, чтобы вычислить партишен, но зачем тогда констуктор партишен+ключ ?

Если не указать партишен, то в какой будет записано?

ну и таймстемп зачем?
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39528594
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
почему один партишен может читать только один консумер в рамках консумер группы ?

что будет если я таки начну это делать?
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39528596
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ещё не могу найти ни одного примера где подписка идёт на конкретный партишен.

все примеры типа

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
Properties props = new Properties();
props.put("bootstrap.servers", "broker1:9092,broker2:9092");
props.put("group.id", "CountryCounter");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);

consumer.subscribe(Collections.singletonList("customerCountries")); 



На какой партишен мы тут подписались?
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39529633
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
up
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39529722
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerопционально можем указать дополнительно
key

key+partition

key+partition+timestamp

key Если укажите только ключ, то партишен будет вычеслен по ключу, таймстам сообщения который будет виден консумеры через метаданные сообщения присвоится в зависимости от настроек топика, либо время когда месседж пришел на кафка сервер, либо время с продьюсера. Ключ можно не указывать(использовать null), если Вам не важно, чтобы месседжи с одним и тем же ключом, всегда попадали в одну и туже партицию.

key+partition ключ если партиция >=0 не будет использован для партицирования, использовать такой вариант, когда вы сами лучше знаете в какую партицию должен попасть мессадж, ключ в этом варианте кстате то же можно оставить null, если он вам не нужен.

key+partition+timestamp то же самое что и пункт 2, только можно еще указать свой таймстамп сообщения, нужно только учитывать, что кафка может и выбросить нафиг ваш таймстам, если в настройках топика сказано брать таймстам сервера.

Вообще API конструирования ProducerRecord немного дебильный, поскольку поскольку все три параметра могут быть опциональны, тут лучше бы подошел билдер, но от скалистов хорошего кода сразу ждать не стоит, спасибо, что хоть java клиент написали.
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39529723
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerзачем нужен ключ вообще? я бы мог предположить, что для того, чтобы вычислить партишен, но зачем тогда констуктор партишен+ключ ?

Даже если явно указать партишен, ключ может быть ценнен сам по себе, допустим он нужен получателю. Это конечно немного надуманный кейс, потому что ничего не мешало бы засунуть ключ внутрь сообщения. А вот где реально может понадобится ключ, даже если он не участвует в расчете партиции это механизм Log Compaction - который сжимает логи по ключу, оставляя только самое последнее значение(не бойтесь LogCompaction по умолчанию выключен).

questionerЕсли не указать партишен, то в какой будет записано?

Если указан ключ и он не null, то партиция вычислиться по ключу, алгоритм хеширования по памяти точно не помню, но кажись murmur. Если ключи у вас будут null, то кафка сама будет выберать партиции, стараясь равномерно заполнять все.
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39529725
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какое-то дежа-вю. Хотя я читал не про Kafka, а про Cassandra.
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39529728
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerпочему один партишен может читать только один консумер в рамках консумер группы ?
А в чем собственно проблема? Мне кажется как раз таки это очень удобно. Кафка отптимизированна под работу бэтчами, толстый консумер читает много(если на сервере есть данные) за раз, обрабатывает и коммитит офсет сразу для пачки, подтверждение обработки в такой схеме очень дешевое, сродни перемещению указателя при выделении памяти в JVM, при этом данные самой партиции на диске вообще никак не меняются, от того что консумер их читает. В общем API как быспециально наталкивает вас на оптимальный путь обработки месседжей.


questionerчто будет если я таки начну это делать?

Что начнете делать? Попробуете заасайнить одну и туже партицию, на двух разных консумеров в группе? Я так не делал, попробуйте, должны по хорошему получить отлуп. Хоть сервер в кафке полностью избавлен от задач координации потребителей, я думаю полного хаоса устроить не удастся(по крайней мере оставаясь в рамках API официального java клиента), так как за координацию всех консумеров в группе отвечает лидер группы, и он следит, кто откуда читает, чтобы не было беспредела.
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39529732
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerещё не могу найти ни одного примера где подписка идёт на конкретный партишен.

Не можете найти примера, читайте документацию к KafkaConsumer , раздел Manual Partition Assignment .

questioner
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
Properties props = new Properties();
props.put("bootstrap.servers", "broker1:9092,broker2:9092");
props.put("group.id", "CountryCounter");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);

consumer.subscribe(Collections.singletonList("customerCountries")); 



На какой партишен мы тут подписались?
Неизвестно, может и не на один не подписались, в зависимости от числа партиций в топике, числа консумеров. Кстате если топика вообще нет на сервере, то эксепшена вы не получите, молча сасабскрайбитесь на несуществующий топик, скорее всего так сделано для того, что если вдруг топик появится в будущем, то Вы на него уже подписанны, и начнете по нему что-то получать после ребалансировки консумер группы.
Так вот, по умолчанию партиции делятся одинаково между консумерами, если партиция только одна, то только один консумер будет читать из топика, остальные успешно подпишутся, но месседжей не получат, в случае например 8 партиций и 4-х консумеров, каждый будет подписан на 2 партиции, в случае 8 партиций 3 консумеров, кому-то достанется по три партиции, а одному консумеру останется только 2.
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39530459
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vimbaquestionerзачем нужен ключ вообще? я бы мог предположить, что для того, чтобы вычислить партишен, но зачем тогда констуктор партишен+ключ ?

Даже если явно указать партишен, ключ может быть ценнен сам по себе, допустим он нужен получателю. Это конечно немного надуманный кейс, потому что ничего не мешало бы засунуть ключ внутрь сообщения. А вот где реально может понадобится ключ, даже если он не участвует в расчете партиции это механизм Log Compaction - который сжимает логи по ключу, оставляя только самое последнее значение(не бойтесь LogCompaction по умолчанию выключен).

Ведь вроде как кафка работает быстро за счет того, что файлы только инкрементно пишутся.

Этот механизм работает в рамках топика или в рамках партиции?
vimbaquestionerЕсли не указать партишен, то в какой будет записано?

Если указан ключ и он не null, то партиция вычислиться по ключу, алгоритм хеширования по памяти точно не помню, но кажись murmur. Если ключи у вас будут null, то кафка сама будет выберать партиции, стараясь равномерно заполнять все.

Почему тогда есть конструктор только
key+partition
и нет просто
partition
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39530461
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видимо ответ на второй вопрос
VimbaВообще API конструирования ProducerRecord немного дебильный, поскольку поскольку все три параметра могут быть опциональны, тут лучше бы подошел билдер, но от скалистов хорошего кода сразу ждать не стоит, спасибо, что хоть java клиент написали.
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39530509
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Log Compaction в кафке работает также как и SSTable компакшн в кассандре, уже постфактум в бэкграунде, старые сегменты логов никак при этом не модифицируются, просто из нескольких старых сливается новый, при этом в новом сегменте будет только одна запись для каждого ключа. Вообще практическое применение Log Compaction для меня является загадкой, но я так думаю, что используется в архитектуре event sourcing, для сохранения снапшотов.
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39535422
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
public class CountryPartitioner implements Partitioner {
        private static Map<String,Integer> countryToPartitionMap;

        public void configure(Map<String, ?> configs) {
            ...
        }

        public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes,
                             Cluster cluster) {
            List partitions = cluster.availablePartitionsForTopic(topic);
            String valueStr = (String)value;
            String countryName = ((String) value).split(":")[0];
            if(countryToPartitionMap.containsKey(countryName)){
                //If the country is mapped to particular partition return it
                return countryToPartitionMap.get(countryName);
            }else {
                //If no country is mapped to particular partition distribute between remaining partitions
                int noOfPartitions = cluster.topics().size();
                return  value.hashCode()%noOfPartitions + countryToPartitionMap.size() ;
            }
        }

        public void close() {}
    }



вот тут в ветке else возвращается
Код: java
1.
value.hashCode()%noOfPartitions + countryToPartitionMap.size() ;



Что это вообще такое написано?

Код: java
1.
cluster.topics().size()



это же количество топиков во всём кластере. Как это связано с количеством партиций?


Даже если взять, что это количество партиций, то всё равно не понятно, что значит строка

Код: java
1.
 return  value.hashCode()%noOfPartitions + countryToPartitionMap.size() ;



Тут же явно можно вылезти за количество партиций

P.S.
partition метод возвращает идентификатор партиции как я понял. Они всегда начинаются с ноля
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39536045
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
up
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39536419
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Код абсолютно дебильный, но вы обратите внимание на то, что его писал индусс, я бы закрыл статью сразу после фото автора.
...
Рейтинг: 0 / 0
kafka - partition/topic/key
    #39536702
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerТут же явно можно вылезти за количество партиций

Ага, а еще и недолезть даже до нуля, выдав отрицательную партицию, потому что hashcode может вернуть отрицательное число, операция взятия остатка от деления отрицательного числа на положительное тоже даёт отрицательное число.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / kafka - partition/topic/key
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]