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(主题)
- 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的异常)。
- ack判断请求是不是发送成功,all将阻塞消息,性能最低,最可靠
- retries重试次数,启用会有重复消费的可能
- producer缓存分区未发送消息,缓存大小batch.size配置指定
linger.ms
大于0。这将指示生产者发送请求之前等待一段时间,希望更多的消息填补到未满的批中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
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。