我们使用的是Kafka 0.8异步生产者,但它正在丢弃消息(并且没有来自另一个线程的aysnc响应,或者我们可以继续使用异步)。
我们已将batch.num.messages
设置为500,而我们的消费者并未改变。我读到batch.num.messages
仅适用于异步生产者而不同步所以我需要自己批处理。我们正在使用compression.codec=snappy
和我们自己的序列化程序类。
我的问题是双重的:
我可以假设我可以使用自己的序列化程序类,然后自己发送消息吗?
我是否需要担心Kafka可能使用的任何特殊的snappy选项/参数?
答案 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。