当前位置: 首页 > 知识库问答 >
问题:

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

公羊光明
2023-03-14

我们有一个系统(例如系统a)通过HTTP接收时间序列数据,并且该数据通过OpenTSDB的REST接口持久化在OpenTSDB中。我现在想把阿帕奇Kafka引入系统。我的想法是运行一个Kafka服务器,系统a在接收到时间序列消息后立即将该消息发布到Apache Kafka服务器。

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

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

关于Kafka主题,时间序列数据是一些具有键和值的度量,其示例如下:

 "metric.metricType.tagName"

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

我应该有一个主题每个标签名?划分主题的处理方法是什么?

如果我为这个分区主题编写一个使用者,这将如何表现,我的意思是,这个使用者会收到来自分区的消息吗?

如果我对这个分区主题有多个消费者,所有这些消费者会得到相同的消息吗?我的意思是,如果主题中有4个分区(TP1、TP2、TP3、TP4),并且我有4个使用者组(CG1、CG2、CG3、CG4),在每个使用者组中,我有一个使用者从各自的主题分区读取消息(C1从TP1读取,C2从TP2读取,等等)。如果我的所有使用者组都将接收到的消息写入同一个数据库,我最终会有重复的消息吗?

共有1个答案

晏炳
2023-03-14

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

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

我应该有一个主题每个标签名?

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

如果我有一个主题“主题a”,并且已经为这个主题设置了分区为4,并且如果我的生产者写到这个分区,那么这个消息将在这个主题的哪个分区中可用?

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

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

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

如果我为这个分区主题编写一个使用者,这将如何表现,我的意思是,这个使用者会收到来自分区的消息吗?

 类似资料:
  • 我目前正在实现一个基于 JavaEE 的应用程序,其结构大致如下: webservice接收请求并将它们转发给实际的业务服务,然后业务服务通过DAO执行多个操作。重要的是,BusinessService必须使用只能通过业务代码表达的约束,而不是通过SQL约束(我们不希望实现复杂的数据库触发器或存储过程)来对照现有记录检查数据。在这种情况下,约束是没有两个数据集可能具有重叠有效性。 对于最小方案,代

  • 很难弄清楚我是在打虫子还是在做傻事... Spring Boot v2.0.0. M7,sping-data-jpa,sping-data-rest,MySQL 以下@Query 在一个上抛出一个 statusCode是一个varchar,本身作为@Entity按预期工作,但试图投影到字符串列表(或

  • 正如标题中所述,我正在使用Firebase实时数据库,并启用了持久性。

  • 问题内容: 东西没有被冲走。发生的情况的简化示例: 输出: 我不知道是否必须对Session和Transaction进行某些操作才能使数据持久化,或者这是GPar中的错误。在底层的hibernate级别发生了什么? 我希望最近创建的Person在并行闭包中可见。 问题答案: Gpars是一个多线程工具,并且在您的域类中注入的hibernate会话不是线程安全的。 尝试使用以下方法或直接调用Sess

  • 我每天都在cassandra中存储时间序列数据。我们希望每天归档/清除超过2天的数据。我们正在使用Hector API来存储数据。有人能建议我每天删除超过2天的cassandra数据的方法吗?对cassandra行使用TTL方法是不可行的,因为删除数据的天数是可配置的。现在表格中没有时间戳列。我们计划添加时间戳列。但问题是,时间戳不能单独用于where子句,因为这个新列不是主键的一部分。请提供您的

  • 问题内容: 从这里的讨论看来,Redux reducer的状态应该保留在数据库中。 用户身份验证在这种情况下如何工作? 是否不会创建新的状态对象来替换数据库中先前创建和编辑的每个用户(及其应用程序状态)的先前状态? 在前端使用所有这些数据并不断更新数据库中的状态是否会表现出色? 编辑: 我创建了一个示例Redux auth项目,该项目也恰好示例了通用Redux,并使用Redux,Socket.io