Files
kiri-core/Kafka/Kafka.php
T

115 lines
2.4 KiB
PHP
Raw Normal View History

2020-10-09 16:34:33 +08:00
<?php
namespace Kafka;
use Snowflake\Exception\ConfigException;
use Snowflake\Snowflake;
2020-10-10 13:55:14 +08:00
use Swoole\Coroutine;
2020-10-10 11:30:10 +08:00
use Swoole\Coroutine\Channel;
use Swoole\Coroutine\WaitGroup;
2020-10-09 16:34:33 +08:00
use Swoole\Process;
use Snowflake\Abstracts\Config as SConfig;
2020-10-10 13:55:14 +08:00
use function Amp\stop;
2020-10-09 16:34:33 +08:00
/**
* Class Queue
* @package Queue
*/
class Kafka extends \Snowflake\Process\Process
{
2020-10-10 11:30:10 +08:00
/** @var Channel */
protected $channel;
2020-10-09 16:34:33 +08:00
/**
* @throws ConfigException
*/
2020-10-10 11:30:10 +08:00
public function initConfig()
2020-10-09 16:34:33 +08:00
{
$kafka = SConfig::get('kafka');
2020-10-10 13:55:14 +08:00
$config = ConsumerConfig::getInstance();
2020-10-09 16:34:33 +08:00
$config->setMetadataRefreshIntervalMs(
$kafka['metadataRefreshIntervalMs'] ?? 1000
);
$config->setMetadataBrokerList($kafka['brokers']);
$config->setGroupId($kafka['groupId']);
$config->setBrokerVersion($kafka['version']);
$config->setTopics($kafka['topics']);
2020-10-12 12:56:07 +08:00
$this->channelListener($kafka);
2020-10-12 11:59:42 +08:00
return [new Consumer(), $kafka];
2020-10-10 11:30:10 +08:00
}
/**
* @param Process $process
* @throws ConfigException
*/
public function onHandler(Process $process)
{
2020-10-12 11:59:42 +08:00
[$consumer, $kafka] = $this->initConfig();
2020-10-12 11:51:49 +08:00
if ($kafka['debug'] ?? true) {
$consumer->setLogger(new Logger());
}
2020-10-09 16:34:33 +08:00
$consumer->start(function ($topic, $part, $message) {
2020-10-10 11:30:10 +08:00
$this->channel->push([$topic, $part, $message]);
});
}
/**
2020-10-10 11:33:11 +08:00
* 监听通道数据传递
2020-10-12 12:56:07 +08:00
* @param $config
2020-10-10 11:30:10 +08:00
*/
2020-10-12 12:56:07 +08:00
public function channelListener($config)
2020-10-10 11:30:10 +08:00
{
2020-10-12 12:57:32 +08:00
if (!isset($config['size'])) {
$config['size'] = 100;
}
$this->channel = new Channel($config['size']);
2020-10-12 12:56:07 +08:00
Coroutine::create(function () use ($config) {
2020-10-10 13:55:14 +08:00
$group = new WaitGroup();
2020-10-12 12:57:32 +08:00
for ($i = 0; $i < $config['size']; $i++) {
2020-10-12 12:51:59 +08:00
$group->add();
go(function () use ($group) {
2020-10-12 12:56:29 +08:00
defer(function () use ($group) {
$group->done();
});
2020-10-12 12:59:29 +08:00
while ($messages = $this->channel->pop()) {
$this->handlerExecute($messages[0], $messages[1], $messages[2]);
2020-10-12 12:51:59 +08:00
}
});
2020-10-10 13:55:14 +08:00
}
$group->wait();
});
}
/**
* @param $topic
* @param $part
* @param $message
*/
2020-10-12 12:54:19 +08:00
protected function handlerExecute($topic, $part, $message)
2020-10-10 13:55:14 +08:00
{
try {
$namespace = 'App\\Kafka\\' . ucfirst($topic) . 'Consumer';
if (!class_exists($namespace)) {
return;
}
$class = Snowflake::createObject($namespace);
if (!($class instanceof ConsumerInterface)) {
return;
2020-10-09 17:10:45 +08:00
}
2020-10-12 12:54:19 +08:00
$class->onHandler(new Struct($topic, $part, $message));
2020-10-10 13:55:14 +08:00
} catch (\Throwable $exception) {
$this->application->error($exception->getMessage());
2020-10-10 11:33:11 +08:00
}
2020-10-09 16:34:33 +08:00
}
2020-10-10 11:30:10 +08:00
2020-10-09 16:34:33 +08:00
}