注:本文部分引用自《Kafka 入门与实践》
概述
应用场景
- 应用解耦:降低系统耦合性
- 流量控制:削峰填谷
- 异步通信
消息系统的分类
从消息通信上看,消息系统可分为两类:同步消息机制、异步消息机制。
从消息的传递方式上看,可分为:队列、主题。
消息中间件
Kafka、RocketMQ、ActiveMQ、RabbitMQ、Pulsar
Kafka
Kafka 是一款基于发布订阅模式的消息系统。
Kafka 的集群结构
Kafka 的特性
- 消息持久化
Kafka 依赖文件系统来存储和缓存消息。 - 高吞吐量
Kafka 将数据写到磁盘,充分利用磁盘的顺序读写。同时,Kafka 在数据写入及数据同步采用了零拷贝技术,避免了内核缓冲区与用户缓冲区之间的拷贝,操作效率极高。Kafka 还支持数据压缩及批量发送,同时 Kafka 将每个主题划分为多个分区。这一系列的优化及实现方法使得 Kafka 有很高的吞吐量。 - 扩展性
Kafka 是分布式的。Kafka 依赖 ZooKeeper 来对集群进行协调管理,生产者、消费者和 Broker 都是分布式的,可以配置多个。同时在机器扩展时,无需将整个集群停机,集群能够自动感知,重新进行负载均衡及数据复制。 - 多客户端支持
Kafka 核心模块使用 Scala 语言开发,但 Kafka 支持不同语言开发生产者和消费者客户端应用程序,如 Java、Scala、C、C++、Python、Go、Erlang、Ruby、Node.js 等。 - 消息压缩
Kafka 支持 GZip、Snappy、LZ4 这 3 种压缩方式,通常把多条消息放在一起组成 MessageSet,然后再把 MessageSet 放到一条消息里面去,从而提高压缩比率进而提高吞吐量。 - 数据备份
Kafka 可以为每个主题指定副本数,对数据进行持久化备份,这可以一定程度上防止数据丢失,提高可用性。 - 轻量级
Kafka 的代理是无状态的,即代理不记录消息是否被消费,消费偏移量的管理交由消费者自己或组协调器来维护。同时集群本身几乎不需要生产者和消费者的状态信息,这就使得 Kafka 非常轻量级,同时生产者和消费者客户端实现也非常轻量级。 - 安全机制
Kafka 支持以下几种安全措施:- 通过 SSL 和 SASL (Kerberos),SASL/PLAIN 验证机制支持生产者、消费者与代理连接时的身份认证;
- 支持代理与 ZooKeeper 连接身份验证;
- 通信时数据加密;
- 客户端读、写权限认证;
- Kafka 支持与外部其他认证授权服务的集成。
Q&A
- 为什么 Kafka 的消息持久化依赖文件系统而不是内存?
因为 Kafka 在设计上采用了时间复杂度 O(1) 的磁盘结构,它提供了常量时间的性能。使用文件系统和依赖于页缓存的存储比维护一个内存的存储更有优势,因此 Kafka 选择以文件系统来存储数据。
文件系统存储速度的快慢取决于我们对磁盘的用法。磁盘线性读写的速度约是随机读写的 6000 多倍,并且现代的操作系统提供了预读和延迟写技术。
Kafka 是基于 JVM 的,Java 对象对内存的消耗非常高,随着 Java 对象的增加 JVM 的垃圾回收也越来越频繁和繁琐,这些都加大了内存的消耗。
使用消息队列会带来哪些问题?
1. 系统可用性降低
如果 MQ 挂掉会影响系统可用性。
2. 系统复杂度提高
需要保证消息没有被重复消费、保证消息顺序、处理消息丢失的情况。
3. 数据一致性问题
异步消费在提升系统响应速度的同时也带来了数据一致性的问题。