文章目录
- 消息队列通信的模式
- 1.点对点模式
- 2.发布订阅模式
- kafka
- 1.介绍:
- 2.特点:
- 3.使用场景:
- 3.kafka架构
- 4.kafka写入流程和消息存储
- (1).producer写入过程
- (2).选择partition的原则
- (3).kafka的ACK应答机制
- (4).partition有序写入
- (5).partition结构
- 5.消费数据
消息队列通信的模式
1.点对点模式
一个生产者对应一个消费者,生产者往队列里面发消。
- 优势:
1.消费者可以自己决定什么时候取消息。
2.消息取出来就没有了,不存在重复消费。 - 劣势:
1.消费者无法感知队列里面是否有消息要处理。
2.发布订阅模式
微信公众号就是消息生产者,关注这个号的粉丝就是消息消费者。
- 优势:
1.生产一个消息,所有消费者都可以同时收到,消费端不存在无法感知消息的情况.
2.由于不同消费者消费数据的速度不一样,推送的速度成为一个难题。假设三个消费者处理速度分别是 8M/s、5M/s、2M/s,如果队列推送的速度为 5M/s,则 consumer3 无法承受!如果队列推送的速度为 2M/s,则 consumer1、consumer2 会出现资源的极大浪费!
kafka
1.介绍:
是一个分布式数据流平台,可以运行在单台或多台服务器上形成集群。提供了发布和订阅功能,生产者和消费者能够独立的完成读操作和写操作。
2.特点:
- 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒
- 可扩展性:kafka集群支持热扩展
- 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
- 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
- 高并发:支持数千个客户端同时读写
3.使用场景:
- 日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等分析处理。
- 消息系统:解耦和生产者和消费者、缓存消息等。
- 用户活动跟踪:Kafka经常被用来记录用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
- 监控数据:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
- 流式处理:比如spark streaming和storm
- 事件溯源
3.kafka架构
- Producer:Producer即生产者,消息的产生者,是消息的入口。
- Broker:Broker是kafka实例,每个服务器上有一个或多个kafka的实例,我们姑且认为每个broker对应一台服务器。每个kafka集群内的broker都有一个不重复的编号,如图中的broker-0、broker-1等……, 一个 broker可以容纳多个 topic。
- Topic:消息的主题,可以理解为消息的分类,kafka的数据就保存在topic。在每个broker上都可以创建多个topic。
- Partition:Topic的分区,每个topic可以有多个分区,分区的作用是做负载,提高kafka的吞吐量。同一个topic在不同的分区的数据是不重复的,partition的表现形式就是一个一个的文件夹!
- Replication:每一个分区都有多个副本,副本的作用是做备胎。当主分区(Leader)故障的时候会选择一个备胎(Follower)上位,成为Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器(因为如果这个机器挂了,那么全部都挂了,就没有leader了),同一机器对同一个分区也只可能存放一个副本(包括自己)。
- Message:每一条发送的消息主体。
- Consumer:消费者,即消息的消费方,是消息的出口。
- Consumer Group:我们可以将多个消费组组成一个消费者组,在kafka的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量!
- 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有序写入
- topic是同一类别的消息集合,一个topic通常有多个订阅者,kafka为每一个topic维护了一个分区数据日志文件.
- producer采用push模式将数据发布到broker,每条消息追加到分区中,顺序写入磁盘,所以保证同一分区内的数据是有序的!
- 写入示意图如下:
- 每个partition都是一个有序且不可变的消息记录集合。
- 新的消息写入partition的尾部。
- 每条消息都会分配一个顺序的唯一标识 - offset,也叫偏移。
- 同一个partition消息是有序的,不同的partition无法保证有序。
- 可以为消息设置过期时间。
(5).partition结构
- 在机器上表现为多个文件夹。
- 每个文件夹中有多组segment文件。
- 每个segment文件又包含.index文件,.log文件,.timeindex文件。
- .log文件就是十几存储消息数据的文件。
- .index和.timeindex文件作为索引文件。
5.消费数据
- 每一个消费者组有一个唯一标识ID。
- 同一个消费者组中的 不同消费者,可以运行在不同进程甚至不同服务器上。
- 如果所有消费者 都在同一个组中,那消息会均衡的发送到每一个消费者。
- 如果所有消费者 都在不同的组中。那消息会被广播到每一个消费者
消费图:
- server 1 和 server 2是两个节点,每个节点中有两个分区。
- 同一组中,每个消费者可以消费多个分区。(我在A组,我可以去不同的分区消费)
- 每个分区最多 只能被 同一个组中的一个消费者消费。(同一个分区,接待了我,就不能接待我所在的组的其他人了)