zoukankan      html  css  js  c++  java
  • 【kafka学习之一】 kafka初识

    环境
      虚拟机:VMware 10
      Linux版本:CentOS-6.5-x86_64
      客户端:Xshell4
      FTP:Xftp4
    一、kafka是什么?

    (1)kafka是一个高吞吐的分部式消息系统.
    (2)消息列队常见应用场景:系统之间解耦合;峰值压力缓冲;异步通信;

    二、kafka特点:
    1、生产者消费者模型,FIFO。partition内部是FIFO的,partition之间呢不是FIFO的,当然我们可以把topic设为一个partition,这样就是严格的FIFO
    2、高性能:单节点支持上千个客户端,百MB/s吞吐
    3、持久性:消息直接持久化在普通磁盘上且性能好,直接写到磁盘里面去,就是直接append到磁盘里面去,这样的好处是直接持久话,数据不会丢,第二个好处是顺序写,然后消费数据也是顺序的读,所以持久化的同时还能保证顺序读写
    可靠性保证
    -自己不丢数据,将消息持久化到磁盘,默认保存1周;
    -消费者不丢数据:“至少一次,严格一次”
    4、分布式:数据副本冗余、流量负载均衡、可扩展
    分布式,数据副本,也就是同一份数据可以到不同的broker上面去,当一份数据,磁盘坏掉的时候,数据不会丢失,比如3个副本,就是在3个机器磁盘都坏掉的情况下数据才会丢。
    5、很灵活:消息长时间持久化+Client维护消费状态
    消费方式非常灵活,第一原因是消息持久化时间跨度比较长,一天或者一星期等;
    第二消费状态自己维护消费到哪个地方了,可以自定义消费偏移量

    三、kafka与其他消息队列对比
    • RabbitMQ:分布式,支持多种MQ协议,重量级
    • ActiveMQ:与RabbitMQ类似
    • ZeroMQ:以库的形式提供,使用复杂,无持久化
    ZeroMQ是一个socket的通信库,它是以库的形式提供的,所以说你需要写程序来实现消息系统,它只管内存和通信那一块,持久化也得自己写,还是那句话它是用来实现消息队列的一个库,其实在storm里面呢,storm0.9之前,那些spout和bolt,bolt和bolt之间那些底层的通信就是由ZeroMQ来通信的,它并不是一个消息队列,就是一个通信库,在0.9之后呢,因为license的原因,ZeroMQ就由Netty取代了,Netty本身就是一个网络通信库嘛,所以说更合适是在通信库这一层,不应该是MessageQueue这一层
    • redis:单机、纯内存性好,持久化较差
    Redis,本身是一个内存的KV系统,但是它也有队列的一些数据结构,能够实现一些消息队列的功能,当然它在单机纯内存的情况下,性能会比较好,持久化做的稍差,当持久化的时候性能下降的会比较厉害
    • kafka:分布式,较长时间持久化,高性能,轻量灵活
    Kafka的亮点,天生是分布式的,不需要你在上层做分布式的工作,另外有较长时间持久化,前面的几个MQ基本消费完就干掉了,另外在长时间持久化下性能还比较高,顺序读和顺序写,另外还通过sendFile这样0拷贝的技术直接从文件拷贝到网络,减少内存的拷贝,还有批量读批量写来提高网络读取文件的性能

    四、零拷贝
    零拷贝是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而直接在内核空间(Kernel Space)中传输到网络的方式。

    普通拷贝:

    零拷贝:

    五、kafka的架构

    六、kafka的消息存储和生产消费模型

    (1)kafka里面的消息由topic来组织的,可以想象为一个队列,一个队列就是一个topic,然后它把每个topic又分为很多个partition,这个是为了做并行的,在每个partition内部消息强有序,相当于有序的队列,其中每个消息都有个序号offset,比如0到12,从前面读往后面写。

    (2)一个partition对应一个broker,一个broker可以管多个partition,比如说,topic有6个partition,有两个broker,那每个broker就管3个partition。

    (3)这个partition可以很简单想象为一个文件,当数据发过来的时候它就往这个partition上面append,追加就行,消息不经过内存缓冲,直接写入文件,kafka和很多消息系统不一样,很多消息系统是消费完了我就把它删掉,而kafka是根据时间策略删除,而不是消费完就删除,在kafka里面没有一个消费完这么个概念,只有过期这样一个概念。
    (4)producer自己决定往哪个partition里面去写,这里有一些的策略,譬如如果hash,不用多个partition之间去join数据了。

    (5)consumer自己维护消费到哪个offset

    (6)每个consumer都有对应的group,

    (7)group内是queue消费模型(各个consumer消费不同的partition,因此一个消息在group内只消费一次)

    (8)group间是publish-subscribe消费模型

    (9)各个group各自独立消费,互不影响,因此一个消息在被每个group消费一次。



  • 相关阅读:
    ruby 二进制转十进制 Integer("0b101") = 5
    开始菜单和我的文档的我的图片及我的音乐变成 my pictrues 正常图标了
    ruby watir 莫名其妙的错误
    Excel SaveAS是去掉提示框
    apache && jboss安装
    ruby require include的区别
    ruby控制鼠标
    This error is raised because the column 'type' is reserved for storing the class in case of inheritance
    用正则表达式限制文本框只能输入数字,小数点,英文字母,汉字等各类代码
    ASP.NET 如何动态修改 Header 属性如添加 Meta 标签 keywords description!
  • 原文地址:https://www.cnblogs.com/cac2020/p/10757469.html
Copyright © 2011-2022 走看看