Key*_*hah 5 php apache-kafka kafka-consumer-api apache-kafka-connect
我使用php-rdkafka作为 php kafka 客户端。我使用testgroup.成功生成了我的测试消息,并使用以下代码使用了消息,
$kafkaConsumer = new RdKafka\Consumer();
$kafkaConsumer->addBrokers("127.0.0.1:9292");
$topic = $kafkaConsumer->newTopic("test");
$topic->consumeStart(0, RD_KAFKA_OFFSET_BEGINNING);
while (true) {
$msg = $topic->consume(0, 1000);
if($msg){
if ($msg->err) {
echo $msg->errstr(), "\n";
break;
} else {
echo $msg->payload, "\n";
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我再次尝试在test组中设置消息并尝试为test组使用消息时,我收到旧消息和新消息。所以我只想知道如何确认旧消息,这样我只能收到新消息而不是旧消息?有人可以对此大放异彩吗?
我的卡夫卡版本是 0.11.0.1
在 Kafka 中确认消费消息的方法是提交其偏移量。这样,在重新启动消费者时,它可以检索上次提交的偏移量并从停止的地方重新启动。
正如评论中所建议的,您需要使用RD_KAFKA_OFFSET_STORED来指示消费者检索存储的偏移量。
但是您还需要通过设置group.id配置来提供组名:
<?php
$conf = new RdKafka\Conf();
// Set the group id. This is required when storing offsets on the broker
$conf->set('group.id', 'myConsumerGroup');
$rk = new RdKafka\Consumer($conf);
$rk->addBrokers("127.0.0.1:9292");
$topicConf = new RdKafka\TopicConf();
$topicConf->set('auto.commit.interval.ms', 100);
// Set where to start consuming messages when there is no initial offset in
// offset store or the desired offset is out of range.
// 'smallest': start from the beginning
$topicConf->set('auto.offset.reset', 'smallest');
$topic = $rk->newTopic("test", $topicConf);
// Start consuming partition 0
$topic->consumeStart(0, RD_KAFKA_OFFSET_STORED);
while (true) {
$message = $topic->consume(0, 120*10000);
switch ($message->err) {
case RD_KAFKA_RESP_ERR_NO_ERROR:
var_dump($message);
break;
case RD_KAFKA_RESP_ERR__PARTITION_EOF:
echo "No more messages; will wait for more\n";
break;
case RD_KAFKA_RESP_ERR__TIMED_OUT:
echo "Timed out\n";
break;
default:
throw new \Exception($message->errstr(), $message->err);
break;
}
}
?>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4101 次 |
| 最近记录: |