1. Kafka简介
1.1 开发中遇到的问题
- 非必要的业务逻辑以同步(串行)的方式运行,太耗费时间
- 系统间耦合性太强
- 流量激增导致宕机
1.2 消息队列Message Queue
1.2.1 消息队列是什么
消息队列,即MQ,Message Queue。
不同进程(process)之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改另一个进程,为了隔离这两个进程,在两进程间抽离出一层(一个模块),所有两进程之间传递的消息,都必须通过消息队列来传递,单独修改某一个进程,不会影响另一个;
不同进程(process)之间传递消息时,为了实现标准化,将消息的格式规范化了,并且,某一个进程接受的消息太多,一下子无法处理完,并且也有先后顺序,必须对收到的消息进行排队,因此诞生了事实上的消息队列;
消息队列是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。
结合前面所说的问题:
- 注册服务对保存注册信息以后,无需去发送邮件、短信,只是发送一条消息,不用关心消息被谁接收。
- 邮件、短信服务接收消息,去处理各自的业务。
- 如果以后有其它系统(如日志系统)也依赖注册服务的数据,同样监听消息即可,注册服务无需任何代码修改。
1.2.2 消息队列的作用
异步处理
用户注册后,需要发注册邮件和注册短信。传统的串行方式会等所有业务执行完成后再返回结果。并行方式将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信,可以加快响应速度。
应用解耦
利用消息队列存储消息,需要消费消息的系统只需要订阅消息队列即可,有新的业务加入时无需修改原本的代码。
流量削锋
高并发请求同时对数据库执行写操作,可能会导致数据库卡死导致宕机
。将请求消息保存到消息队列,系统可以按照自己的能力来消费消息。
1.2.3 消息队列主流产品概述
1、Apache Kafka:
Apache Kafka是一个分布式流处理平台,具有高吞吐量、低延迟和可靠性等特点。它广泛应用于实时数据处理、日志收集、消息队列等场景。
2、基于JMS的产品:
JMS: Java Message Service API(Java消息服务)只能在java中使用
- Apache ActiveMQ:比较成熟的产品
- RocketMQ:阿里巴巴产品,目前交由Apache基金会
3、基于AMQP的产品
AMQP:Advanced Message Queuing Protocol(高级消息队列协议) 基于协议的,可以跨语言使用
- RabbitMQ:erlang语言开发,稳定性好,响应快。
主流消息队列对比表:
特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
开发语言 | java | erlang | java | scala |
单机吞吐量 | 万级 | 万级 | 10万级 | 100万级 |
时效性 | ms | us | ms | ms级以内 |
可用性 | 高(主从) | 高(主从) | 非常高(分布式) | 非常高(分布式) |
功能特性 | 成熟的产品、较全的文档、各种协议支持好 | 并发能力强、性能好、延迟低,社区活跃度高,数据量没有那么大,优先选择功能比较完备的RabbitMQ | MQ功能比较完善,扩展性佳,可靠性要求高的金融互联网领域使用多,稳定性高,经历了多次阿里双11考验 | 只支持主要的MQ功能,大数据领域使用多,追求高吞吐量,适合产生大量数据的互联网服务的数据收集业务 |
1.2.4 消息分类
推消息模型(Push)
消息生产者将消息发送给消息服务器后,消息服务器主动地将消息“推送”给消费者。
拉消息模型(Pull)
消息生产者将消息发送给消息服务器后,由消息消费者主动从消息服务器中拉取该消息。
Long-Polling
Long-Polling是Pull模式的变种。Pull模型中不管服务端数据有无更新,客户端每隔定长时间拉取一次数据,可能有更新数据返回,也可能什么都没有。Long Polling是指客户端发起Long Polling,此时如果服务端没有消息,会hold住请求,直到服务端有可消费的消息,或者到达超时时间才会返回请求。返回后,客户端又会立即再次发起下一次Long Polling。这种方式解决了Pull模式数据通知不及时的问题,且减少了大量的无效轮询次数。
1.3 Kafka起源和特点
1.3.1 Kafka是什么
Kafka是Apache开源的一款基于zookeeper协调的分布式消息系统,具有高吞吐率、高性能、实时、高可靠等特点,可实时处理流式数据。它最初由LinkedIn公司开发,使用Scala语言编写。
Kafka
历经数年的发展,从最初纯粹的消息引擎,到近几年开始在流处理平台生态圈发力,多个组织或公司发布了各种不同特性的产品。常见产品如下:
- Apache Kafka :最“正统”的
Kafka
也是开源版,它是后面其他所有发行版的基础。 - Cloudera/Hortonworks Kafka :集成了目前主流的大数据框架,能够帮助用户实现从分布式存储、集群调度、流处理到机器学习、实时数据库等全方位的数据处理。
- Confluent Kafka :主要提供基于
Kafka
的企业级流处理解决方案。
Apache Kafka
,它现在依然是开发人数最多、版本迭代速度最快的Kafka
。我们使用此产品学习。Apache 目前为止总共演进了8个大版本,分别是0.7、0.8、0.9、0.11、1.0、2.0和3.0,我们选择3.6.0版本讲解。
1.3.2 Kafka能干嘛
Kafka特点
-
高吞吐量、低延迟:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息,它的延迟最低只有几毫秒
-
持久性:支持消息持久化,即使数TB级别的消息也能够保持长时间的稳定性能。
-
可靠性:支持数据备份防止丢失
-
容错性:支持通过Kafka服务器和消费机集群来分区消息,允许集群中的节点失败(若分区副本数量为n,则允许n-1个节点失败)
-
高并发:单机可支持数千个客户端同时读写,支持在线水平扩展。可无缝对接hadoop、strom、spark等,支持Hadoop并行数据加载,
1.3.3 Kafka去哪下
kafka官网 | https://kafka.apache.org/ |
---|---|
kafka下载 | https://kafka.apache.org/downloads |
1.3.4 Kafka怎么玩
ID | 设计目标 | 功能 |
---|---|---|
1 | 日志收集 | 一个公司可以用Kafka可以收集各种服务的Log,通过Kafka以统一接口服务的方式开放给各种Consumer |
2 | 消息系统 | 解耦生产者和消费者、缓存消息等 |
3 | 用户活动跟踪 | 用来记录web用户或者APP用户的各种活动,如网页搜索、搜索、点击,用户数据收集然后进行用户行为分析。 |
4 | 运营指标 | Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告 |
5 | 流式处理 | 比如Spark Streaming和Storm |