Kafka 1.0.0 多消費者示例
package kafka.demo; import java.util.HashMap; import java.util.Map; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord; /** * * <p>Description: kafka 1.0.0</p> * @author guangshihao * @date 2018年9月19日 * */ public class KafkaProduderDemo { public static void main(String[] args) { Map<String,Object> props = new HashMap<>(); /* * acks,設定傳送資料是否需要服務端的反饋,有三個值0,1,-1 * 0,意味著producer永遠不會等待一個來自broker的ack,這就是0.7版本的行為。 * 這個選項提供了最低的延遲,但是持久化的保證是最弱的,當server掛掉的時候會丟失一些資料。 * 1,意味著在leader replica已經接收到資料後,producer會得到一個ack。 * 這個選項提供了更好的永續性,因為在server確認請求成功處理後,client才會返回。 * 如果剛寫到leader上,還沒來得及複製leader就掛了,那麼訊息才可能會丟失。 * -1,意味著在所有的ISR都接收到資料後,producer才得到一個ack。 * 這個選項提供了最好的永續性,只要還有一個replica存活,那麼資料就不會丟失 */ props.put("acks", "1"); //配置預設的分割槽方式 props.put("partitioner.class", "org.apache.kafka.clients.producer.internals.DefaultPartitioner"); //配置topic的序列化類 props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); //配置value的序列化類 props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); /* * kafka broker對應的主機,格式為host1:port1,host2:port2 */ props.put("bootstrap.servers", "bigdata01:9092,bigdata02:9092,bigdata03:9092"); //topic String topic = "test7"; KafkaProducer< String, String> producer = new KafkaProducer< String, String>(props); for(int i = 1 ;i <= 100 ; i++) { String line = i+" this is a test "; ProducerRecord<String,String> record = new ProducerRecord<String,String>(topic,line ); producer.send(record); } producer.close(); } }
package kafka.demo; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.errors.WakeupException; public class MutilConsumerThread implements Runnable{ private AtomicBoolean closed = new AtomicBoolean(false); KafkaConsumer<String, String> consumer = null; String topic = null; public MutilConsumerThread(KafkaConsumer<String, String> consumer,List<String> topic) { this.consumer=consumer; consumer.subscribe(topic); } public void run() { try{ while(!closed.get()) { ConsumerRecords<String, String> records = consumer.poll(1000); for(ConsumerRecord<String, String> record: records) { //一組consumer的時候每個partition對應的執行緒是固定的 System.out.println("Thread-Name:"+Thread.currentThread().getName()+" "+"partition:"+record.partition()+" "+record.value()); } } }catch(WakeupException e ) { if(!closed.get()) throw e; }finally { consumer.close(); } } public void shutdown() { closed.set(true); consumer.wakeup(); } }
package kafka.demo; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.kafka.clients.consumer.KafkaConsumer; public class MutiConsumerTest { public static void main(String[] args) throws InterruptedException { Properties props = new Properties(); props.put("bootstrap.servers", "bigdata01:9092,bigdata02:9092,bigdata03:9092"); props.put("group.id", "group_test7"); //配置topic的序列化類 props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); //配置value的序列化類 props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); //自動同步offset props.put("enable.auto.commit","true"); //自動同步offset的時間間隔 props.put("auto.commit.intervals.ms", "2000"); //當在zookeeper中發現要消費的topic沒有或者topic的offset不合法時自動設定為最小值,可以設的值為 latest, earliest, none,預設為largest props.put("auto.offset.reset", "earliest"); String topic = "test7"; List<MutilConsumerThread> consumers = new ArrayList<>(); ExecutorService es = Executors.newFixedThreadPool(3); for(int i = 0 ;i<=2;i++) { KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props); MutilConsumerThread cThread = new MutilConsumerThread(consumer,Arrays.asList(topic)); consumers.add(cThread); es.submit(cThread); } //Thread.sleep(1000L); /* 這個方法的意思就是在JVM中增加一個關閉的鉤子,當JVM關閉的時候, 會執行系統中已經設定的所有透過方法addShutdownHook新增的鉤子,當系統執行完這些鉤子後, JVM才會關閉。所以這些鉤子可以在JVM關閉的時候進行記憶體清理、物件銷燬等操作。*/ Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { for(MutilConsumerThread consumer :consumers ) { consumer.shutdown(); } } }); } }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31506529/viewspace-2214874/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Kafka 1.0.0 d程式碼示例Kafka
- Kafka 消費者解析Kafka
- Kafka 消費組消費者分配策略Kafka
- Java多執行緒——生產者消費者示例Java執行緒
- kafka消費者消費訊息的流程Kafka
- Kafka 消費者組 RebalanceKafka
- 「Kafka應用」消費者Kafka
- kafka_2.11-0.10.2.1 的生產者 消費者的示例(new producer api)KafkaAPI
- kafka消費者客戶端Kafka客戶端
- Apache Kafka消費者再平衡 | TechMyTalkApacheKafka
- Kafka入門(4):深入消費者Kafka
- 無鏡--kafka之消費者(四)Kafka
- kafka消費Kafka
- Python指令碼消費多個Kafka topicPython指令碼Kafka
- kafka多執行緒順序消費Kafka執行緒
- kafka消費者提交方式(程式碼演示)Kafka
- 使用多執行緒增加kafka消費能力執行緒Kafka
- 探索Kafka消費者的內部結構Kafka
- spring-kafka多執行緒順序消費SpringKafka執行緒
- 「Kafka應用」PHP實現生產者與消費者KafkaPHP
- Kafka中消費者延遲處理訊息Kafka
- 從消費者角度比較Kafka 與 RabbitMQ - OpenCredoKafkaMQ
- 阿里雲 KAFKA 消費者接收不到訊息阿里Kafka
- Kafka - 消費錯誤問題,多臺機器上面無法消費資料Kafka
- RabbitMQ多消費者順序性消費訊息實現MQ
- 插曲:Kafka的生產者案例和消費者原理解析Kafka
- SpringBoot整合Kafka(生產者和消費者都是SpringBoot服務)Spring BootKafka
- flink連線消費kafkaKafka
- Kafka之消費與心跳Kafka
- kafka生產者和消費者吞吐量測試-kafka 商業環境實戰Kafka
- 一次 kafka 消費者的效能調優過程Kafka
- MongoDB和資料流:使用MongoDB作為Kafka消費者MongoDBKafka
- Kafka從入門到放棄(三)—— 詳說消費者Kafka
- 深入理解Kafka核心設計及原理(三):消費者Kafka
- storm(1.1.3)與kafka(1.0.0)整合ORMKafka
- python中多程式消費者生產者問題Python
- Kafka消費與心跳機制Kafka
- java的kafka生產消費JavaKafka