kafka可插拔增強如何實現?
- 2020 年 5 月 6 日
- 筆記
- Java技術 技術管理

導彈攔截,精準防禦。
背景
攔截器:在不修改應用程式業務邏輯的情況下,一組基於事件的可插拔的邏輯處理鏈;
類比springMVC的攔截器:


這些都是通過配置攔截器,插入到應用程式中,實現可插拔的修改業務邏輯;
kafka在0.10.0.0版本中開始引入攔截器。分為生產者攔截器和消費者攔截器,類似責任鏈的方式編排多個攔截器為一個大攔截器。
配置方法:配置參數
Properties props = new Properties();
List<String> interceptors = new ArrayList<>();
interceptors.add("com.yourcompany.kafkaproject.interceptors.AddTimestampInterceptor"); // 攔截器1
interceptors.add("com.yourcompany.kafkaproject.interceptors.UpdateCounterInterceptor"); // 攔截器2
props.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, interceptors);
……

注意: 配置攔截器需要制定攔截器的全限定名,並且保證生產者或者消費者客戶端能夠正確載入到配置的攔截器;

通過攔截器實現,強制讓所有的生產者,消費者配置該攔截器,實現消息審計的功能; |
生產者攔截器
攔截器需要實現org.apache.kafka.clients.producer.ProducerInterceptor

消費者攔截器
org.apache.kafka.clients.consumer.ConsumerInterceptor

實操
實現端到端的性能監控:
處理過程:

生產者程式碼:
public class AvgLatencyProducerInterceptor implements ProducerInterceptor<String, String> {
private Jedis jedis; // 省略Jedis初始化
@Override
public ProducerRecord<String, String> onSend(ProducerRecord<String, String> record) {
jedis.incr("totalSentMessage");
return record;
}
@Override
public void onAcknowledgement(RecordMetadata metadata, Exception exception) {
}
@Override
public void close() {
}
@Override
public void configure(Map<java.lang.String, ?> configs) {
}
消費者程式碼:
public class AvgLatencyConsumerInterceptor implements ConsumerInterceptor<String, String> {
private Jedis jedis; //省略Jedis初始化
@Override
public ConsumerRecords<String, String> onConsume(ConsumerRecords<String, String> records) {
long lantency = 0L;
for (ConsumerRecord<String, String> record : records) {
lantency += (System.currentTimeMillis() - record.timestamp());
}
jedis.incrBy("totalLatency", lantency);
long totalLatency = Long.parseLong(jedis.get("totalLatency"));
long totalSentMsgs = Long.parseLong(jedis.get("totalSentMessage"));
jedis.set("avgLatency", String.valueOf(totalLatency / totalSentMsgs));
return records;
}
@Override
public void onCommit(Map<TopicPartition, OffsetAndMetadata> offsets) {
}
@Override
public void close() {
}
@Override
public void configure(Map<String, ?> configs)
配置到攔截器到對應的生產者和消費者對象,即簡單的實現了平均消息延時的端到端性能統計。
小結
類比AOP是Spring提供的核心功能,即面向切面編程,可以把跟業務邏輯無關的安全,審計,性能相關功能放到切面增強中實現。
對Kafka進行一些可插拔的功能增強可以通過攔截器實現。
本篇介紹了kafka的攔截器的使用方法,以及通過實例展示了具體的用法,希望對團隊使用的kafka做一些增強功能的時候可以利用這個點去擴展。

原創不易,關注誠可貴,轉發價更高!轉載請註明出處,讓我們互通有無,共同進步,歡迎溝通交流。
我會持續分享Java軟體編程知識和程式設計師發展職業之路,歡迎關注,我整理了這些年編程學習的各種資源,關注公眾號『李福春持續輸出』,發送'學習資料'分享給你!


