1、发后即忘(fire-and-forget)

只管往kafka发送消息而并不关心消息是否正确到达。正常情况没什么问题,不过有些时候(比如不可重试异常)会造成消息的丢失。这种发送方式性能最高,可靠性最差。

kafkaTemplate.send(topic, msg)

2、同步发送(sync)

其实kafkaTemplate.send方法并不是返回void,而是ListenableFuture<SendResult<K, V>>,该类继承了jdk concurrent包的Future。如下:

 @Overridepublic ListenableFuture<SendResult<K, V>> send(String topic, @Nullable V data) {ProducerRecord<K, V> producerRecord = new ProducerRecord<>(topic, data);return doSend(producerRecord);}

要实现同步发送的,可以利用返回的ListenableFuture实现,如下:

kafkaTemplate.send(topic, msg).get()

实际上send()方法本身就是异步的,send()方法返回的Future对象可以使调用方稍后获得发送的结果。示例中在执行send()方法之后直接链式调用了get()方法来阻塞等待Kafka的响应,直到消息发送成功,或者发生异常。如果发生异常,那么就需要捕获异常并交由外层逻辑处理。

如果抛出可重试异常,可进行尝试重新发送消息。需配置retrie参数。

pros。put(ProducerConfig.RETRIES_CONFIGS, 10);

3、异步发送(async)

在send()方法里指定一个Callback的回调函数,Kafka在返回响应时调用该函数来实现异步的发送确认。有读者或许会有疑问,send()方法的返回值类型就是Future,而Future本身就可以用作异步的逻辑处理。这样做不是不行,只不过Future里的 get()方法在何时调用,以及怎么调用都是需要面对的问题,消息不停地发送,那么诸多消息对应的Future对象的处理难免会引起代码处理逻辑的混乱。使用Callback的方式非常简洁明了,Kafka有响应时就会回调,要么发送成功,要么抛出异常。异步发送方式的示例如下:

 private static class KafkaFutureCallback implements ListenableFutureCallback<SendResult> {@Overridepublic void onFailure(Throwable ex) {log.error("send kafka failed: {}", ex);}@Overridepublic void onSuccess(SendResult result) {log.info("send kafka success: {}", result.getProducerRecord());}}private void sendToKafka(String topic, Object msg) {kafkaTemplate.send(topic, msg).addCallback(new KafkaFutureCallback());}

kafka发送消息的三种方式相关推荐

  1. Kafka生产者发送消息的三种方式

    Kafka是一种分布式的基于发布/订阅的消息系统,它的高吞吐量.灵活的offset是其它消息系统所没有的. Kafka发送消息主要有三种方式: 1.发送并忘记 2.同步发送 3.异步发送+回调函数 下 ...

  2. discard connection丢失数据_python kafka 生产者发送数据的三种方式

    python kafka 生产者发送数据的三种方式 发送方式 同步发送 发送数据耗时最长 有发送数据的状态,不会丢失数据,数据可靠性高 以同步的方式发送消息时,一条一条的发送,对每条消息返回的结果判断 ...

  3. Python 发送 email 的三种方式

    Python发送email的三种方式,分别为使用登录邮件服务器.使用smtp服务.调用sendmail命令来发送三种方法 本文原文自米扑博客:Python 发送 email 的三种方式 Python发 ...

  4. ActiveMQ持久化消息的三种方式

    本文只介绍三种方式,分别是持久化为文件,MYSql,Oracle.下面逐一介绍. A:持久化为文件 这个你装ActiveMQ时默认就是这种,只要你设置消息为持久化就可以了.涉及到的配置和代码有 < ...

  5. MQ发送普通消息(三种方式)

    MQ 发送普通消息有三种实现方式:可靠同步发送.可靠异步发送.单向(Oneway)发送.本文介绍了每种实现的原理.使用场景以及三种实现的异同,同时提供了代码示例以供参考. 可靠同步发送 原理:同步发送 ...

  6. 给Teams消息附加图片的三种方式

    Teams消息支持三种不同的方式来添加图片,这篇文章我们来一起看一下这三种方式. Inline图片 var imagePath = Path.Combine(Environment.CurrentDi ...

  7. springboot:java实现邮件及附件发送、HTML正文的三种方式(一)【附带源码】

    0. 引言 邮件发送是我们日常开发中比较常见的功能,常用于预警信息提醒.统计数据定期发送等需求.一般该方法会由前人封装好,实际开发时只需要调用即可,但具体怎么实现的,如何从零实现邮件发送,这是我们要掌 ...

  8. 三种方式实现观察者模式 及 Spring中的事件编程模型

    观察者模式可以说是众多设计模式中,最容易理解的设计模式之一了,观察者模式在Spring中也随处可见,面试的时候,面试官可能会问,嘿,你既然读过Spring源码,那你说说Spring中运用的设计模式吧, ...

  9. ios多线程开发的常用三种方式

    ios多线程开发的常用三种方式 1.NSThread 2.NSOperationQueue 3.GCD NSThread: 创建方式主要有两种: [NSThread detachNewThreadSe ...

最新文章

  1. 线代总结2 矩阵代数
  2. nonatomic,assign,copy,retain的区别
  3. 设置tomcat的默认jdk
  4. ppt课堂流程图_除了直线能设计PPT,没想到曲线也实用,太赞了!
  5. 罗永浩回归!将开秋季旧机发布会:与iPhone 12同一天
  6. while循环(包含死循环、while嵌套)
  7. ssm项目之Bookstrap创建页面并分页查询
  8. 海康SDK数据类型转java
  9. 什么是私有ip 、A类地址、B类地址和C类地址?
  10. Python字符串:isspace、istitle、isupper、islower
  11. 大话functional编程语言
  12. ValueError: only one element tensors can be converted to Python scalars
  13. 猫和老鼠服务器正在修复中,猫和老鼠手游:关于29日在游戏中出现的异常问题 是暗改还是bug?...
  14. 一键拼接微信好友头像/玩炫朋友圈
  15. ebp 函数堆栈esp_EBP、ESP作用——esp始终指向栈顶,ebp是在堆栈中寻址用的(就是临时变量嘛)...
  16. 汉语拼音容易弄混的4个字母
  17. 【ESP32_8266_BT篇(三)】GATTATT协议规范
  18. multisim秒信号发生器_基于Multisim的简易信号发生器的设计
  19. Android流媒体开发之 自定义一个完备的log模块
  20. horizon层层注册

热门文章

  1. HTMLCSS学习记录
  2. 武汉理工考研复试计算机,2017武汉理工计算机复试
  3. 《胡闹厨房2》Overcooked 2 for Mac v2.0 烹饪模拟游戏
  4. 对Java工程目录下各文件夹(或文件)介绍
  5. MATLAB中绘制ROC曲线
  6. 【软件测试大赛Web应用省赛】跳坑记录
  7. 【常见直流电机驱动模块与arduino使用最全教程】
  8. 设计模式怎样解决设计问题
  9. uni-app计算入学(职)时间要比离职时间晚
  10. 程序和数据在计算机中用二进制数表示对吗,程序和数据在计算机中用什么表示...