Kafka(八)Python生產者和消費者API使用

來源:互聯網
上載者:User

標籤:sha   src   序列   format   資訊   form   必須   ram   str   

單線程生產者

#!/usr/bin/env python# -*- coding: utf-8 -*-import randomimport sysfrom kafka import KafkaProducerfrom kafka.client import logimport timeimport json__metaclass__ = typeclass Producer:    def __init__(self, KafkaServer='127.0.0.1', KafkaPort='9092', ClientId="Procucer01", Topic='Test'):        """        用於設定生產者配置資訊,這些配置項可以從源碼中找到,下面為必要參數。        :param KafkaServer: kafka伺服器IP        :param KafkaPort: kafka工作連接埠        :param ClientId: 生產者名稱        :param Topic: 主題        """        self._bootstrap_server = '{host}:{port}'.format(host=KafkaServer, port=KafkaPort)        self._topic = Topic        self._clientId = ClientId        """        初始化一個生產者執行個體,生產者是安全執行緒的,多個線程共用一個生產者執行個體效率比每個線程都使用一個生產者執行個體要高        acks: 消費者只能消費被提交的,而只有訊息在所有副本中都有了才算提交,生產者發送了訊息是否要等待所有副本都同步了該訊息呢?這個值就是控制這個的。預設是1,表示只要該分區的Leader副本成功寫入日誌就返回。              0表示生產者無需等待,發送完就返回;all是所有副本都寫入該訊息才返回。 all可靠性最高但是效率最低,0效率最高但是可靠性最低,所以一般用1。        retries: 表示請求重試次數,預設是0,上面的acks配置請求完成的標準,如果請求失敗,生產者將會自動重試,如果配置為0則不重試。但是如果重試則有可能發生重複發送訊息。        key_serializer: 鍵的序列化器,預設不設定,採用位元組碼        value_serializer: 值得序列化器,預設不設定,採用位元組碼,因為可以發送單一字元,也可以發送索引值型訊息        """        try:            self._producer = KafkaProducer(bootstrap_servers=self._bootstrap_server, client_id=self._clientId, acks=1,                                           value_serializer=lambda m: json.dumps(m).encode('utf-8'))        except Exception as err:            print err.message    def _TIMESTAMP(self):        t = time.time()        return int((round(t * 1000)))    # 時間戳記轉換為普通時間    def getNormalTime(self, temp_timeStamp, timeSize=10):        timeStamp = temp_timeStamp        if timeSize == 13:            timeStamp = int(temp_timeStamp / 1000)        timeArray = time.localtime(timeStamp)        otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)        return otherStyleTime    # 發送成功的回呼函數    def _on_send_success(self, record_metadata):        print "Topic: %s Partition: %d Offset: %s" % (record_metadata.topic, record_metadata.partition, record_metadata.offset)    # 發送失敗的回呼函數    def _on_send_error(self, excp):        log.error('I am an errback', exc_info=excp)    def sendMsg(self, msg, partition=None):        """        發送訊息        :param msg: 訊息        :param partition: 分區也可以不指定        :return:        """        if not msg:            print "訊息不可為空。"            return None        # 發送的訊息必須是序列化後的,或者是位元組        message = json.dumps(msg, encoding='utf-8', ensure_ascii=False)        try:            TIMESTAMP = self._TIMESTAMP()            # 發送資料,非同步方式,調用之後立即返回,因為這裡其實是發送到緩衝區,所以你可以多次調用,然後一起flush出去。            self._producer.send(self._topic, partition=partition, key=self._clientId, value=message, timestamp_ms=TIMESTAMP).add_callback(self._on_send_success).add_errback(self._on_send_error)            # 下面的 flush是阻塞的,只有flush才會真正通過網路把緩衝區的資料發送到對端,如果不調用flush,則等到時間或者緩衝區滿了就會發送。            self._producer.flush()            print self.getNormalTime(TIMESTAMP, timeSize=13) + " send msg: " + message        except Exception as err:            print errdef main():    p = Producer(KafkaServer="172.16.48.171", KafkaPort="9092", Topic='AAA')    for i in range(10):        time.sleep(1)        closePrice = random.randint(1, 500)        msg = {            "股票代號": 60000 + i,            "昨日收盤價": closePrice,            "今日開盤價": 0,            "今日收盤價": 0,        }        p.sendMsg(msg)if __name__ == "__main__":    try:        main()    finally:        sys.exit()


消費者

#!/usr/bin/env python# -*- coding: utf-8 -*-import sysfrom kafka import KafkaConsumerimport json__metaclass__ = typeclass Consumer:    def __init__(self, KafkaServer='127.0.0.1', KafkaPort='9092', GroupID='TestGroup', ClientId="Test", Topic='Test'):        """        用於設定消費者配置資訊,這些配置項可以從源碼中找到,下面為必要參數。        :param KafkaServer: kafka伺服器IP        :param KafkaPort: kafka工作連接埠        :param GroupID: 消費者組ID        :param ClientId: 消費者名稱        :param Topic: 主題        """        self._bootstrap_server = '{host}:{port}'.format(host=KafkaServer, port=KafkaPort)        self._groupId = GroupID        self._topic = Topic        self._clientId = ClientId    def consumeMsg(self):        try:            """            初始化一個消費者執行個體,消費者不是安全執行緒的,所以建議一個線程實現一個消費者,而不是一個消費者讓多個線程共用            下面這些是選擇性參數,可以在初始化KafkaConsumer執行個體的時候傳遞進去            enable_auto_commit 是否自動認可,預設是true            auto_commit_interval_ms 自動認可間隔毫秒數            """            consumer = KafkaConsumer(self._topic, bootstrap_servers=self._bootstrap_server,                                     group_id=self._groupId, client_id=self._clientId, enable_auto_commit=True,                                     auto_commit_interval_ms=5000, value_deserializer=lambda m: json.loads(m.decode('utf-8')))            """            這裡不需要顯示的調用訂閱函數,在初始化KafkaConsumer對象的時候已經指定了主題,如果主題欄位不為空白則會自動調用訂閱函數,至於            這個線程消費哪個分區則是自動分配的。如果你希望手動指定分區則就需要使用 assign() 函數,並且在初始的時候不輸入主題。            """            # consumer.subscribe(self._topicList)            # 返回一個集合            print "當前消費的分區為:", consumer.partitions_for_topic(self._topic)            print "當前訂閱的主題為:", consumer.subscription()            while True:                for msg in consumer:                    if msg:                        print "Topic: %s Partition: %d Offset: %s Key: %s Message: %s " % (msg.topic, msg.partition, msg.offset, msg.key, msg.value)        except Exception as err:            print errdef main():    try:        c = Consumer(KafkaServer='172.16.48.171', Topic='AAA')        c.consumeMsg()    except Exception as err:        print err.messageif __name__ == "__main__":    try:        main()    finally:        sys.exit()

執行效果

Kafka(八)Python生產者和消費者API使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.