kafka producer总结

Kafka producer的ack的3种机制:

通过初始化producer时的producerconfig可以通过配置request.required.acks不同的值来实现。
0:这意味着生产者producer不等待来自broker同步完成的确认就继续发送下一条(批)消息。
      此选项提供最低的延迟但最弱的耐久性保证,因为其没有任何确认机制。
1:这意味着producer在leader已成功收到的数据并得到确认后发送下一条消息。
     等待leader的确认后就返回,而不管partion的follower是否已经完成。
-1:这意味着producer在follower副本确认接收到数据后才算一次发送完成。
      此选项提供最好的耐久性,我们保证没有信息将丢失,只要至少一个同步副本保持存活。


producer的同步异步机制:

通过配置producer.type的值来确定是异步还是同步,默认为同步。async/sync 默认是sync。

如果设置为异步,那么提供了批量发送的功能:

当满足以下其中一个条件的时候就触发发送

batch.num.messages 异步发送 每次批量发送的条目 ;

queue.buffering.max.ms 异步发送的时候 发送时间间隔 单位是毫秒。

其次,异步发送消息的实现很简单,客户端消息发送过来以后,先放入到一个队列中然后就返回了。Producer再开启一个线程(ProducerSendThread)不断从队列中取出消息,然后调用同步发送消息的接口将消息发送给Broker。


producer的分区partion发送:

为了负载均衡一个topic可能会有多个partition,不同的partition存在在不同的broker里面,因此可以设定一定的partition的规则来确定什么样的消息发送到那个partition当中,代码如下:

public class CustomizePartitioner implements Partitioner {  
	
    public CustomizePartitioner(VerifiableProperties props) {  
   
    }  
    
    /** 
     * 返回分区索引编号 
     * @param key sendMessage时,输出的partKey 
     * @param numPartitions topic中的分区总数 
     * @return 
     */  
    @Override  
    public int partition(Object key, int numPartitions) {  
    	System.out.println("key:" + key + "  numPartitions:" + numPartitions);  
        String partKey = (String)key;  
        if ("part2".equals(partKey))  
            return 2;  
        return 0;  
    }  
}


partition当中的metadata.broker.list:

该选项用于存放broker的元信息,官方翻译如下:

这个选项是用于一个producer启动的时候,在启动的时候producer会通过这个选项配置的broker的地址去获取元信息(topics, partitions and replicas)。她的格式如下,host1:port1,host2:port2。这个list可以是一个broker集合的子集。


需要注意的是producer是如何动态获取集群中的broker信息的变化呢,它又没有和zookeeper进行交互?

1,producer没有直接和zookeeper进行通信,但是broker集群会和zookeeper进行进行通信,然后broker集群会把元信息返回给producer;

2,producer在调用send方法的时候会去定时的刷新metadata信息(这自己又些以为,不太明白producer的定时刷新的机制)

3,由于在调用send之前可能会刷新metadata信息,因此可能会有一些延迟。如果不想要该延迟,把topic.metadata.refresh.interval.ms值改为-1,这样只有在发送失败时,才会重新刷新。Kafka的集群中如果某个partition所在的broker挂了,可以检查错误后重启重新加入集群,手动做rebalance,producer的连接会再次断掉,直到rebalance完成,那么刷新后取到的连接着中就会有这个新加入的broker。


除了上面说的之外,kafka还提供了新的producer写法,见http://kafka.apache.org/documentation.html#producerapi


参考
http://kafka.apache.org/08/configuration.html
http://www.oschina.net/translate/kafka-design?lang=chs&page=4#
http://blog.csdn.net/lizhitao/article/details/38438123
http://blog.csdn.net/jewes/article/details/42809641
http://blog.csdn.net/tzwjava/article/details/39930715

你可能感兴趣的:(分布式)