Kafka - 如何收看新消息

时间:2016-07-21 09:46:02

标签: php apache-kafka kafka-consumer-api

我有使用Kafka消息的PHP应用程序。 问题是如何知道Kafka中有新消息? 第一个解决方案是在PHP中创建使用者,然后在循环中运行它以检查新消息。像这样的东西

<?php

namespace MyAppBundle\Command;

use MyAppBundle\EventSourcing\EventSerializer\JSONEventSerializer;
use MyAppBundle\Service\EventProjectorService;
use MyAppBundle\Service\KafkaService;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Process\Exception\RuntimeException;

class EventCommand extends ContainerAwareCommand
{
    protected function configure()
    {
        $this
            ->setName('events:fetch');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        /** @var KafkaService $kafkaService */
        $kafkaService = $this->getContainer()->get('store_locator.kafka_service');
        /** @var EventProjectorService $eventProjector */
        $eventProjector = $this->getContainer()->get('store_locator.event_projector');

        while(1){
          $messages = $kafkaService->fetchEvents();

          foreach ($messages as $message) {
              $eventProjector->aggregate($message);
          }
        }
        $output->writeln("Finish");
    }
}

但我不喜欢它......还有其他方法吗?

如果没有更好的方法,如何让它继续运行?例如,当某些事情失败时。

1 个答案:

答案 0 :(得分:1)

据我所知,没有比无限循环更好的方法并继续检查新消息。一种常见的方法是让任务在经过一段时间或迭代次数后自行终止,然后使用supervisord之类的东西来检测死亡并使消费者复活,以防止它占用你所有的资源。 / p>