Skip to content

feat kafka: added seek functionality for consumer.#948

Closed
melonaerial wants to merge 33 commits into
userver-framework:developfrom
melonaerial:feat/add-kafka-seek
Closed

feat kafka: added seek functionality for consumer.#948
melonaerial wants to merge 33 commits into
userver-framework:developfrom
melonaerial:feat/add-kafka-seek

Conversation

@melonaerial

@melonaerial melonaerial commented Jun 13, 2025

Copy link
Copy Markdown
Contributor
  • Added Seek , SeekToBeginning , SeekToEnd, SeekToEnd functions to ConsumerScope class.
  • Also added setting RebalanceCallback for a consumer which is called after assign/revoke partitions occurs.

Note: by creating a PR or an issue you automatically agree to the CLA. See CONTRIBUTING.md. Feel free to remove this note, the agreement holds.

Comment thread kafka/include/userver/kafka/offset_range.hpp Outdated
Comment thread kafka/include/userver/kafka/exceptions.hpp
Comment thread kafka/include/userver/kafka/consumer_scope.hpp Outdated
Comment thread kafka/include/userver/kafka/consumer_scope.hpp Outdated
Comment thread kafka/include/userver/kafka/consumer_scope.hpp Outdated
Comment thread kafka/include/userver/kafka/consumer_scope.hpp Outdated
Comment thread kafka/src/kafka/impl/consumer_impl.cpp Outdated
Comment thread kafka/src/kafka/impl/consumer_impl.cpp
Comment thread kafka/src/kafka/impl/consumer_impl.cpp Outdated
Comment thread kafka/src/kafka/impl/consumer_impl.cpp Outdated
Comment thread kafka/include/userver/kafka/rebalance_types.hpp
Comment thread kafka/src/kafka/impl/consumer.cpp Outdated
Comment thread kafka/src/kafka/impl/consumer_impl.cpp Outdated
Comment thread kafka/src/kafka/impl/consumer_impl.cpp
Comment thread kafka/src/kafka/impl/consumer_impl.cpp
@melonaerial melonaerial changed the title Draft: feat kafka: added seek functionality for consumer. feat kafka: added seek functionality for consumer. Jun 28, 2025
if (event_type == kafka::RebalanceEventType::kAssigned) {
for (const auto& topic_partitions : partitions) {
UEXPECT_NO_THROW(consumer_scope.SeekToBeginning(
std::string(topic_partitions.topic), topic_partitions.partition_id, poll_timeout

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

давай тоже utils::zstring_view принимать, а то как-то неудобно выходит))

kafka::utest::Message{topic, "key", "value", 0, kHeaders},
kafka::utest::Message{topic, "key2", "value2", 0, kHeaders},
};
const std::uint64_t kMessagesToSkip = 1;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

давай сделаем 10 сообщений и 7 в skip

Comment on lines +394 to +395
static constexpr std::array kExpectedHeaders{kafka::HeaderView{"header-1", "value-1"}};
const std::vector<kafka::OwningHeader> kHeaders{kExpectedHeaders.begin(), kExpectedHeaders.end()};

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

это нужно?

Comment on lines +354 to +356
const std::array kMessages{
kafka::utest::Message{topic, "key", "value", 0, kHeaders},
kafka::utest::Message{topic, "key2", "value2", 0, kHeaders},

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. давай больше сообщений
  2. можем сделать два раза Receive? Сначала без сик, прочитываем всё до конца, потом делаем сик, потом заново всё прочитываем

});

const auto* err = rd_kafka_seek_partitions(
consumer_.GetHandle(), topic_partitions_list.GetHandle(), static_cast<int>(timeout.count())

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут получается 2 * timeout. В этом месте уже должно быть timeout - время на poll


// Added `rd_kafka_queue_poll` call to activate the assign operation
// if it is called from RebalanceCallback.
{ EventHolder event{rd_kafka_queue_poll(consumer_.GetQueue(), static_cast<int>(timeout.count()))}; }

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а если пришёл месседж в эвент? просто скрипнем?
выглядит как-то очень странно, кмк
а если вызывано не из rebalance callback?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так мы всё равно seek делаем, если мессадж ивент придёт, то нам как бы пофиг на него, мы на другой offset скачем же. Тут самое фиговое если ещё раз ребаланс прилетит, но после успешного assign и revoke такого быть не должно судя по всему.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants