一、kafka是什么
Kafka官网说自己是一个事件流平台(event stream platform),但我们通常认为它和RabbitMQ一样是个消息队列。 详细的说: Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replication), 基于zookeeper协调的分布式消息系统,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目
二、为何要用kafka?用在哪?
1、储备知识:生产者消费者模型
并发编程模型:
生产者P--------------缓冲区(消息队列)------------------消费者C
优点:
1、分工明确:生产者与消费者解耦合
2、提高效率:生产与消费可以并行,不必互相等
3、缓解压力:通过缓冲区,平衡P与C的速度差,可在P与C工作速度不匹配的情况下,保证系统能够持续运行。
4、灵活扩缩:可根据需要灵活增加与减少生产者或消费者
2、为何要用kafka
我们可以将很多高并发系统的交互视为生产者与消费者之间的交互,引入消息队列可以实现下述两点好处,而kafka则是消息队列的佼佼者 1、异步解耦 作为淘宝/天猫主站核心的交易系统,每笔交易订单数据的产生会引起几百个下游业务系统的关注, 如下图所示,用户与交易系统对接后完成支付,将消息发送到消息队列指定topic中,下游服务收到后自行处理后续工作就行,如此 便不会影响到核心的支付功能(还有类似app push、短信通知等都是类似的架构设计)2、削峰填谷 “削峰”指的是在流量/负载高峰期间,通过某些手段将部分高峰流量或负载延后或分散处理,以减小系统负载,防止系统过载或崩溃。 “填谷”则相反,是指在低谷期利用系统多余的资源,提前处理那些可以延时处理的负载或处理暂时被削峰策略延后处理的任务, 从而使系统资源得到更充分的利用,提高系统整体的效率。 总的来说: 当系统中生产者与消费者往往速度有差异,引入缓冲区或者消息队列可以加以平衡,从而提升系统的抗并发能力 可以确保即便在处理能力有限或者发生故障的情况下,数据生产者也能正常运行 详细的说: 面对特殊场景如秒杀(2020 年双十一交易峰值达到 58.3W 笔/秒)、春晚红包等万亿级流量的脉冲式压力下,一种保护我们系统的服务免于崩溃的有效手段就是消息队列。 通过消息中心高性能的存储和处理能力,将超过系统处理能力的多余流量暂时存储起来,并在系统处理能力内平缓释放出来,达到削峰的效果。 比如阿里的广告计费系统,面对上万并发的商业贴检索量,数千并发的点击操作,实时接口的方式一定是不合适的,毕竟广告行为和支付行为不一样, 支付失败用户还可以重试,但用户的商业贴点击行为是不可回放的,本次流量过去就过去了,因此,需要利用消息队列将扣费请求缓存下来,来保证计费系统的稳定。 这便是填谷
3、kafka的优良特性
4、kafka的应用场景
消息队列:解耦和生产者和消费者、缓存消息等。 日志收集:可用Kafka收集各种服务的日志,通过统一开放给各种consumer,例如hadoop、Hbase等。 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动, 这些活动信息被各个服务器发布到kafka的topic中, 然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。 运营指标:Kafka也常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告 流式处理: 流式处理是一种实时处理和分析数据的方式:数据在生成或接收的那一刻即刻被处理,而不是先存储起来进行后续的批处理 这种方式对于那些需要实时响应的场景特别有用,如实时分析和监控、实时推荐和定制、复杂事件处理、实时决策制定等 知名的流式处理技术和框架有Apache Storm、Apache Flink、Apache Kafka等。
三、部署kafka
先参照这篇文章部署一个kafka:https://egonlin.com/?p=10274
四、kafka架构与名词解释
如下图所示,创建三个topic
#1、创建一个topic命名为TopicA,该主题包含两个分区,每个分区有3个副本 kafka-topics.sh --create --zookeeper zookeeper:2181\ --replication-factor 3 --partitions 2 --topic TopicA #2、创建一个topic命名为TopicB,该主题包含1个分区,每个分区有3个副本 kafka-topics.sh --create --zookeeper zookeeper:2181 \ --replication-factor 3 --partitions 1 --topic TopicB #3、创建一个topic命名为TopicC,该主题包含1个分区,每个分区有2个副本 kafka-topics.sh --create --zookeeper zookeeper:2181 \ --replication-factor 2 --partitions 1 --topic TopicB