概念
Kafka是用Java编写的高吞吐、可容错、可扩展的分布式消息系统。
相比传统消息中间件(如ActiveMQ、RabbitMQ),具有高吞吐、内置分区、消息副本、容错、可扩展的特性,很适合大规模消息处理的应用场景。
高吞吐量的原因
Kafka的优势是高吞吐率,其高吞吐率得益于它的:顺序读写、批量发送、消息压缩、零拷贝。
为了增加存储能力,Kafka将所有消息都写入了低速大容量的硬盘,按理说这将导致性能损失,但尽管如此,Kafka仍然保持了超高的吞吐率。
因为,Kafka直接将数据写入到日志文件中,以追加的形式写入,线性的顺序访问磁盘,很多时候比随机的内存访问还要快的多。
应用场景
kafka的主要应用场景是日志收集和消息系统。
- 日志收集
利用日志排查问题时,通常是通过linux命令登录到后台查询日志文件,如果web应用是集群方式部署的,那么要快速定位问题就比较繁琐。现在流行的做法是,建立统一日志平台,就是将日志集中收集到kafka,然后再倒入Elasticsearch、HDFS、Storm等数据消费者,用于实时搜索、离线统计、数据分析、数据备份等。
- 限流消峰
某个热点事件或者某个时间点的营销活动(如双11秒杀),导致流量暴增,业务访问路径中的各个环节都将面对瞬时流量陡增。为了让系统在大流量场景下仍然可用,可以在系统业务环节中加入消息队列作为缓冲,缓解短时间内的高流量对系统的冲击压力。
MQ特性对比
-
Kafka
- Java写的,可靠性、稳定性、功能性表现都不错,可满足绝大多数应用场景的需要,与周边生态系统的兼容性最佳。
- 批量和异步的设计思想使其获得了不错的性能表现,与 RocketMQ 没有量级上的差异,大约每秒钟可处理几十万条消息。
-
RocketMQ
- Java写的,性能、稳定性和可靠性都值得信赖,每秒钟大概能处理几十万条消息。
- 缺点:是与周边生态系统的集成和兼容程度要略逊一筹,不够流行;
-
RabbitMQ
- erlang写的,容易部署和使用,路由规则灵活;
- 支持编程语言众多,大概是所有消息队列中支持语言最多的;
- 缺点:性能较差(每秒钟可处理几万到十几万条消息)
-
ZeroMQ
- c语言写的,适合于高吞吐量/低延迟的场景;易用灵活。
- 缺点:很多东西需要自己开发实现;不支持消息持久化。
-
Redis
- c语言写的,其List数据结构可简单迅速地实现消息队列。
- 缺点:与专业的消息队列系统相比,Redis的发布订阅略显粗糙。
安装部署
一、kafka安装部署_咸鱼最牛逼的博客-CSDN博客_kafka部署
-
创建、查看、删除topic
创建:./bin/kafka-topics.sh --create --zookeeper 192.168.1.100:2181 --config max.message.bytes=12800000 --config flush.messages=1 --replication-factor 1 --partitions 1 --topic test
查看:./bin/kafka-console-consumer.sh --bootstrap-server 192.168.1.100:9092 --from-beginning --topic helloworld
删除:修改 kafka/conf/server.properties,增加 delete.topic.enable=true,然后重启 kafka后执行 ./bin/kafka-topics.sh --delete --zookeeper 192.168.1.100:2181 --topic test
查看topic列表:./bin/kafka-topics.sh --zookeeper 192.168.1.100:2181 --list
-
生产和消费测试
生产:./kafka-console-producer.sh --broker-list 192.168.1.100:9092 --topic helloworld
消费:./kafka-console-consumer.sh --bootstrap-server 192.168.1.100:9092 --topic helloworld --from-beginning