必要的参数
bootstrap.servers该参数为broker地址,不需要全部都填,因为kafka会从当前broker中获取其他broker信息。不过为了某个broker挂掉,一般填多个broker地址key.serializer消息key如何序列化value.serializer消息内容如何序列化
示例代码
Properties properties = new Properties();
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
生产者拦截器
在消息发送前,对消息进行处理,该动作发生在序列化器、分区器之前。
实现 org.apache.kafka.clients.producer.ProducerInterceptor 接口,即可自定义拦截器
介绍一下接口定义的方法
ProducerRecord<K, V> onSend(ProducerRecord<K, V> record)在消息发送之前,可以对消息进行处理void onAcknowledgement(RecordMetadata metadata, Exception exception消息被应答之前或者消息发送失败时被调用void close()producer被关闭时,会调用
kafka 允许配置拦截器链,多个拦截器用 , 号隔开即可。
properties.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, TestProducerInterceptor.class.getName() + "," + TestProducerInterceptor2.class.getName());
序列化
序列化发生在分区器之前
实现 org.apache.kafka.common.serialization.StringSerializer 接口即可自定义序列化
介绍一下接口定义的方法
-
void configure(Map<String, ?> configs, boolean isKey)在StringSerializer实现中,用于设置编码 -
byte[] serialize(String topic, String data)定义如何序列化 -
void close()producer关闭时,被调用
分区器
实现 org.apache.kafka.clients.producer.Partitioner 即可自定义分区器
kafka 可按 key 进行哈希(MurmurHash2),将消息发往同一个分区。如果未指定 key,那么将会把消息发往随机的一个分区。
介绍一下接口定义的方法
int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster)定义发往哪个分区;具体的实现可参考DefaultPartitionervoid close()producer关闭时,被调用
与 RocketMQ 异同
- 与
kafka一致,rocketMQ允许生产者将消息发送到指定的 'partition' 中 rocketMQ没有序列化器的概念。消息内容由rocketMQ自行序列化- 从个人目前的使用情况,
rocketMQ也没有提供类似拦截器概念 rocketMQ提供了hock以此在消息发送前,和消息发送后,对消息进行处理 例如:
DefaultMQProducer producer = new DefaultMQProducer("default");
producer.getDefaultMQProducerImpl().registerSendMessageHook(new SendMessageHook() {
@Override
public String hookName() {
return null;
}
@Override
public void sendMessageBefore(SendMessageContext context) {
}
@Override
public void sendMessageAfter(SendMessageContext context) {
}
});