上一輪我們介紹過RabbitMQ,這次我們來提提Kafka吧。Kafka與RabbitMQ一樣都提供了Message Queue 服務,但Kafka的功能更加適合大型系統的處理,資料吞吐量的表現也比RabbitMQ好,除此之外,Kafka還能提供 Streaming Processing與簡易的Databse功能,就讓我們一起來看看吧。

這是Kafka的架構圖,與RabbitMQ的關係類似。以下介紹Kafka的核心概念。
Kafka的優勢有
想要測試Kafka,可以參考官方的教學:https://kafka.apache.org/quickstart
以下簡單撰寫使用教學
$ tar -xzf kafka_2.13-3.8.0.tgz
$ cd kafka_2.13-3.8.0
$ bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties
這樣本機就已經啟用Kafka了,接下來看SpringBoot的設定吧。首先是Maven安裝依賴。
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>
接著在Application.properties定義生產者與消費者的序列化與反序列化工具。並訂立group.id給Consumer用來分群、以及auto-offset-reset=earliest 代表當Kafka Consumer啟動且在Group中找不到現有的偏移量時,在Kafka重新啟動或新加入Group時能從最早的資料開始處理。
# Kafka broker 地址
spring.kafka.bootstrap-servers=localhost:9092
# 消費者配置
spring.kafka.consumer.group-id=my-group
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
# 生產者配置
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
接著定義Kafka 接收訊息的設定,這邊定義了接收訊息的TOPIC以及GroupId。
@Service
public class KafkaConsumer {
    @KafkaListener(topics = "my_topic", groupId = "my-group")
    public void consume(String message) {
        System.out.println("接收到的訊息: " + message);
    }
}
最後加入Producer與Consumer。
@Service
public class KafkaProducer {
    private static final String TOPIC = "my_topic";
    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;
    public void sendMessage(String message) {
        kafkaTemplate.send(TOPIC, message);
    }
}
@RestController
public class KafkaController {
    @Autowired
    private KafkaProducer kafkaProducer;
    @GetMapping("/send")
    public String sendMessage(@RequestParam("message") String message) {
        kafkaProducer.sendMessage(message);
        return "已發送訊息: " + message;
    }
}
透過以上的設定,你應該可以自行建立出一個Kafka Server了

那麼今天的介紹就到這邊了,我們明天見吧。
參考資料:
Apache Kafka 介紹. Data really powers everything that we… | by Chi-Hsuan Huang | Medium
Apache Kafka 是什麼?核心元件、優勢、常見使用案例一次看! - 歐立威科技 (omniwaresoft.com.tw)
什麼是 Apache Kafka?| Google Cloud