Kafka特点
Kafka已被多家不同类型的公司作为多种类型的数据管道和消息系统使用。行为流数据是几乎所有站点在对其网站使用情况做报表时都要用到的数据中最常规的部分。
- 包括页面访问量 PV、页面曝光 Expose、页面点击 Click 等行为事件;
- 实时计算中的 Kafka Source,Dataflow Pipeline;
- 业务的消息系统,通过发布订阅消息解耦多组微服务,消除峰值;
Kafka 是由 LinkedIn开发并开源的分布式消息系统,因其分布式及高吞吐率而被广泛使用,现已与Cloudera Hadoop,Apache Storm,Apache Spark集成。
Kafka是一种分布式的,基于发布/订阅的消息系统。
主要设计目标如下:
- 顺序读写:以 时间复杂度为 O(1) 的方式提供消息持久化能力,即使对 TB 级以上数据也能保证常数时间复杂度的访问性能;
- 高吞吐率:即使在非常廉价的商用机器上也能做到单机支持每秒 100K 条以上消息的传输;
- 支持 Kafka Server 间的消息分区,及分布式消费,同时保证每个 Partition 内的消息顺序传输;
- 同时支持 离线数据处理和实时数据处理 ;
- Scale out:支持在线水平扩展;
kafka的优点:
- 支持多个生产者和消费者
- 支持broker的横向拓展
- 副本集机制,实现数据冗余,保证数据不丢失
- 通过topic将数据进行分类
- 通过分批发送压缩数据的方式,减少数据传输开销,提高吞高量
- 支持多种模式的消息
- 基于磁盘实现数据的持久化,可以无限回放(数据分析、流量分析、场景回溯)
- 高性能的处理信息,在大数据的情况下,可以保证亚秒级的消息延迟
- 一个消费者可以支持多种topic的消息
- 对CPU和内存的消耗比较小
- 对网络开销也比较小
- 支持跨数据中心的数据复制
- 支持镜像集群
kafka的缺点:
- 由于是批量发送,所以数据达不到真正的实时
- 对于mqtt协议不支持
- 不支持物联网传感数据直接接入
- 只能支持统一分区内消息有序,无法实现全局消息有序
- 监控不完善,需要安装插件
- 需要配合zookeeper进行元数据管理
- 会丢失数据,并且不支持事务
- 可能会重复消费数据,消息会乱序,可用保证一个固定的partition内部的消息是有序的,但是一个topic有多个partition的话,就不能保证有序了,需要zookeeper的支持,topic一般需要人工创建,部署和维护一般都比mq高
数据管道
Kafka 的使用场景
- 活动跟踪:Kafka 可以用来跟踪用户行为,比如我们经常回去淘宝购物,你打开淘宝的那一刻,你的登陆信息,登陆次数都会作为消息传输到 Kafka ,当你浏览购物的时候,你的浏览信息,你的搜索指数,你的购物爱好都会作为一个个消息传递给 Kafka ,这样就可以生成报告,可以做智能推荐,购买喜好等。
- 传递消息:Kafka 另外一个基本用途是传递消息,应用程序向用户发送通知就是通过传递消息来实现的,这些应用组件可以生成消息,而不需要关心消息的格式,也不需要关心消息是如何发送的。
- 度量指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
- 日志记录:Kafka 的基本概念来源于提交日志,比如我们可以把数据库的更新发送到 Kafka 上,用来记录数据库的更新时间,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
- 流式处理:流式处理是有一个能够提供多种应用程序的领域。
- 限流削峰:Kafka 多用于互联网领域某一时刻请求特别多的情况下,可以把请求写入Kafka 中,避免直接请求后端程序导致服务崩溃。
kafka怎么提高效率
- 顺序读写
- 零拷贝
- 消息压缩
- 分批发送
消息系统(Messaging System,也可以叫消息引擎)
- 解耦
消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
而基于消息发布订阅的机制,可以联动多个业务下游子系统,能够不侵入的情况下分步编排和开发,来保证数据一致性。 - 冗余
有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的”插入-获取-删除”范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。 - 扩展性
因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。扩展就像调大电力按钮一样简单。 - 灵活性 & 峰值处理能力
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见;如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。 - 可恢复性
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。 - 顺序保证
在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。Kafka保证一个 Partition 内的消息的有序性。 - 缓冲
在任何重要的系统中,都会有需要不同的处理时间的元素。消息队列通过一个缓冲层来帮助任务最高效率的执行,写入队列的处理会尽可能的快速。该缓冲有助于控制和优化数据流经过系统的速度。 - 异步通讯
很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
总结:
- 解耦:减少模块之间杂乱的调用关系。
- 回放:可用来分析问题和做数据分析。
- 容错:消费者挂了不影响整体。
- 缓冲:解决生产者和消费者速度不一致的问题。
- 削峰:减少冗余服务器,防止异常流量洪峰。
- 异步:立即返回结果,将不重要的事情延迟处理。
当你停下来休息的时候,不要忘记别人还在奔跑!