Kafka 簡單實驗二(Python實現簡單生產者消費者)

右介發表於2017-10-12

Apache Kafka 是什麼?

Kafka 是一個開源的分散式流處理平臺,其簡化了不同資料系統的整合。流指的是一個資料管道,應用能夠通過流不斷地接收資料。Kafka 作為流處理系統主要有兩個用處:

  1. 資料整合: Kafka 捕捉事件流或資料變化流,並將這些資料送給其它資料系統,如關係型資料庫,鍵值對資料庫或者資料倉儲。
  2. 流處理:Kafka接收事件流並儲存在一個只能追加的佇列裡,該佇列稱為日誌(log)。日誌裡的資訊是不可變的,因此支援連續實時的資料處理和流轉換,並使結果在系統級別可訪問。

相比於其它技術,Kafka 擁有更高的吞吐量,內建分割槽,副本和容錯率。這些使得 Kafka 成為大規模訊息處理應用的良好解決方案。

Kafka 系統有三個主要的部分:

  1. 生產者(Producer): 產生原始資料的服務。
  2. 中間人(Broker): Kafka 是生產者和消費者之間的中間人,它使用API來獲取和釋出資料。
  3. 消費者(Consumer): 使用中間人釋出的資料的服務。

安裝 Kafka

  見 Kafka 簡單實驗一

配置環境

我們的專案將包括:

  生產者:將字串傳送給 Kafka   消費者: 獲取資料並展示在終端視窗中  Kafka: 作為中間人

安裝需要的依賴包

pip install kafka-python

建立生產者

生產者是給 Kafka 中間人傳送訊息的服務。值得注意的是,生產者並不關注最終消費或載入資料的消費者。 建立生產者: 建立一個 producer.py 檔案並新增如下程式碼:

import time
from kafka import SimpleProducer, KafkaClient

#  connect to Kafka
kafka = KafkaClient('localhost:9092')
producer = SimpleProducer(kafka)
# Assign a topic
topic = 'my-topic'

建立訊息:

  迴圈生成1到100之間的數字

傳送訊息:

  Kafka 訊息是二進位制字串格式(byte)

以下是完整的生產者程式碼:

import time
from kafka import SimpleProducer, KafkaClient

#  connect to Kafka
kafka = KafkaClient('localhost:9092')
producer = SimpleProducer(kafka)
# Assign a topic
topic = 'my-topic'

def test():
    print('begin')
    n = 1
    while (n<=100):
        producer.send_messages(topic, str(n))
        print "send" + str(n)
        n += 1
        time.sleep(0.5)
    print('done')

if __name__ == '__main__':
    test()

建立消費者

消費者監聽並消費來自 Kafka 中間人的訊息。我們的消費者應該監聽 my-topic 主題的訊息並將訊息展示。

以下是消費者程式碼(consumer.py):

from kafka import KafkaConsumer

#connect to Kafka server and pass the topic we want to consume
consumer = KafkaConsumer('my-topic')

print "begin"
for msg in consumer:
    print msg

執行專案

確保 Kafka 在執行
開啟兩個終端,在第一個終端中執行消費者:

$ python consumer.py

在第二個終端執行生產者:

$ python producer.py

相關文章