kafka入坑

     kafka之前好像写过,如果没写的话便是之前接触过,哈哈 已经用kafka实现了几个小功能,不过还是实实在在领会精华才好;提前说好,这篇当然非原创,各处copy而来,不过也融入了在下的心血,所以厚着脸皮写原创;

    kafka是消息中间件的一种,用于构建实时数据管道和流应用程序。具有横向扩展,容错,wicked fast(变态快像canal一样)等优点;

    先说说分布式这个高大上的词:分区分布到集群多个服务器上(各司其职),据配置每个分区可复制其他服务气做为备份容错,每个分区有一个leader,*follower,leader处理all读写请求,follower被动复制,leader宕了推举新leader,服务器可能同时是follower和leader,负载均衡;

 

是what

      生产者消费者,生产者生产鸡蛋,消费者消费鸡蛋,生产者生产一个鸡蛋,消费者就消费一个鸡蛋,假设消费者消费鸡蛋的时候噎住了(系统宕机了),生产者还在生产鸡蛋,那新生产的鸡蛋就丢失了。再比如生产者很强劲(大交易量的情况),生产者1秒钟生产100个鸡蛋,消费者1秒钟只能吃50个鸡蛋,那要不了一会,消费者就吃不消了(消息堵塞,最终导致系统超时),消费者拒绝再吃了,”鸡蛋“又丢失了,这个时候我们放个篮子在它们中间,生产出来的鸡蛋都放到篮子里,消费者去篮子里拿鸡蛋,这样鸡蛋就不会丢失了,都在篮子里,而这个篮子就是”kafka“。


       鸡蛋其实是“数据流”,系统间交互是通过“数据流”来传输的(就是tcp、http什么的),也称为报文,也叫“消息”。消息队列满了,其实就是篮子满了,”鸡蛋“ 放不下了,那赶紧多放几个篮子,其实就是kafka的扩容。

 

名词解释

  • producer:生产者
  • consumer:消费者,队列和发布-订阅,队列一组消费者读取消息,一条消息只由1个消费者处理

       发布-订阅:消息广播all消费者,接收到消息的消费者均可处理此消息

  • 消费者组:发布到topic上消息被分发给此消费者组中的一个消费者,如果all消费者都在组中,queue模式
  • topic:队列/主题,每一个topic集群维护这个分区的log;可理解成标签,生产者生成出来鸡蛋贴上一个标签topic,我们消费者可是有品味有原则的鸡,不是谁生产的鸡蛋都能被吃掉的,吃鸡蛋当然要选择性地吃,以topic为类别记录;

        topic的partition提供了顺序保证和负载均衡

  • broker:篮子,集群中每个服务器都是一个代理broker,消费者可从broker拉数据从而消费
  • 消息:由key,value和时间戳构成

kafka集群保存all消息直至过期

消费者持有偏移量(消费者在log中的可控的位置)可重置偏移量 进而读取信息

 

优势

实时流数据管道,可靠获取系统和应用程序间数据;实时应用程序,对数据流进行转换或反应

 

核心API

producer:发布消息到1个或多个topic(主题)

  1. send异步,添加消息到缓存中立即返回,生产者将单个消息批量发送提高效率
public Future<RecordMetadata> send(ProducerRecord<K,V> record,Callback callback)
recordMetadata:指定消息发送的分区,分配的offset和消息的时间戳,
如topic是createTime则使用时间戳/发送时间,
如是logappendtime,则追加消息,
时间戳是broker本地时间

如果future调用get,则阻塞等待请求完成并返回metadata,或抛异常


注意:callback一般在生产者的I/O线程中执行,所以是相当的快的,否则将延迟其他的线程的消息发送。如果你需要执行阻塞或计算昂贵(消耗)的回调,建议在callback主体中使用自己的Executor来并行处理。


Throws:
InterruptException - 如果线程在阻塞中断。
SerializationException - 如果key或value不是给定有效配置的serializers。
TimeoutException - 如果获取元数据或消息分配内存话费的时间超过max.block.ms。
KafkaException - Kafka有关的错误(不属于公共API的异常)。
  1. ack判断请求是不是发送成功,all将阻塞消息,性能最低,最可靠
  2. retries重试次数,启用会有重复消费的可能
  3. producer缓存分区未发送消息,缓存大小batch.size配置指定
  4. linger.ms大于0。这将指示生产者发送请求之前等待一段时间,希望更多的消息填补到未满的批中
  5. buffer.memory 控制生产者可用的缓存总量,当缓存空间耗尽,其他发送调用将被阻塞,阻塞时间的阈值通过max.block.ms设定,之后它将抛出一个TimeoutException

 

consumer:订阅1个或多个topic,处理产生的消息

streams:流处理器,1个多个topic消费 输入流,并生产一个 输出流 到1个或多个 输出topic,有效将输入流转换到输出流

connector:容许构建 运行可重复使用的生产者或消费者,将topic连接到现有程序或数据系统

 

Client和Server之间的通讯,是通过一条简单、高性能并且和开发语言无关的TCP协议。并且该协议保持与老版本的兼容。Kafka提供了Java Client(客户端)。除了Java Client外,还有非常多的其它编程语言的Client

 

鸣谢:

http://www.orchome.com/kafka/index

https://www.jianshu.com/p/d3e963ff8b70

作者:半兽人
链接:http://orchome.com/5
来源:OrcHome
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值