1.前言 |
|
中文文檔地址:https://kafka.apachecn.org/ |
|
1.1定義 |
|
Apache Kafka® 是 一個分佈式流處理平臺 |
|
1.2基本原理 |
|
|
|
1.3名詞解釋 |
名詞 |
Broker |
Topic |
Partition |
Producer |
Consumer |
ConsumerGroup |
|
2.安裝Java環境 |
|
# 下載jdk1.8 |
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html#license-lightbox |
|
# 解壓 |
tar -zxvf jdk-8u281-linux-x64.tar.gz |
|
# 配置環境變量 |
vim /etc/profile |
|
# 增加以下配置 |
JAVA_HOME=/usr/local/java/jdk1.8.0_281 |
CLASSPATH=$JAVA_HOME/lib/ |
PATH=$PATH:$JAVA_HOME/bin |
export PATH JAVA_HOME CLASSPATH |
|
# 重載 |
source /etc/profile |
|
|
|
3.安裝Kafka |
|
# 下載源碼 |
https://www.apache.org/dyn/closer.cgi?path=/kafka/2.7.0/kafka_2.12-2.7.0.tgz |
|
# 解壓 |
tar -zxvf kafka_2.12-2.7.0.tgz |
|
#啓動 |
# 需先啓動zookeeper |
# -daemon 可啓動後臺守護模式 |
# 如果你已經啓動了zookeeper 就不用啓動下面這 (kafka默認提供有zookeeper) |
bin/zookeeper-server-start.sh config/zookeeper.properties |
|
# 啓動Kafka服務端 |
bin/kafka-server-start.sh config/server.properties |
|
# 啓動kafka客戶端測試 |
# 創建一個話題,test話題2個分區 |
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic test |
Created topic "test". |
|
# 顯示所有話題 |
bin/kafka-topics.sh --list --zookeeper localhost:2181 |
test |
|
# 顯示話題信息 |
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test |
Topic:test PartitionCount:2 ReplicationFactor:1 Configs: |
Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0 |
Topic: test Partition: 1 Leader: 0 Replicas: 0 Isr: 0 |
|
|
# 啓動一個生產者(輸入消息) |
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test |
[等待輸入自己的內容 出現>輸入即可] |
>i am a new msg ! |
>i am a good msg ? |
|
# 啓動一個消費者(等待消息) |
# 注意這裏的--from-beginning,每次都會從頭開始讀取,你可以嘗試去掉和不去掉看下效果 |
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning |
[等待消息] |
i am a new msg ! |
i am a good msg ? |
|
4.安裝RdKafka擴展 |
|
# 下載librdkafka |
git clone https://codechina.csdn.net/mirrors/edenhill/librdkafka.git |
|
# 編譯安裝 |
cd librdkafka/ |
./configure |
make && make install |
|
# 下載RdKafka擴展 |
https://pecl.php.net/get/rdkafka-5.0.0.tgz |
tar -zxvf rdkafka-5.0.0.tgz |
cd rdkafka-5.0.0.tgz |
|
# 編譯安裝 |
/usr/local/php/bin/phpize |
./configure --with-config=/usr/local/php/bin/php-config |
make && make install |
|
# php.ini 追加擴展,重啓php-fpm |
extension=rdkafka.so |
systemctl restart php-fpm |
|
# 驗證 |
php -m |
|
5.使用Kafka |
|
5.1生產(Producer) |
|
$config = new \RdKafka\Conf(); |
# 設置broker |
$config->set('metadata.broker.list', $this->brokerList); |
$producer = new \RdKafka\Producer($config); |
# 設置topic |
$topic = $producer->newTopic($topic); |
$topic->produce(RD_KAFKA_PARTITION_UA, 0, json_encode($message)); |
$producer->poll(0); |
$result = $producer->flush(10000); |
if (RD_KAFKA_RESP_ERR_NO_ERROR !== $result) { |
return false; |
} |
return true; |
|
5.2消費(Consumer) |
|
$conf = new \RdKafka\Conf(); |
$conf->set('group.id', $this->groupName); |
$conf->set('metadata.broker.list', $this->brokerList); |
$conf->set('auto.offset.reset', 'earliest'); |
$consumer = new \RdKafka\KafkaConsumer($conf); |
$consumer->subscribe([$this->topicName]); |
while (true) { |
$message = $topic->consume(0, 120*10000); |
if ($message->err != RD_KAFKA_RESP_ERR_NO_ERROR) { |
print("err: " . $message->err); |
print("errstr: " . $message->errstr()); |
} else { |
var_dump($message->payload); |
} |
} |
|
5.3項目中使用 |
|
# rocket-customer |
application/command/KafkaConsumerByCall.php |
application/command/KafkaConsumerByCustomer.php |
application/command/KafkaConsumerByMemberCall.php |
application/command/KafkaConsumerByProfile.php |