Kafka生产者发送消息的三种方式
Kafka是一种分布式的基于发布/订阅的消息系统,它的高吞吐量、灵活的offset是其它消息系统所没有的。
Kafka发送消息主要有三种方式:
1.发送并忘记 2.同步发送 3.异步发送+回调函数
下面以单节点的方式分别用三种方法发送1w条消息测试:
方式一:发送并忘记(不关心消息是否正常到达,对返回结果不做任何判断处理)
发送并忘记的方式本质上也是一种异步的方式,只是它不会获取消息发送的返回结果,这种方式的吞吐量是最高的,但是无法保证消息的可靠性:
import pickle
import time
from kafka import KafkaProducer producer = KafkaProducer(bootstrap_servers=['192.168.33.11:9092'],
key_serializer=lambda k: pickle.dumps(k),
value_serializer=lambda v: pickle.dumps(v)) start_time = time.time()
for i in range(0, 10000):
print('------{}---------'.format(i))
future = producer.send('test_topic', key='num', value=i, partition=0) # 将缓冲区的全部消息push到broker当中
producer.flush()
producer.close() end_time = time.time()
time_counts = end_time - start_time
print(time_counts)
测试结果:1.88s
方式二:同步发送(通过get方法等待Kafka的响应,判断消息是否发送成功)
以同步的方式发送消息时,一条一条的发送,对每条消息返回的结果判断, 可以明确地知道每条消息的发送情况,但是由于同步的方式会阻塞,只有当消息通过get返回future对象时,才会继续下一条消息的发送:
import pickle
import time
from kafka import KafkaProducer
from kafka.errors import kafka_errors producer = KafkaProducer(
bootstrap_servers=['192.168.33.11:9092'],
key_serializer=lambda k: pickle.dumps(k),
value_serializer=lambda v: pickle.dumps(v)
) start_time = time.time()
for i in range(0, 10000):
print('------{}---------'.format(i))
future = producer.send(topic="test_topic", key="num", value=i)
# 同步阻塞,通过调用get()方法进而保证一定程序是有序的.
try:
record_metadata = future.get(timeout=10)
# print(record_metadata.topic)
# print(record_metadata.partition)
# print(record_metadata.offset)
except kafka_errors as e:
print(str(e)) end_time = time.time()
time_counts = end_time - start_time
print(time_counts)
测试结果:16s
方式三:异步发送+回调函数(消息以异步的方式发送,通过回调函数返回消息发送成功/失败)
在调用send方法发送消息的同时,指定一个回调函数,服务器在返回响应时会调用该回调函数,通过回调函数能够对异常情况进行处理,当调用了回调函数时,只有回调函数执行完毕生产者才会结束,否则一直会阻塞:
import pickle
import time
from kafka import KafkaProducer producer = KafkaProducer(
bootstrap_servers=['192.168.33.11:9092'],
key_serializer=lambda k: pickle.dumps(k),
value_serializer=lambda v: pickle.dumps(v)
) def on_send_success(*args, **kwargs):
"""
发送成功的回调函数
:param args:
:param kwargs:
:return:
"""
return args def on_send_error(*args, **kwargs):
"""
发送失败的回调函数
:param args:
:param kwargs:
:return:
""" return args start_time = time.time()
for i in range(0, 10000):
print('------{}---------'.format(i))
# 如果成功,传进record_metadata,如果失败,传进Exception.
producer.send(
topic="test_topic", key="num", value=i
).add_callback(on_send_success).add_errback(on_send_error) producer.flush()
producer.close() end_time = time.time()
time_counts = end_time - start_time
print(time_counts)
测试结果:2.15s
三种方式虽然在时间上有所差别,但并不是说时间越快的越好,具体要看业务的应用场景:
场景1:如果业务要求消息必须是按顺序发送的,那么可以使用同步的方式,并且只能在一个partation上,结合参数设置retries的值让发送失败时重试,设置max_in_flight_requests_per_connection=1,可以控制生产者在收到服务器晌应之前只能发送1个消息,从而控制消息顺序发送;
场景2:如果业务只关心消息的吞吐量,容许少量消息发送失败,也不关注消息的发送顺序,那么可以使用发送并忘记的方式,并配合参数acks=0,这样生产者不需要等待服务器的响应,以网络能支持的最大速度发送消息;
场景3:如果业务需要知道消息发送是否成功,并且对消息的顺序不关心,那么可以用异步+回调的方式来发送消息,配合参数retries=0,并将发送失败的消息记录到日志文件中;
Kafka生产者发送消息的三种方式的更多相关文章
- RocketMQ(6)---发送普通消息(三种方式)
发送普通消息(三种方式) RocketMQ 发送普通消息有三种实现方式:可靠同步发送.可靠异步发送.单向(Oneway)发送. 注意 :顺序消息只支持可靠同步发送. GitHub地址: https:/ ...
- ActiveMQ持久化消息的三种方式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt362 本文只介绍三种方式,分别是持久化为文件,MYSql,Oracle.下面 ...
- kafka的生产者配置以及发送信息的三种方式
1.Fire-and-forget 这种方式是不管发送成功与否,客户端都会返回成功.尽管大多数的时候Kafka 在发送失败后,会自己重新自动再一次发送消息,但是也会存在丢失消息的风险 Producer ...
- kafka 生产者发送消息
KafkaProducer 创建一个 KafkaThread 来运行 Sender.run 方法. 1. 发送消息的入口在 KafkaProducer#doSend 中,但其实是把消息加入到 batc ...
- 使用ajax发送文件的三种方式及预览图片的方法,上传按钮美化
后端代码 def upload(request): if request.method == "GET": return render(request,'upload.html') ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- [转] Bound Service的三种方式(Binder、 Messenger、 AIDL)
首先要明白需要的情景,然后对三种方式进行选择: (一)可以接收Service的信息(获取Service中的方法),但不可以给Service发送信息 (二) 使用Messenger既可以接受Servic ...
- 三种方式上传文件-Java
前言:负责,因为该项目他(jetty嵌入式开始SpringMvc)实现文件上传的必要性,并拥有java文件上传这一块还没有被曝光.并 Http 更多晦涩协议.因此,这种渐进的方式来学习和实践上载文件的 ...
- 三种方式实现观察者模式 及 Spring中的事件编程模型
观察者模式可以说是众多设计模式中,最容易理解的设计模式之一了,观察者模式在Spring中也随处可见,面试的时候,面试官可能会问,嘿,你既然读过Spring源码,那你说说Spring中运用的设计模式吧, ...
随机推荐
- [洛谷P1438] 无聊的数列
题目类型:差分,线段树 传送门:>Here< 题意:给出一个数列,每次给一个区间对应的加上一个等差数列,并询问某一个元素目前的值. 解题思路 所谓差分,我个人的理解就是用\(O(1)\)的 ...
- LOJ #2135. 「ZJOI2015」幻想乡战略游戏(点分树)
题意 给你一颗 \(n\) 个点的树,每个点的度数不超过 \(20\) ,有 \(q\) 次修改点权的操作. 需要动态维护带权重心,也就是找到一个点 \(v\) 使得 \(\displaystyle ...
- BZOJ4552 HEOI2016/TJOI2016排序(线段树合并+线段树分裂)
很久以前写过二分答案离线的做法,比较好理解.事实上这还是一个线段树合并+分裂的板子题,相比离线做法以更优的复杂度做了更多的事情.具体不说了.怎么交了一遍luogu上就跑第一了啊 #include< ...
- Linux硬盘性能测试工具 - FIO
1.安装:方法一:直接用指令yum -y install fio方法二:如果方法一不可行则,在官网http://freshmeat.net/projects/fio/下载fio的安装包.安装方法很简单 ...
- TOMCAT ---> servlet概念
1 TOMCAT ---> servlet概念 2 TOMCAT 目录结构 (各个文件夹都存放什么东西) 3 TOMCAT 程序的层级 web | |---- js,jsp,html,css ( ...
- Kafka实战分析(一)- 设计、部署规划及其调优
1. Kafka概要设计 kafka在设计之初就需要考虑以下4个方面的问题: 吞吐量/延时 消息持久化 负载均衡和故障转移 伸缩性 1.1 吞吐量/延时 对于任何一个消息引擎而言,吞吐量都是至关重要的 ...
- docker学习-----docker可视化portainer
docker的可视化操作界面portainer 1.创建一个挂载区 docker volume create portainer_data 2.安装( docker run -d - ...
- Android App性能测试之一:简介
1.性能测试 启动时间,主要测试App在启动过程中的耗时情况 CPU, 主要测试App在使用过程中的CPU占比率 流量,主要测试App在使用过程中对流量的消耗情况 电量,主要测试App在使用过程中对电 ...
- 16、使用limit offset 分页时,为什么越往后翻越慢?如何解决?
在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦. 当一个表数据有几百万的数据的时候成了问题! 如 * f ...
- PL/SQL连接远程oracle数据库配置
本人电脑:win10 64位, plsql:支持32位 一.安装好PL/SQL客户端 二.下载解压oracle客户端 1.instantclient 我下载的是oracle11g 32位的insta ...