Why kafka
消息队列的作用:异步、削峰填谷、解耦
中小型公司,技术实力较为一般,技术挑战不是特别高,用 RabbitMQ (开源、社区活跃)是不错的选择;大型公司,基础架构研发实力较强,用 RocketMQ(Java二次开发) 是很好的选择。
如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。
RabbitMQ
RabbitMQ开始是用在电信业务的可靠通信的,也是少有的几款支持AMQP协议的产品之一。
优点:
-
轻量级,快速,部署使用方便
-
支持灵活的路由配置。RabbitMQ中,在生产者和队列之间有一个交换器模块。根据配置的路由规则,生产者发送的消息可以发送到不同的队列中。路由规则很灵活,还可以自己实现。
-
RabbitMQ的客户端支持大多数的编程语言,支持AMQP协议。
缺点:
- 如果有大量消息堆积在队列中,性能会急剧下降
- 每秒处理几万到几十万的消息。如果应用要求高的性能,不要选择RabbitMQ。
- RabbitMQ是Erlang开发的,功能扩展和二次开发代价很高。
RocketMQ
借鉴了Kafka的设计并做了很多改进,几乎具备了消息队列应该具备的所有特性和功能。
- RocketMQ主要用于有序,事务,流计算,消息推送,日志流处理,binlog分发等场景。
- 经过了历次的双11考验,性能,稳定性可靠性没的说。
- java开发,阅读源代码、扩展、二次开发很方便。
- 对电商领域的响应延迟做了很多优化。
- 每秒处理几十万的消息,同时响应在毫秒级。如果应用很关注响应时间,可以使用RocketMQ。
- 性能比RabbitMQ高一个数量级,。
- 支持死信队列,DLX 是一个非常有用的特性。它可以处理异常情况下,消息不能够被消费者正确消费而被置入死信队列中的情况,后续分析程序可以通过消费这个死信队列中的内容来分析当时所遇到的异常情况,进而可以改善和优化系统。
缺点:
跟周边系统的整合和兼容不是很好。
Kafka
高可用,几乎所有相关的开源软件都支持,满足大多数的应用场景,尤其是大数据和流计算领域,
- Kafka高效,可伸缩,消息持久化。支持分区、副本和容错。
- 对批处理和异步处理做了大量的设计,因此Kafka可以得到非常高的性能。
- 每秒处理几十万异步消息消息,如果开启了压缩,最终可以达到每秒处理2000w消息的级别。
- 但是由于是异步的和批处理的,延迟也会高,不适合电商场景。
What Kafka
- Producer API:允许应用程序将记录流发布到一个或多个Kafka主题。
- Consumer API:允许应用程序订阅一个或多个主题并处理为其生成的记录流。
- Streams API:允许应用程序充当流处理器,将输入流转换为输出流。
消息Message
Kafka的数据单元称为消息。可以把消息看成是数据库里的一个“数据行”或一条“记录”。
批次
为了提高效率,消息被分批写入Kafka。提高吞吐量却加大了响应时间
主题Topic
通过主题进行分类,类似数据库中的表,
分区Partition
Topic可以被分成若干分区分布于kafka集群中,方便扩容
单个分区内是有序的,partition设置为一才能保证全局有序
副本Replicas
每个主题被分为若干个分区,每个分区有多个副本。
生产者Producer
生产者在默认情况下把消息均衡地分布到主题的所有分区上:
- 直接指定消息的分区
- 根据消息的key散列取模得出分区
- 轮询指定分区。
消费者Comsumer
消费者通过偏移量来区分已经读过的消息,从而消费消息。把每个分区最后读取的消息偏移量保存在Zookeeper 或Kafka上,如果消费者关闭或重启,它的读取状态不会丢失。
消费组ComsumerGroup
消费组保证每个分区只能被一个消费者使用,避免重复消费。如果群组内一个消费者失效,消费组里的其他消费者可以接管失效消费者的工作再平衡,重新分区
节点Broker
连接生产者和消费者,单个broker可以轻松处理数千个分区以及每秒百万级的消息量。
- broker接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。
- broker为消费者提供服务,响应读取分区的请求,返回已经提交到磁盘上的消息。
集群
每隔分区都有一个首领,当分区被分配给多个broker时,会通过首领进行分区复制。
生产者Offset
消息写入的时候,每一个分区都有一个offset,即每个分区的最新最大的offset。
消费者Offset
不同消费组中的消费者可以针对一个分区存储不同的Offset,互不影响
LogSegment
- 一个分区由多个LogSegment组成,
- 一个LogSegment由
.log .index .timeindex组成 .log追加是顺序写入的,文件名是以文件中第一条message的offset来命名的.Index进行日志删除的时候和数据查找的时候可以快速定位。.timeStamp则根据时间戳查找对应的偏移量。
How Kafka
优点
-
高吞吐量:单机每秒处理几十上百万的消息量。即使存储了TB及消息,也保持稳定的性能。
- 零拷贝 减少内核态到用户态的拷贝,磁盘通过sendfile实现DMA 拷贝Socket buffer
- 顺序读写 充分利用磁盘顺序读写的超高性能
- 页缓存mmap,将磁盘文件映射到内存, 用户通过修改内存就能修改磁盘文件。
-
高性能:单节点支持上千个客户端,并保证零停机和零数据丢失。
-
持久化:将消息持久化到磁盘。通过将数据持久化到硬盘以及replication防止数据丢失。
-
分布式系统,易扩展。所有的组件均为分布式的,无需停机即可扩展机器。
-
可靠性 - Kafka是分布式,分区,复制和容错的。
-
客户端状态维护:消息被处理的状态是在Consumer端维护,当失败时能自动平衡。
应用场景
- 日志收集: 用Kafka可以收集各种服务的Log,通过大数据平台进行处理;
- 消息系统: 解耦生产者和消费者、缓存消息等;
- 用户活动跟踪: Kafka经常被用来记录Web用户或者App用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到Kafka的Topic中,然后消费者通过订阅这些Topic来做运营数据的实时的监控分析,也可保存到数据库;
- [ 萱儿AXW ]