controller怎么以实体类为参数_kafka怎么能让消息不丢失

   这篇文章主要针对于kafka的入门知识。众所周知,kafka是一个高效的消息队列。

   那它能做什么用呢?

   对于一个集成化的项目而讲,项目的解耦是必要,而kafka正好能够提供解耦的功能。正如:系统A需要发送短信给客户,系统B也需要发送短信给客户,只需调用kafka的生产者,把短信信息丢入kafka就可以默认发送短信成功。kafka的消息方在统一对短信数据做处理发送。

  高并发的系统中,一个瞬时高流量打入系统中,往往会对系统造成很大的压力,而kafka可以提供流量削峰的作用,比如:1秒内有10000的QPS进入系统,可以让这些请求写入Kakfa,后台在根据承载量去处理kafka中的请求。

那它怎么用?

   如果您是JAVA语言的开发使用者,您可以通过Maven依赖把Kafka的Jar引入,就可以开发使用。

288b1797db39d291911a0a6e9cfe3437.png

  下面我们先介绍下消息队列kafka的组成:

    1、Proudce 生产者,为kafka提供数据。

    2、Consumer 消费者,为Kafka的输出端提供输出。

    3、Zookeeper 存储kafka中topic、partition等元数据。

  4、kafka Controller 上联zookeeper,下联kafka的topic。连接zookeeper中的监听,当元数据发生改变的时候,controller对topic发送相应的指令。

   5、topic  话题

   6、partiton 分区  与分区对应的还存在副本

   7、broker kafka部署的一台机器或者多台机器

97d4995e05df422bb31d594c9e54f4ad.png

  kafka中的produce是怎么工作的呢?如何保证发送的数据不丢失?是异步还是同步呢?

     kafka生产者其实利用了Java NIO的概念,下面我们先了解下kafka 生产者的工作流程:

41737a1d46078dc6e0c7dbd6ef3d2657.png

  在开发中,首先需要我们组装一个ProducerRecord对象,作为发送的数据实体类对象。

   然后发送的时候首先进行序列化,有条件的可以选择序列化完成之后进行压缩。序列化或者压缩完成后通过key或者partitioner的实现类计算得到数据发送到topic的哪个分区,然后数据流入缓冲池。

  缓冲池的数据会整合成一个Bacth,当达到一定的数量或者规定的时间内就会发送到kafka的broker中,注意到达broker中一般都是刷新到了操作系统的页缓存中,并没有落磁盘。后续根据操作系统的copy-on-write 机制把页缓存刷新到磁盘中,这也是kafka高效的一个原因。

   发送的时候如何保证数据不丢失呢?

    kafka提供了一个acks机制。通过设置相关的参数,会根据对应的机制返回acks的参数有三个:all 、0、-1。

  acks=0 表示生产者把数据通过网络发送出去就认为消息写入kafka成功,但是kafka一定会丢失部门数据。

  acks=1 表示生产者只要把数据发送给broker就代表发送成功,不需要管理消息副本是否同步成功。

  acks = all 表示生产者把数据发送给broker后,还需要等待所有的副本同步成功后才会返回成功,这个选择会导致kafka的吞吐量下降。

 kafka发送数据的过程是同步还是异步的呢?

2fcdf705d5cc18c211508ce9c0322445.png

  从上图中可以看到kafka的发送过程会存在一个回调函数以及返回一个Future对象。熟悉JAVA中NIO的同学应该对Future对象很了解。Future中会包含这个方法是否调用成功的参数。使用Future.get()方法,会等待kafka的确认回复。这是一种同步方案。

异步发送的方案:

4b17cb10d3ab70c8b80086d3825c1d22.png

其实翻一下kafka的源码就可以指定Producer的发送过程是一个线程安全的操作。先把数据发送到对应的缓冲区,然后有守护线程把数据发送到对应的broker中。

下面讲解几个重要参数的配置:

  acks   可以配置成all

 retries  重试次数  

  buffer.memory 发送端缓冲区大小

batch.size 发送端打包数量的大小

  linger.ms  消息发送延时时间

c363478a59cda3b1cd92fa912fc2e7bb.png

      我是凯腾凯,互联网浪潮下一枚苟且偷生的程序员

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值