我们有一个系统(比如系统A)通过HTTP接收时间序列数据,这个数据通过OpenTSDB的REST接口保存在OpenTSDB中。我现在想将Apache Kafka引入系统。我的想法是运行Kafka服务器,系统A一接收到时间序列消息,就会将此消息发布到Apache Kafka服务器。
然后,我可以让消费者从主题中读取并将此数据写入OpenTSDB。我对这种方法有几个问题:
关于制作人和消费者的架构:
我是否可以拥有一个独立的客户端,我将编写仅使用Kafka主题的消费者并将消息写入OpenTSDB
制作人将成为系统A的一部分,并将发布消息到相应的主题
关于Kafka主题,时间序列数据是一些具有键和值的指标,其示例如下:
"metric.metricType.tagName"
我将拥有数百甚至数千种不同的tagNames。如何构建此信息并将其表示为Apache Kafka中的主题。我不确定我可以创建的主题数量是否有限制。
每个tagName应该有一个主题吗?分区主题的处理方式是什么?
关于Apache Kafka分区,我有以下问题:
如果我有一个主题“主题A”,并为此主题设置了分区4,如果我的生产者写入此分区,该主题的哪个分区将显示此消息?同一主题中的每个分区是否都有相同的消息?
如果我为这个分区主题编写消费者,我的意思是,这个消费者将如何接收来自分区的消息?
如果此分区主题有多个消费者,那么所有消费者都会收到相同的消息吗?我的意思是如果主题中有4个分区(TP1,TP2,TP3,TP4),我有4个消费者组(CG1,CG2,CG3,CG4),在每个消费者组中,我有一个消费者从中读取消息相应的主题分区(C1从TP1读取,C2从TP2读取,依此类推)。如果我的所有消费者组都将收到的消息写入同一个数据库,我是否会收到重复的消息?
答案 0 :(得分:5)
我可以拥有一个独立的客户端,我只会写消费者 使用Kafka主题并将消息写入OpenTSDB?
是的,我就是这样做的。一个独立的Java应用程序(您可以将其称为“Java服务器应用程序”)。
每个tagName应该有一个主题吗?
如果您想要使用一个标记来处理与其他标记不同的邮件,例如保留,邮件大小(和other topic-level settings)那么有一个单独的主题是有意义的,但如果你要有数千个标签,我宁愿不这样做。它可以只是消息中的一个简单字段。您可以有一个主题用于指标,然后,当您想要添加其他类型的消息时(一旦看到好处,您肯定希望这样做),您可以创建一个不同的主题那。您可以粗略地将主题视为数据库中的实体,但这是一个相当弱的比较,因为它取决于许多因素,如大小,传入速率和类似的东西。没有一个通用的配方,所以你必须提出一个单独的,具体的问题,以及你拥有的所有参数。
分区主题的处理方式是什么?
分区是Kafka的消费并行机制(它们也有助于冗余,因为每个分区都在代理之间复制,具体取决于您选择的复制因子)。由于分区不能被多个消费者线程使用,因此您最初需要创建更多分区(并开始使用较少数量的线程),以便以后可以将线程数增加到分区数。 (这个限制可能在最新的Kafka版本中被取消,0.9。此规则适用于v0.8的低级别消费者。)
如果我有一个主题“主题A”并为此设置分区为4 主题,如果我的生产者写入这个分区,在哪个分区 该主题是否可以使用此消息?
如果您发布上述消息,则无法知道消息最终会在哪个分区中显示。
这是由生产者端的散列决定的,默认散列机制是随机的(类似“循环”)。
您可以通过确定将用于散列的属性来控制分区。例如。如果您在哈希中包含tag
,则具有相同标记的所有邮件将始终转到同一分区。当您想要确保具有相同标签的消息按照它们放入Kafka(即生成的)的相同顺序消耗时,这很重要。
同一主题中的每个分区是否都有相同的消息?
不,分区总是包含大致相同的主题消息子集(如果使用默认值,则使用随机散列)。
如果我为这个分区主题编写消费者,这将是怎样的 我的意思是,这个消费者会收到来自的消息 分区?
消息将随机消耗,因为消费者线程之间没有协调。当然,可以理解,因为这会导致巨大的性能损失。
如果我有这个分区主题的多个消费者,那么全部 那些消费者会收到相同的消息吗?
这取决于消费者群体。同一组中的所有消费者线程总共接收100%的消息(例如,4个消费者线程中的每一个将从该主题获得25%的消息)。另一方面,如果您有2个具有不同组的消费者,他们将分别消耗该主题的100%消息。我想你可以从中推断出你最后两个问题的答案,对吗?