greensight/laravel-phprdkafka

此包已被废弃,不再维护。作者建议使用 ensi/laravel-phprdkafka 包。

Laravel 和 php-rdkafka 之间的桥接包

0.1.4 2021-04-07 18:03 UTC

This package is auto-updated.

Last update: 2021-10-05 15:52:29 UTC


README

已弃用,请使用 https://github.com/ensi-platform/laravel-php-rdkafka 代替

此包允许您在 config/kafka.php 中描述 Kafka 生产者和消费者,然后在任何地方重用它们。

安装

您可以通过 composer 安装此包

composer require greensight/laravel-phprdkafka

使用以下命令发布配置文件

php artisan vendor:publish --provider="Greensight\LaravelPhpRdKafka\LaravelPhpRdKafkaServiceProvider" --tag="kafka-config"

现在前往 config/kafka.php 并在那里配置您的生产者和消费者。您通常需要一个生产者/消费者对应一个 Kafka 集群。配置参数可以在 Librdkafka 配置参考 中找到

使用

生产者示例

$producer = \Kafka::producer('producer-name'); // returns a configured RdKafka\Producer singleton.
// or $producer = \Kafka::producer(); if you want to get the default producer.
// or $producer = $kafkaManager->producer(); where $kafkaManager is an instance of Greensight\LaravelPhpRdKafka\KafkaManager resolved from the service container.

// now you can implement any producer logic e.g:

$headers = [];
$topicName = 'test-topic';
$topic = $producer->newTopic($topicName);
for ($i = 0; $i < 10; $i++) {
   $payload = json_encode([
      'body' => "Message $i in topic [$topicName]",
      'headers' => $headers
   ]);
   $topic->produce(RD_KAFKA_PARTITION_UA, 0, $payload);
   $producer->poll(0);
}

for ($flushRetries = 0; $flushRetries < 10; $flushRetries++) {
   $result = $producer->flush(10000);
   if (RD_KAFKA_RESP_ERR_NO_ERROR === $result) {
      break;
   }
}
if (RD_KAFKA_RESP_ERR_NO_ERROR !== $result) {
   // Log and/or throw "Unable to flush Kafka producer, messages of topic [$topicName] might be lost.' exception.
}

// If you use php-fpm and producing is slow you can move its execution to the place after response has been sent. 
// This can be achieved e.g. by wrapping the whole producing or at least flushing in it in a "terminating" callback.
// app()->terminating(function () { ... });

消费者示例

public function handle(KafkaManager $kafkaManager)
{
   $consumer = $kafkaManager->consumer('consumer-name');
   $consumer->subscribe(['test-topic-1', 'test-topic-2']);

   while (true) {
      $message = $consumer->consume(120*1000);
      switch ($message->err) {
            case RD_KAFKA_RESP_ERR_NO_ERROR:
               $this->info($message->payload);
               $this->processMessage($message); // do something with the message
               // $consumer->commitAsync($message); // commit offsets asynchronously if you set 'enable.auto.commit' => false, in config/kafka.php
               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:
               // this also happens when there is no new messages in the topic after the specified timeout: https://github.com/arnaud-lb/php-rdkafka/issues/343
               echo "Timed out\n";
               break;
            default:
               throw new Exception($message->errstr(), $message->err);
               break;
      }
   }
}

您可以在 php-rdkafka 示例 中了解更多关于 php-rdkafka 生产者和消费者的信息

以下 getter 可用于直接访问 RdKafka\Conf 实例

$producerConf = $kafkaManager->producerConfig('producer-name');
$consumerConf = $kafkaManager->consumerConfig('consumer-name');

测试

composer test

变更日志

请参阅 CHANGELOG 了解最近有哪些变化。

许可

MIT 许可证 (MIT)。请参阅 许可文件 了解更多信息。