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