Contenu connexe Similaire à PHP w kolejce, kolejka w PHP - jak wykorzystać moc Apache Kafka (20) PHP w kolejce, kolejka w PHP - jak wykorzystać moc Apache Kafka1. PHP W KOLEJCE, KOLEJKA W PHP
JAK WYKORZYSTAĆ MOC
APACHE KAFKA
PHPERS SUMMIT POZNAŃ 2019
16. PHP
PRODUCER (1)
$conf = new RdKafkaConf();
$conf->setErrorCb(function ($kafka, $err, $reason) {
# ...
});
$conf->setDrMsgCb(function ($kafka, $message) {
# ...
});
17. PHP
PRODUCER (2)
$rk = new RdKafkaProducer($conf);
$rk->addBrokers('localhost:9092');
$topicConf = new RdKafkaTopicConf();
$topicConf->set("message.timeout.ms", 2000);
/** @var RdKafkaProducerTopic $topic */
$topic = $rk->newTopic('sample', $topicConf);
19. PHP
CONSUMER (1)
$conf = new RdKafkaConf();
$conf->set('group.id', 'some-consumer-group');
$conf->set('metadata.broker.list', 'localhost:9092');
20. PHP
CONSUMER (2)
$conf->setRebalanceCb(function (RdKafkaKafkaConsumer $kafka, $err, array $partitions = null) {
switch ($err) {
case RD_KAFKA_RESP_ERR__ASSIGN_PARTITIONS:
$kafka->assign($partitions);
break;
case RD_KAFKA_RESP_ERR__REVOKE_PARTITIONS:
$kafka->assign(null);
break;
default:
echo 'Unexpected error in rebalance' . PHP_EOL;
break;
}
});
21. PHP
CONSUMER (3)
$topicConf = new RdKafkaTopicConf();
$topicConf->set('auto.commit.interval.ms', 100);
$topicConf->set('auto.offset.reset', 'latest');
$conf->setDefaultTopicConf($topicConf);
$consumer = new RdKafkaKafkaConsumer($conf);
$consumer->subscribe([$topic]);
22. PHP
CONSUMER (4)
while (true) {
$message = $consumer->consume(5 * 60000); # 5 minutes in ms
switch ($message->err) {
case RD_KAFKA_RESP_ERR_NO_ERROR:
echo '`' . $message->payload . '`' . PHP_EOL;
break;
case RD_KAFKA_RESP_ERR__TIMED_OUT:
break;
default:
echo 'Unexpected error' . PHP_EOL;
break;
}
}
25. KRUCZKI
• #consumer <= #partitions
• zapewnienie ponownego uruchomienia
• Jenkins Coordinator Plugin
ILOŚĆ
CONSUMERÓW
26. KRUCZKI
• 'auto.offset.reset' - consumer
• 'log.retention.hours' - broker
• 'offsets.retention.minutes' - broker
• auto.offset.reset => 'earliest'
• log.retention.hours <= offsets.retention.minutes
OFFSET CONFIG