kafka那些事+golang使用kafka

消息队列通信的模式

1.点对点模式

在这里插入图片描述
一个生产者对应一个消费者,生产者往队列里面发消。

  • 优势:
    1.消费者可以自己决定什么时候取消息。
    2.消息取出来就没有了,不存在重复消费。
  • 劣势:
    1.消费者无法感知队列里面是否有消息要处理。

2.发布订阅模式

在这里插入图片描述
微信公众号就是消息生产者,关注这个号的粉丝就是消息消费者。

  • 优势:
    1.生产一个消息,所有消费者都可以同时收到,消费端不存在无法感知消息的情况.
    2.由于不同消费者消费数据的速度不一样,推送的速度成为一个难题。假设三个消费者处理速度分别是 8M/s、5M/s、2M/s,如果队列推送的速度为 5M/s,则 consumer3 无法承受!如果队列推送的速度为 2M/s,则 consumer1、consumer2 会出现资源的极大浪费!

kafka

1.介绍:

是一个分布式数据流平台,可以运行在单台或多台服务器上形成集群。提供了发布和订阅功能,生产者和消费者能够独立的完成读操作和写操作。

2.特点:

  1. 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒
  2. 可扩展性:kafka集群支持热扩展
  3. 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
  4. 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
  5. 高并发:支持数千个客户端同时读写

3.使用场景:

  1. 日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等分析处理。
  2. 消息系统:解耦和生产者和消费者、缓存消息等。
  3. 用户活动跟踪:Kafka经常被用来记录用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
  4. 监控数据:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
  5. 流式处理:比如spark streaming和storm
  6. 事件溯源

3.kafka架构

在这里插入图片描述

  1. Producer:Producer即生产者,消息的产生者,是消息的入口。
  2. Broker:Broker是kafka实例,每个服务器上有一个或多个kafka的实例,我们姑且认为每个broker对应一台服务器。每个kafka集群内的broker都有一个不重复的编号,如图中的broker-0、broker-1等……, 一个 broker可以容纳多个 topic。
  3. Topic:消息的主题,可以理解为消息的分类,kafka的数据就保存在topic。在每个broker上都可以创建多个topic。
  4. Partition:Topic的分区,每个topic可以有多个分区,分区的作用是做负载,提高kafka的吞吐量。同一个topic在不同的分区的数据是不重复的,partition的表现形式就是一个一个的文件夹!
  5. Replication:每一个分区都有多个副本,副本的作用是做备胎。当主分区(Leader)故障的时候会选择一个备胎(Follower)上位,成为Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器(因为如果这个机器挂了,那么全部都挂了,就没有leader了),同一机器对同一个分区也只可能存放一个副本(包括自己)。
  6. Message:每一条发送的消息主体。
  7. Consumer:消费者,即消息的消费方,是消息的出口。
  8. Consumer Group:我们可以将多个消费组组成一个消费者组,在kafka的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量!
  9. Zookeeper:kafka集群依赖zookeeper来保存集群的的元信息,来保证系统的可用性。

4.kafka写入流程和消息存储

(1).producer写入过程

在这里插入图片描述
注意
1.消息写入leader后,follower是主动的去leader进行同步的!
2.如果往不存在的topic写数据,能不能写入成功呢?kafka会自动创建topic,分区和副本的数量根据默认配置都是1。

(2).选择partition的原则

如果某个topic有多个partition,producer怎么知道发给谁呢?有下面几个原则:

  • 写入的时候可以指定写到哪个partition。
  • 如果没有指定partition,但是有key,会使用keyhash出一个partition。
  • 没有指定,也没有可以,那么就采用轮询的方式,这次写入这个partition,下次写入下一个partition。

(3).kafka的ACK应答机制

保证消息不丢失是一个消息队列中间件的基本保证,那producer在向kafka写入消息的时候,怎么保证消息不丢失呢?那就是通过ACK应答机制!在生产者向队列写入数据的时候可以设置参数来确定是否确认kafka接收到数据,这个参数可设置的值为0、1、all。

  • 0代表producer往集群发送数据不需要等到集群的返回,不确保消息发送成功。安全性最低但是效率最高。
  • 1代表producer往集群发送数据只要leader应答就可以发送下一条,只确保leader发送成功。
  • all代表producer往集群发送数据需要所有的follower都完成从leader的同步才会发送下一条,确保leader发送成功和所有的副本都完成备份。安全性最高,但是效率最低。

(4).partition有序写入

  1. topic是同一类别的消息集合,一个topic通常有多个订阅者,kafka为每一个topic维护了一个分区数据日志文件.
  2. producer采用push模式将数据发布到broker,每条消息追加到分区中,顺序写入磁盘,所以保证同一分区内的数据是有序的!
  3. 写入示意图如下:
    在这里插入图片描述
  • 每个partition都是一个有序且不可变的消息记录集合。
  • 新的消息写入partition的尾部。
  • 每条消息都会分配一个顺序的唯一标识 - offset,也叫偏移。
  • 同一个partition消息是有序的,不同的partition无法保证有序。
  • 可以为消息设置过期时间。

(5).partition结构

  1. 在机器上表现为多个文件夹。
  2. 每个文件夹中有多组segment文件。
  3. 每个segment文件又包含.index文件,.log文件,.timeindex文件。
  4. .log文件就是十几存储消息数据的文件。
  5. .index和.timeindex文件作为索引文件。

5.消费数据

  1. 每一个消费者组有一个唯一标识ID。
  2. 同一个消费者组中的 不同消费者,可以运行在不同进程甚至不同服务器上。
  3. 如果所有消费者 都在同一个组中,那消息会均衡的发送到每一个消费者。
  4. 如果所有消费者 都在不同的组中。那消息会被广播到每一个消费者

消费图:
在这里插入图片描述

  • server 1 和 server 2是两个节点,每个节点中有两个分区。
  • 同一组中,每个消费者可以消费多个分区。(我在A组,我可以去不同的分区消费)
  • 每个分区最多 只能被 同一个组中的一个消费者消费。(同一个分区,接待了我,就不能接待我所在的组的其他人了)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值