此处是kafka消费者代码:
<?php
$conf = new Rdkafka\Conf();
$conf->set('group.id', 0); // 设置组别id, 默认写0
$conf->set('metadata.broker.list', 'localhost:9092'); // 设置kafka地址及端口号 localhost可换成服>务器ip
$topicConf = new Rdkafka\topicConf();
$topicConf->set('auto.offset.reset', 'smallest');
//$topicConf->set('auto.offset.reset', 'latest');
// 设置自动提交为false
$conf->set('enable.auto.commit', 'false');
$conf->setDefaultTopicConf($topicConf);
$consumer = new Rdkafka\kafkaConsumer($conf);
$consumer->subscribe(['heima']); //订阅
echo "wating for message....\n";
while(true) {
// 消费数据,阻塞1秒(1秒内有数据就消费,没有数据等待1秒进入下一轮循环)
$message = $consumer->consume(1000);
switch ($message->err) {
case RD_KAFKA_RESP_ERR_NO_ERROR:
echo '要处理消息了~~~';
$messageInfo = $message->payload;
echo $messageInfo."\n";
// 提交位移
$consumer->commit($message);
break;
}
}
此处是kafka生产者代码
<?php
$conf = new RdKafka\Conf();
$tk = new RdKafka\Producer($conf);
// $tk->setLogLevel(LOG_DEBUG);
$tk->addBrokers("localhost:9092"); // 绑定kafka localhost可换成自己的服务器ip
$cf = new RdKafka\TopicConf();
//0:这意味着生产者producer不等待来自broker同步完成的确认继续发送下一条(批)消息。此选项提供最低的延迟但最弱的耐久性保证(当服务器发生故障时某些数据会丢失,如leader已死,但producer并不知情,发出去的信息broker就收不到)。
//1:这意味着producer在leader已成功收到的数据并得到确认后发送下一条message。此选项提供了更好的耐久性为客户等待服务器确认请求成功(被写入死亡leader但尚未复制将失去了唯一的消息)。
//-1:这意味着producer在follower副本确认接收到数据后才算一次发送完成。 此选项提供最好的耐久性,我们保证没有信息将丢失,只要至少一个同步副本保持存活
$cf->set('request.required.acks', -1);
$topic = $tk->newTopic('heima',$cf); // 绑定topic
$msg = empty($_GET['msg']) ? 'empty' : $_GET['msg'];
//for($i=0;$i<10;$i++){
// $result = $topic->produce(RD_KAFKA_PARTITION_UA, 0, $msg.$i);
//}
$result = $topic->produce(RD_KAFKA_PARTITION_UA, 0, time()); // 发送消息给kafka服务器
$tk->flush(300);
sleep(1);
$tk->poll(300);
var_dump($result);
echo 'done';