消息中间件的作用:
- 异步处理:
- 与并行相比,虽然减少了时间,但是还是得等待其他线程执行完,但是消息中间件对于简单的业务处理,还要引入一个中间件也比较复杂
- 如果我投递了简历之后需要发送成功邮件以及短信,就可以交给消息中间件
- 就像数据库、redis数据一致性,需要用到延迟双删,也可以异步处理
- 应用解耦:
- 比如用户下单之后,需要去库存系统缩减库存,这时候呢如果通过feign远程调用,这样耦合度就比较高,通过消息中间件去确保最终一致性
- 流量削峰:
- 像12306在抢票的时候,并发量极高,就将这些请求放在消息队列中一个个的去处理
- 日志处理:
- 将日志放在消息队列中,解决大日志传输的问题。
- 流处理
Kafka的优点:
- 天然支持分布式
- 持久化数据(默认保存七天)
- 流式处理动态的数据
- 高性能、高可用、高伸缩性(集群目标)
基本概念:
- 消息和批次:
- 消息:由字节数组组成
- 为了提高效率,会将消息以批次(生产者源码里的缓冲池)的形式写入
- 序列化和反序列化(JSON或者XML)
- 主题和分区:
- topic:以主题的形式进行分类(类似于数据库中的表),一个主题可以跨越多个服务器,高性能之一,多台服务器磁盘读写比单台更高
- partition:一个topic对应多个分区,消息顺序追加
- 生产者:
- 消息默认情况下均衡分布在所有分区上,如果需要指定分区,可以自己写分区器或者根据key
- 直接指定分区:
- 消费者:
- 消费者订阅主题,可以订阅不同的主题,可以负责不同分区,但是一个分区只能对应一个消费者,按照消息顺序读写
- 分区的偏移量都会保存在kafka上consumer_offset这个主题上
- Broker和集群:
- 主要工作接收消息,设置偏移量,磁盘保存
- 拉模式,响应请求
- Brocker会组成一个集群,每个集群中会选出一个集群控制器( Kafka使用 Zookeeper的临时节点来选举控制器,并在节点加入集群或退出集群时通知控制器)。包括进行分区,监控brocker
- 集群内布通过管道技术进行高效的复制
- 消息持久化:要么时间7天要么大小1G
- 常见配置:
- brocker id 集群不能重复
- listeners:监听列表
- zookeeper connect:集群的地址
- num partitions:分区数量
- 日志时间
- 分区大小
- 日志片段大小
- 能接收的最大字节数
- 硬件对于性能的影响:
- 磁盘吞吐量影响生产者,写的快性能就好
- 内存影响消费者,消费者数据一般从内存之