【问题标题】:Kafka Streams: Object creationKafka Streams:对象创建
【发布时间】:2018-07-24 14:36:44
【问题描述】:

假设我们将 DEFAULT_VALUE_SERDE_CLASS_CONFIG 设置为 Serdes.ByteArraySerde,并假设在拓扑中没有指定进一步的覆盖并且正在使用默认的覆盖,它是否会为正在处理的每条消息创建一个 byte[] 数组类型的新对象?从主题反序列化?此外,这种行为在从状态存储中检索时是否适用,这意味着它会创建 byte[] 数组类型的新对象吗?

或者它会重复使用与每个流线程对应的相同对象吗?

【问题讨论】:

  • Kafka Streams 不会重复使用该对象,而是每次都创建一个新对象。

标签: apache-kafka apache-kafka-streams


【解决方案1】:

Kafka 流使用 serdes 来序列化/反序列化对象,只要它们需要持久化或从状态存储中读取。要在 kafka-stream 流中使用此类对象,您通常会定义一个 DTO,可能会有不同的 DTO,并且默认情况下通常是一个,如果没有另外指定,则使用默认 DTO。有不同的技术可以实现这一点,各有利弊,例如,可以满足您需求的一种方法是使用 ObjectMapper。除非您想在字节级别而不是在类中定义为 dto 的对象级别工作,否则使用 Serdes.ByteArraySerde 似乎不是很有用。

【讨论】:

  • 嗨 jmostalet,我对上述理解很好,但我的问题与对象创建有关,因为来自 Kafka 的每条记录都将被转换为新的 DTO 对象。我的问题是,是否可以重用同一个对象来保存在每个流线程中按顺序处理的不同记录
  • 我不确定我是否理解您的问题。您定义一个 DTO 类,kafka 将在每次需要时在反序列化器中创建该类的新实例,每个对象都是一条记录,您必须在拓扑中处理记录流。
  • 主题 -> 分区 0 -> 线程 1 -> 序列化器/反序列化器。在这种情况下,我们知道单个线程一次只能处理一条记录。我想知道是否有一种方法可以为每条记录使用相同的对象,即不断为各种记录重新初始化同一个对象(DTO),而不是为每条记录重新初始化新对象,因为给定的线程只会处理记录一次。同样,每个线程可以有一个对象 (DTO)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 2018-08-23
相关资源
最近更新 更多