消息中间件kafka简介
目的及应用场景
Kafka是linkedin的分布式消息系统,设计侧重高吞吐量,用于好友动态,相关性统计,排行统计,访问频率控制,批处理等系统。
传统的离线分析方案是使用日志文件记录数据,然后集中批量处理分析。这种方式对于实时性要求很高的活动流数据不适合,而大部分的消息中间件能够处理实时性要求高的消息/数据,但是对于队列中大量未处理的消息/数据在持久性方面比较弱。
设计理念
持久化消息
高吞吐量
consumer决定消息状态
系统中各个角色都是分布式集群
consumer有逻辑组的概念,每个consumer进程属于一个consumer组,每个消息会发给每个关注此消息的consumer组中的某一个consumer进程。
Linkedin使用了多个consumer组,每个组多个相同职责的consumer进程。
部署架构
消息持久化和缓存
Kafka使用磁盘文件做持久化,磁盘文件的读写速度在于如何使用,随机写比顺序写慢的多,现代os会在内存回收对性能影响不大的情况下尽量使用内存cache进行磁盘的合并写。所以用户进程再做一次缓存没有太大必要。Kafka的读写都是顺序的,以append方式写入文件。
为减少内存copy,kafka使用sendfile发送数据,通过合并message提升性能。
Kafka不储存每个消息的状态,而使用(consumer,topic,partition)保存每个客户端状态,大大减小了维护每个消息状态的麻烦。
在消息的推vs拉的选择上,kafka使用拉的方式,因为推的方式会因为各个客户端的处理能力、流量等不同产生不确定性。
负载均衡
Producers和brokers通过硬件做负载均衡,brokers和consumers都以集群方式运行,通过zookeeper协调变更和成员管理。