最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python操作kafka實踐的示例代碼

 更新時間:2019年06月19日 09:17:42   作者:Small_office  
這篇文章主要介紹了python操作kafka實踐的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1、先看最簡單的場景,生產者生產消息,消費者接收消息,下面是生產者的簡單代碼。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
from kafka import KafkaProducer

producer = KafkaProducer(bootstrap_servers='xxxx:x')

msg_dict = {
  "sleep_time": 10,
  "db_config": {
    "database": "test_1",
    "host": "xxxx",
    "user": "root",
    "password": "root"
  },
  "table": "msg",
  "msg": "Hello World"
}
msg = json.dumps(msg_dict)
producer.send('test_rhj', msg, partition=0)
producer.close()

下面是消費者的簡單代碼:

from kafka import KafkaConsumer

consumer = KafkaConsumer('test_rhj', bootstrap_servers=['xxxx:x'])
for msg in consumer:
  recv = "%s:%d:%d: key=%s value=%s" % (msg.topic, msg.partition, msg.offset, msg.key, msg.value)
  print recv

下面是結果:

2、如果想要完成負載均衡,就需要知道kafka的分區(qū)機制,同一個主題,可以為其分區(qū),在生產者不指定分區(qū)的情況,kafka會將多個消息分發(fā)到不同的分區(qū),消費者訂閱時候如果不指定服務組,會收到所有分區(qū)的消息,如果指定了服務組,則同一服務組的消費者會消費不同的分區(qū),如果2個分區(qū)兩個消費者的消費者組消費,則,每個消費者消費一個分區(qū),如果有三個消費者的服務組,則會出現(xiàn)一個消費者消費不到數(shù)據(jù);如果想要消費同一分區(qū),則需要用不同的服務組。以此為原理,我們對消費者做如下修改:

from kafka import KafkaConsumer

consumer = KafkaConsumer('test_rhj', bootstrap_servers=['xxxx:x'])
for msg in consumer:
  recv = "%s:%d:%d: key=%s value=%s" % (msg.topic, msg.partition, msg.offset, msg.key, msg.value)
  print recv

然后我們開兩個消費者進行消費,生產者分別往0分區(qū)和1分區(qū)發(fā)消息結果如下,可以看到,一個消費者只能消費0分區(qū),另一個只能消費1分區(qū):


3、kafka提供了偏移量的概念,允許消費者根據(jù)偏移量消費之前遺漏的內容,這基于kafka名義上的全量存儲,可以保留大量的歷史數(shù)據(jù),歷史保存時間是可配置的,一般是7天,如果偏移量定位到了已刪除的位置那也會有問題,但是這種情況可能很?。幻總€保存的數(shù)據(jù)文件都是以偏移量命名的,當前要查的偏移量減去文件名就是數(shù)據(jù)在該文件的相對位置。要指定偏移量消費數(shù)據(jù),需要指定該消費者要消費的分區(qū),否則代碼會找不到分區(qū)而無法消費,代碼如下:

from kafka import KafkaConsumer
from kafka.structs import TopicPartition

consumer = KafkaConsumer(group_id='123456', bootstrap_servers=['10.43.35.25:4531'])
consumer.assign([TopicPartition(topic='test_rhj', partition=0), TopicPartition(topic='test_rhj', partition=1)])
print consumer.partitions_for_topic("test_rhj") # 獲取test主題的分區(qū)信息
print consumer.assignment()
print consumer.beginning_offsets(consumer.assignment())
consumer.seek(TopicPartition(topic='test_rhj', partition=0), 0)
for msg in consumer:
  recv = "%s:%d:%d: key=%s value=%s" % (msg.topic, msg.partition, msg.offset, msg.key, msg.value)
  print recv

因為指定的便宜量為0,所以從一開始插入的數(shù)據(jù)都可以查到,而且因為指定了分區(qū),指定的分區(qū)結果都可以消費,結果如下:

4、有時候,我們并不需要實時獲取數(shù)據(jù),因為這樣可能會造成性能瓶頸,我們只需要定時去獲取隊列里的數(shù)據(jù)然后批量處理就可以,這種情況,我們可以選擇主動拉取數(shù)據(jù)

from kafka import KafkaConsumer
import time

consumer = KafkaConsumer(group_id='123456', bootstrap_servers=['10.43.35.25:4531'])
consumer.subscribe(topics=('test_rhj',))
index = 0
while True:
  msg = consumer.poll(timeout_ms=5) # 從kafka獲取消息
  print msg
  time.sleep(2)
  index += 1
  print '--------poll index is %s----------' % index

結果如下,可以看到,每次拉取到的都是前面生產的數(shù)據(jù),可能是多條的列表,也可能沒有數(shù)據(jù),如果沒有數(shù)據(jù),則拉取到的為空:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論

澳门| 高雄市| 柏乡县| 曲水县| 红安县| 海门市| 介休市| 克拉玛依市| 柘城县| 南平市| 文安县| 蒙山县| 通州市| 马龙县| 新余市| 同德县| 亳州市| 江孜县| 曲阜市| 澜沧| 菏泽市| 五峰| 宜春市| 麻江县| 滨州市| 名山县| 广宗县| 仙游县| 神农架林区| 教育| 肇州县| 桐柏县| 玉溪市| 海晏县| 辽宁省| 黄平县| 子长县| 昌平区| 宁城县| 西丰县| 桂林市|