Возможным решением было бы сохранить те точки, с которых вы хотите, чтобы ваши разные потребители начинали, с помощью фиксации вручную, например, базы данных.
Таблица, которая будет выглядеть так:
Topic Partition Offset
topicA 0 112
topicA 1 125
topicB 0 2313
topicB 1 2984
topicB 2 2554
Это будут ваши "последние точки сброса" или позиции, с которых ваши потребители хотят начать. Проблема с subscribe()
методом, как вы правильно сказали, заключается в том, что он зависит от параметра group.id и играет в игру по перебалансировке и координации потребителя.
Чтобы получить из фиксированной точки (или набора точек в разных разделах), вы должны вместо этого позвонить на assign()
. С помощью этого метода вы сможете вручную указать список разделов для своих потребителей . Нет group.id, нет динамического назначения разделов и смещения загрузки, а это то, что вам нужно.
После назначения разделов вы должны позвонить на seek()
. При поиске вы сообщаете потребителю, с какого смещения вы хотите начать чтение с раздела, указанного в методе assign()
.
Например, чтобы начать чтение с «последних перезагрузок» из любой темы, вы должны сделать что-то вроде:
//seeking the last offset of topicA's partition0
public void setStartPosition(TopicPartition partition, long offset)
{
consumer.assign(Collections.singletonList(partition)); //f.e-> partition0
consumer.seek(partition, offset); //f.e -> 112
}
Вызов этого метода установит вашего потребителя точно в нужной позиции в каждом разделе. Я не совсем уверен, отвечаю ли я на вашу проблему, но надеюсь, что это поможет!