代码之家  ›  专栏  ›  技术社区  ›  joesan

用于时间序列数据持久性的Apache Kafka

  •  8
  • joesan  · 技术社区  · 9 年前

    我们有一个通过HTTP接收时间序列数据的系统(比如系统a),该数据通过OpenTSDB的REST接口保存在OpenTSDB中。我现在想将Apache Kafka引入系统。我的想法是运行一个Kafka服务器,系统a在收到时间序列消息后,立即将该消息发布到Apache Kafka server。

    然后我可以让一个消费者从主题中读取数据并将这些数据写入OpenTSDB。我对这种方法有几个问题:

    关于生产者和消费者的架构:

    1. 我可以有一个独立的客户机吗?我可以在那里编写只从Kafka主题消费的消费者,并将消息写入OpenTSDB

    2. 制作人将是系统A的一部分,并将向各自的主题发布消息

    关于卡夫卡主题,时间序列数据是一些具有关键和价值的指标,其示例如下:

     "metric.metricType.tagName"
    

    我将拥有数百个甚至数千个不同的标记名。我如何构造这些信息,并将其表示为Apache Kafka中的主题。我不确定我可以创建的主题数量是否有限制。

    每个tagName应该有一个主题吗?如何划分主题?

    关于Apache Kafka分区,我有以下问题:

    1. 如果我有一个主题“topic a”,并将该主题的分区设置为4,并且如果我的制作人写入该分区,那么该主题的哪个分区中会有此消息?同一主题中的每个分区是否都有相同的消息?

    2. 如果我为这个分区主题编写了一个使用者,我的意思是,这个使用者将如何接收来自分区的消息?

    3. 如果这个分区主题有多个使用者,那么所有这些使用者会得到相同的消息吗?我的意思是,如果主题中有4个分区(TP1、TP2、TP3、TP4),我有4个消费者组(CG1、CG2、CG3、CG4),在每个消费者组中,我有一个消费者从各自的主题分区读取消息(C1从TP1读取,C2从TP2读取,依此类推)。如果我的所有用户组都将收到的消息写入同一个数据库,我会不会收到重复的消息?

    1 回复  |  直到 9 年前
        1
  •  6
  •   Marko Bonaci    9 年前

    我能有一个独立的客户端吗 从Kafka主题消费并将消息写入OpenTSDB?

    是的,我就是这么做的。一个独立的java应用程序(您可以称其为“java服务器应用程序”)。

    每个tagName应该有一个主题吗?

    如果您想将带有一个标签的邮件与其他标签的邮件区别对待,例如保留期、邮件大小(和 other topic-level settings )那么有一个单独的主题是有意义的,但如果你要有数千个标签,我宁愿不这样做。它可以只是消息中的一个简单字段。你可以有一个主题用于你的指标,然后,当你想添加其他类型的消息时(一旦你看到了好处,你肯定会想这样做),你可以为此创建一个不同的主题。您可以大致将主题视为数据库中的实体,但这是一个相当弱的比较,因为它取决于许多因素,如大小、传入率和类似的东西。没有一刀切的食谱,所以你必须问一个单独的、具体的问题,以及你拥有的所有参数。

    如何划分主题?

    分区是Kafka的消费并行机制(它们还促进了冗余,因为每个分区都是跨代理复制的,这取决于您选择的复制因子)。由于分区不能由多个使用者线程使用,所以您需要首先创建更多的分区(并开始使用较少的线程),以便以后可以将线程数增加到分区数。(此限制可能在最新的Kafka版本0.9中被取消。此规则适用于v0.8的低级消费者)。

    如果我有一个主题“主题a”,并为此将分区设置为4 主题,如果我的制作人写入这个分区,在哪个分区 这条消息是否可用?

    如果像您所描述的那样发布消息,您将不知道消息将在哪个分区中结束。 这是由生产者端的哈希决定的,默认的哈希机制是随机的(类似于“循环”)。 您可以通过确定将用于散列的属性来控制分区。E、 g.如果您包括 tag 在hash中,具有相同标记的所有消息都将始终指向同一分区。当您希望确保具有相同标签的消息以与放入Kafka(即生成)相同的顺序被消费时,这一点很重要。

    同一主题中的每个分区是否都有相同的消息?

    不,分区总是包含大致相等的主题消息子集(如果默认,则使用随机散列)。

    如果我为这个分区主题编写一个使用者 我的意思是,这个消费者会收到来自 隔断

    消息将被随机使用,因为使用者线程之间没有协调。当然,这是可以理解的,因为这将导致巨大的性能损失。

    如果这个分区主题有多个使用者 那些消费者得到了同样的信息?

    这取决于消费者群体。同一组中的所有使用者线程总共接收100%的消息(例如,4个使用者线程中的每一个都将从该主题获得25%的消息)。另一方面,如果您有两个不同组的消费者,他们将各自消费该主题中100%的消息。我想你可以从中推断出最后两个问题的答案,对吗?