亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python操作kafka實踐的示例代碼

系統(tǒng) 1898 0

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

            
#!/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

          

下面是結(jié)果:

2、如果想要完成負載均衡,就需要知道kafka的分區(qū)機制,同一個主題,可以為其分區(qū),在生產(chǎn)者不指定分區(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

          

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


3、kafka提供了偏移量的概念,允許消費者根據(jù)偏移量消費之前遺漏的內(nèi)容,這基于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ū)結(jié)果都可以消費,結(jié)果如下:

python操作kafka實踐的示例代碼_第1張圖片

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
          

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

python操作kafka實踐的示例代碼_第2張圖片

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


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美日韩永久久一区二区三区 | 伊人久久丁香色婷婷啪啪 | 99在线免费观看 | 欧美午夜在线 | 国内在线观看 | 香蕉久人久人青草青草 | 午夜影院一区二区三区 | 精品欧美在线精品 | 狠狠2019| 草莓视频一区二区精品 | 天天摸夜夜添久久精品麻豆 | 亚洲综合视频网 | 国产婷婷综合在线视频中 | 久草免费色站 | 久久婷婷是五月综合色狠狠 | 第一福利视频网 | 久久久久亚洲精品一区二区三区 | 特级a欧美做爰片毛片 | 中文字幕无线码中文字幕免费 | 特一级男女性色大片 | 狠狠综合久久久久尤物丿 | 亚洲精品不卡 | 国产成人视屏 | 免费羞羞网站 | 夜色精品国产一区二区 | 国产精品视频男人的天堂 | 男人深夜影院 | a免费网站 | 乱色 另类图区 | 国产毛片一区二区三区 | 国产精品99久久99久久久看片 | 我色综合 | 天天干天天草天天 | 狠狠色噜噜狠狠狠狠色吗综合 | 国产素人在线 | 日韩毛片在线免费观看 | 日韩成| 久久国产精品亚洲综合 | 日本人69视频页码jlzz | 久久综合噜噜激激的五月天 | 成人黄色小视频 |