为什么需要消息队列
在高并发的应用场景中,由于来不及同步处理请求,接收到的请求往往会发生阻塞,例如高并发的数据库应用场景,就会有大量的插入,更新请求同时到达数据库,这会导致行或者表被锁住,最后会因为请求堆积过多触发 “连接数过多的异常”错误。
什么是消息队列
从字面上来看,是一个队列,拥有先进先出的特性,用于不同进程间的通信,详细队列采用异步通信机制,即,生产者消费者无需同时与消息队列进行数据交互,消息会一直在队列中,直到被接收者读取。
消息队列主要有哪些作用
应用解耦:多个应用可通过消息队列对相同的消息进行处理,应用之间相互独立,互不影响。如下图客户端上传后就不需要继续关心数据是否被消费,她只关心图片是否被写入了消息队列
异步处理: 相比串行和并行,异步处理可以减少处理的时间。
假设数据写入数据库,短信信息,邮件信息时间均为20s,异步处理的过程中,数据写入到消息队列是很快的,写入之后,写入短信和邮件的操作相当于同步运行的,等数据写入数据库后,异步系统早就已经完成了,串行 、并行 都是 40s ,异步执行是 20s。
数据限流 :流量高峰期,可以通过消息队列来控制流量,避免流量过大引起系统崩溃。
某些秒杀系统中,可以设置队列的长度,在队列外的请求直接舍弃。
消息通信: 实现点对点消息队列或者聊天室等。
生产者,消费者,消息队列的使用场景。
Kafka 架构简图及核心概念瞎编
Broker (代理)
在Kafka集群中,一个Kafka实例被称为一个代理,通过在Kafka集群中,一台服务器上部署一个Kafka实例。
Producer (生产者)
producer将消息记录发送到Kafka指定的主题中进行存储,producer还可以自定义算法将消息发送到哪个分区。
(例如,获取消息主键的哈希值,并使用该值对分区数进行哈希取模,得到分区索引)
Consumer (消费者)
从Kafka集群指定的主题中读取消息记录
Consumer Group (消费者组)
一个消费者组可以包含一个或多个消费者程序,使用多分区和多线程模式可以极大提高读取数据的效率。
Topic (主题)
用来区分不同业务类型的消息记录。
Partition (分区)
kafka通过分区来支持物理层面的并发读写,以提高Kafka集群的吞吐量,每个分区内部的消息记录是有序的,每个消息都有一个连续的偏移量序号(offset)
Record (记录)
被实际写入Kafka集群并可被消费者读取的数据被称为记录,组成为 (offset+segment+timestamp)
Kafka设计需求
高吞吐量。
应用于秒级数据流巨大的场景。
高可用队列 。
分布式队列具有大数量的积压能力,并留有副本来进行容灾。
低延时
实时场景对时延要求特别严格。
Kafka特性
异步生产数据
数据以异步的形式发送,大大提高了客户端写数据的效率,在与kafka集群交互的时候,减少等待时间。
偏移量
offset
安全机制
Kafka0.9后,系统添加了安全机制,可以通过SSL和SASL安全机制来进行身份确认(生产者,消费者身份确认)
连接器
外部系统与数据集之间建一个数据流管道,以实现数据的读与写。
机架感知
当kafka某个机架发生故障的时候,通过机架感知让Kafka的备份数据分不到不同的机架上,提高数据的高可用性。
数据流
这一特性就是满足kafka数据经过流计算后重新回到kafka集群中所准备。
时间戳
在kafka0.10及以后的版本中,生产者为写入的每一条消息记录都加入了时间戳,在写入消息的过程中,如果用户没有指定该消息的时间,则该消息的时间会被自动加上。
消息语义
Kafka 0.11 版本中,实现了消息语义
1.至少一次
2.至多一次
3.精准一次
Kafka 适用于哪些场景
1.日志收集
2.消息系统
3.用户轨迹
4.记录运营监控数据
5.实现流处理
6.事件源
发送消息到Kafka主题
Kafka系统支持两种不同的发送方式。
同步模式
同步模式会调用send方法,返回future对象,同时调用get方法等待future对象,看send()方法是否发送成功(指的是发送到某某实例中的某某分区)
同步模式使用场景:
数据写入到Kafka集群代理节点的时候,需要立即知道消息是否写入成功,此时需要同步模式。
异步模式
使用异步模式发送消息时,消息会先进入缓冲区,生产者会得到一个返回的结果值,之后,缓冲区中的数据会通过异步模式发送到kafka代理节点的某个分区中。
代码方法:调用send方法(写入缓冲区),callback()方法告知结果。
异步模式使用场景:
大数据量,要求耗时比较低的场景。