可以用循环方式从卡夫卡读取水槽,火花,风暴吗?

时间:2015-11-03 20:23:09

标签: apache-kafka spark-streaming flume apache-storm round-robin

我有3个分区:0,1,2。因此消息可以归类为0,1,2。

例如:

分区0:0中的1条消息

分区1中的3条消息:111

分区2中的2条消息:22

如何使消费者按照012x12x1x的顺序使用消息(x表示当时没有消息)。消费消息的顺序如下:012121。 我想在C ++和Python中都这样做。纵观现有客户,消息可以循环方式生成,但不能以循环方式消费。

有什么想法吗?

Kafka消费者配置中存在partition.assignment.strategy(http://kafka.apache.org/documentation.html#consumerconfigs)。我正在寻找一些实现此配置的工具(,如flume,spark,storm )来读取kafka中的数据,重新排序它们,然后再次写入kafka。继续上面的例子。重新排序的消息如下所示: 012121(012x12x1x)

更新

现在,我可以在C ++ Kafka Client( https://github.com/edenhill/librdkafka )中执行此操作。

    for(int i = 0; i < 2; i++)
    {
        RdKafka::Message *msg = m_consumer->consume(m_topic, i, 1000);
        // Do something about msg here...
    }

输出:

Reading from 1=>4953---1---
Reading from 0=>46164---0---
Reading from 1=>4954---1---
Reading from 0=>46165---0---
Reading from 1=>4955---1---
Reading from 0=>46166---0---
Reading from 1=>4956---1---
Reading from 0=>46167---0---
Reading from 1=>4957---1---
Reading from 0=>46168---0---

1 个答案:

答案 0 :(得分:-1)

在Java中,您可以使用high level consumer

如果您使用相同的group.id来消耗同一进程中的所有3个分区,则可以创建3个充当消费者的工作线程,并以循环方式在它们之间循环。

据我所知,您明确提到Python和C ++是您的目标语言 根据我自己在Python方面的经验,这与Java中提供的高级消费者无关。

所以你可以以某种方式包装它,比如创建一个充当服务器的新Java进程,并通过这个过程消费消息,或者你可以尝试将高级消费者移植到Python和/或C ++。

另一种方法是使用每个分区,将数据写入MySQL(或任何其他RDBMS)等其他介质,并使用SQL来使用消息来执行循环,并最终从相关表中删除它们。 / p>

无论如何,我建议你重新考虑Kafka作为你的传输层。您的要求(以循环方式消费)与Kafka的核心设计/架构不一致。这就是为什么:
只要分区数小于消费者机器中的可用核心 - 那么就可以循环方式使用该单个(!)机器上的消息,就像我上面描述的那样。

然而,Kafka也是为(消费者的)分布式负载而设计的。这是为单个主题创建分区的动机。可扩展性是Kafka的一个关键概念。

因此,如果您的分区数超过了消费者计算机中的可用核心,则可能无法正确迭代分区并以循环方式使用消息。

示例:假设您在特定主题中有20个分区。本主题始终生成大量消息。现在让我们假设您有一台具有4个CPU内核的计算机可以从该主题中使用。根据设计,您一次最多可以使用4个分区。将其转换为循环消耗可以通过在内存中缓冲有意义的消息量或其他一些机制(可能导致其他问题,如延迟)来实现。当我们假设所有分区始终可用时,没有网络问题或磁盘问题对Kafka有影响。这就是为什么我认为&#34;加入&#34;将分区转换成其他一些消息流并不是一件容易的事情。