Kafka Consumer从多个主题中读取

时间:2015-06-09 22:47:16

标签: apache-kafka kafka-consumer-api

我对卡夫卡很新。我正在创建两个主题,并从两个制作人发布这两个主题。我有一个消费者使用这两个主题的消息。这是因为我想根据优先级进行处理。

我从这两个主题获得了一个流,但是一旦我开始迭代任何流的ConsumerItreator,它就会阻塞。正如它在文档中所写的那样,它会被阻塞,直到它收到新消息。

是否有人知道如何从单个Kafka消费者中读取两个主题和两个流?

Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
            topicCountMap.put(KafkaConstants.HIGH_TEST_TOPIC, new Integer(1));
            topicCountMap.put(KafkaConstants.LOW_TEST_TOPIC, new Integer(1));
            Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumerConnector.createMessageStreams(topicCountMap);
            KafkaStream<byte[], byte[]> highPriorityStream = consumerMap.get(KafkaConstants.HIGH_TEST_TOPIC).get(0);
            ConsumerIterator<byte[], byte[]> highPrioerityIterator = highPriorityStream.iterator();

            while (highPriorityStream.nonEmpty() && highPrioerityIterator.hasNext())
            {
                byte[] bytes = highPrioerityIterator.next().message();
                Object obj = null;
                CLoudDataObject thunderDataObject = null;
                try
                {

                    obj = SerializationUtils.deserialize(bytes);
                    if (obj instanceof CLoudDataObject)
                    {
                        thunderDataObject = (CLoudDataObject) obj;
                        System.out.println(thunderDataObject);
                        // TODO Got the Thunder object here, now write code to send it to Thunder service.
                    }

                }
                catch (Exception e)
                {
                }
            }

1 个答案:

答案 0 :(得分:0)

如果您不想在高优先级消息之前处理较低优先级的消息,那么如何设置consumer.timeout.ms属性并捕获ConsumerTimeoutException以检测高优先级的流是否到达最后一条可用消息?默认情况下,它会设置-1阻止,直到新消息到达。 (http://kafka.apache.org/07/configuration.html

下面介绍了一种以不同优先级同时处理多个流的方法。

Kafka需要多线程编程。在您的情况下,两个主题的流需要由流程的线程处理。因为每个线程将独立运行以处理消息,所以一个阻塞流(线程)不会影响其他流。

Java的ThreadPool实现可以帮助创建多线程应用程序。您可以在此处找到示例实现:

https://cwiki.apache.org/confluence/display/KAFKA/Consumer+Group+Example

关于执行的优先级,您可以调用Thread.currentThread.setPriority方法,根据其服务的Kafka主题获得正确的线程优先级。