gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:08:41 24 4
gpt4 key购买 nike

我们有一个系统(比如系统 A)通过 HTTP 接收时间序列数据,并且这些数据通过 OpenTSDB 的 REST 接口(interface)被持久化在 OpenTSDB 中。我现在想将 Apache Kafka 引入系统。我的想法是让 Kafka 服务器运行,其中系统 A 一旦接收到时间序列消息,就会将此消息发布到 Apache Kafka 服务器。

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

关于构建生产者和消费者:

  • 我可以有一个独立的客户端,我将在其中编写仅从 Kafka 主题消费的消费者并将消息写入 OpenTSDB
  • 生产者将成为系统 A 的一部分,并将向相应主题发布消息

  • 对于 Kafka 主题,时间序列数据是一些具有键和值的指标,示例如下:
     "metric.metricType.tagName"

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

    每个 tagName 我应该有一个主题吗?划分主题有什么意义?

    关于 Apache Kafka 分区,我有以下问题:
  • 如果我有一个主题“Topic A”并为此主题设置了 4 个分区,并且如果我的生产者写入此分区,那么该消息在该主题的哪个分区中可用?同一主题内的每个分区是否都有相同的消息?
  • 如果我为这个分区主题编写一个消费者,这将如何表现,我的意思是,这个消费者会从分区接收消息吗?
  • 如果这个分区主题有多个消费者,所有这些消费者都会收到相同的消息吗?我的意思是如果主题中有 4 个分区(TP1、TP2、TP3、TP4)并且我有 4 个消费者组(CG1、CG2、CG3、CG4),在每个消费者组中,我有一个消费者从各自的主题分区(C1 从 TP1 读取,C2 从 TP2 读取等等)。如果我的所有消费者组都将收到的消息写入同一个数据库,我最终会收到重复的消息吗?
  • 最佳答案

    Can I have a standalone client where I will write consumers that just consume from the Kafka topic and write the messages into OpenTSDB?



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

    Should I have one topic per tagName?



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

    What is the deal with partitioning the topic?



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

    If I have a topic "Topic A" and have set partitions to 4 for this topic, and if my producer writes to this partition, in which partition of this topic will this message be available?



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

    Is the same message available across each partition within the same topic?



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

    If I write a consumer for this partitioned topic, how will this behave, I mean, will this consumer receive the message from the partition?



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

    If I have multiple consumers for this partitioned topic, will all of those consumers get the same messages?



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

    关于apache-kafka - 用于时间序列数据持久性的 Apache Kafka,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34715556/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com