2018-07-27-producer
https://blog.csdn.net/cjf_wei/article/details/77920435
Producer是一個用於向kafka叢集傳送資料的Java客戶端
//建立kafka producer
Properties props = new Properties();
props.put("bootstrap.servers", "192.168.137.200:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
// KafkaProducer物件例項化方法,可以使用map形式的鍵值對或者Properties物件來配置客戶端的屬性
Producer procuder = new KafkaProducer(props);
producer包含一個用於儲存待傳送訊息的緩衝池,
緩衝池中訊息是還沒來得及傳輸到kafka叢集的訊息。
位於底層的kafka I/O執行緒負責將緩衝池中的訊息轉換成請求傳送到叢集。
如果在結束produce時,沒有呼叫close()方法,那麼這些資源會發生洩露。
bootstrap.servers:用於初始化建立連結到kafka叢集,以host:port形式,多個以逗號分隔host1:port1,host2:port2;
acks: 生產者需要server端在 接收到訊息後,進行反饋確認的尺度,主要用於訊息的可靠性傳輸;acks=0表示生產者不需要來自server的確認;acks=1表示server端將訊息儲存後即可傳送ack,而不必等到其他follower角色都收到了該訊息;acks=all(or acks=-1)意味著server端將等待所有的副本都被接收後才傳送確認。
retries:生產者傳送失敗後,重試的次數
batch.size:當多條訊息傳送到同一個partition時,該值控制生產者批量傳送訊息的大小,批量傳送可以減少生產者到服務端的請求書,有助於提高客戶端和服務端的效能。
linger.ms:預設情況下緩衝區的訊息會被立即傳送到服務端,即使緩衝區的空間並沒有被用完。可以將該值設定為大於0的值,這樣傳送者將等待一段時間後,再向服務端傳送請求,以實現每次請求可以儘可能多的傳送批量訊息。
batch.size和linger.ms是兩種實現讓客戶端每次請求儘可能多的傳送訊息的機制,它們可以並存使用,並不衝突。
buffer.memory:生產者緩衝區的大小,儲存的是還未來得及傳送到server端的訊息,如果生產者的傳送速度大於訊息被提交到server端的速度,該緩衝區將被耗盡。
key.serializer,value.serializer說明了使用何種序列化方式將使用者提供的key和vaule值序列化成位元組。
/**record:key-value形式的待傳送資料 *callback:到傳送的訊息被borker端確認後的回撥函式*/
public Future<RecordMetadata> send(ProducerRecord<K,V> record); // Equivalent to send(record, null)
public Future<RecordMetadata> send(ProducerRecord<K,V> record,Callback callback);
send方法負責將緩衝池中的訊息 非同步傳送到broker的指定topic中,
非同步傳送是指,方法將訊息儲存到底層待傳送的I/O快取後,將立即返回,這可以實現並行無阻塞的傳送更多訊息。
send方法的返回值是RecordMatadata型別,它含有訊息將被投遞的partition訊息,該條訊息的offset,以及時間戳。
因為send返回的是Future物件,因此在該物件上呼叫get()方法將阻塞,直到相關的傳送請求完成並返回後設資料資訊;或者在傳送時丟擲異常而退出。
1、阻塞
2、利用回撥函式和非同步傳送方式來確認訊息傳送的進度
flush:立即傳送快取資料
public void flush
呼叫該方法將使得緩衝區的所有訊息被立即傳送(即使linger.ms引數被設定為大於0),
且會阻塞直到這些相關訊息的傳送請求完成。
flush方法的前置條件是:之前傳送的所有訊息請求已經完成。
一個請求被視為完成是指:根據acks引數配置項收到了相應的確認,或者傳送中丟擲異常失敗了。
partitionsFor
//獲取指定topic的partition後設資料資訊
public List<PartitionInfo> partitionsFor(String topic);
close
//關閉producer,方法將被阻塞,直到之前的傳送請求已經完成
public void close();// equivalent to close(Long.MAX_VALUE, TimeUnit.MILLISECONDS)
public void close(long timeout,TimeUnit timeUnit); //同上,方法將等待timeout時長,以讓未完成的請求完成傳送