如何同步生产者批处理消息?

时间:2014-06-18 18:29:12

标签: apache-kafka clj-kafka

我们使用的是Kafka 0.8异步生产者,但它正在丢弃消息(并且没有来自另一个线程的aysnc响应,或者我们可以继续使用异步)。

我们已将batch.num.messages设置为500,而我们的消费者并未改变。我读到batch.num.messages仅适用于异步生产者而不同步所以我需要自己批处理。我们正在使用compression.codec=snappy和我们自己的序列化程序类。

我的问题是双重的:

  • 我可以假设我可以使用自己的序列化程序类,然后自己发送消息吗?

  • 我是否需要担心Kafka可能使用的任何特殊的snappy选项/参数?

1 个答案:

答案 0 :(得分:7)

是的,因为batch.num.messages仅控制异步生产者的行为。在相关guide on parameters中明确说明了这一点:

  

使用异步模式时,在一个批处理中发送的消息数。生产者将等待,直到这个数量的消息准备好发送或达到queue.buffer.max.ms。

要为同步制作人进行批处理,您必须发送消息列表:

public void trySend(List<M> messages) {
    List<KeyedMessage<String, M>> keyedMessages = Lists.newArrayListWithExpectedSize(messages.size());
    for (M m : messages) {
        keyedMessages.add(new KeyedMessage<String, M>(topic, m));
    }
    try {
        producer.send(keyedMessages);
    } catch (Exception ex) {
        log.error(ex)
    }
}

请注意,我在这里使用kafka.javaapi.producer.Producer

执行send后,将发送批处理。

  

我可以假设我可以使用自己的序列化程序类然后自己发送消息吗?   我是否需要担心Kafka可能使用的任何特殊的snappy选项/参数?

压缩和序列化都是正交功能,不会影响批处理,但实际应用于单个消息。

请注意,将会有api更改,并且将统一async / sync api。