之前的项目要实现自动化营销流程,不可避免要考虑到消息队列中间件的选型,团队最开始使用的是 Kafka, 后来项目改造,由于不支持多租户、消息不好追踪、可靠性小于可用性等等因素,转到了 RabbitMQ,也因为需求的吞吐量不是非常大,RabbitMQ 完全可以胜任。秉持按需学习,循序渐进的态度,逐步深入消息队列中间件的学习。本篇只是写下 Kafka 的基本原理、架构和概念。
回归正题,Kafka is a distributed, partitioned, replicated commit logservice.
简介
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于 zookeeper 协调的分布式消息系统。
它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx 日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
特性
- 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。
- 可扩展性:kafka集群支持热扩展
- 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
- 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
- 高并发:支持数千个客户端同时读写
使用场景
- 日志收集:收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
- 消息系统:解耦和生产者和消费者、缓存消息等。
- 用户活动跟踪:记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
- 运营指标:记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
- 流式处理:比如spark streaming和storm
- 事件源
名称概念
- Broker:Kafka节点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群。
- Topic:一类消息,消息存放的目录即主题,例如page view日志、click日志等都可以以topic的形式存在,Kafka集群能够同时负责多个topic的分发。
- Partition:topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列
- Segment:partition物理上由多个segment组成,每个Segment存着message信息
- Producer:生产message发送到topic
- Consumer:订阅topic消费message, consumer作为一个线程来消费
- Consumer Group:一个Consumer Group包含多个consumer, 这个是预先在配置文件中配置好的。各个consumer(consumer 线程)可以组成一个组(Consumer group ),partition中的每个message只能被组(Consumer group ) 中的一个consumer(consumer 线程 )消费,如果一个message可以被多个consumer(consumer 线程 ) 消费的话,那么这些consumer必须在不同的组。Kafka不支持一个partition中的message由两个或两个以上的consumer thread来处理,即便是来自不同的consumer group的也不行。它不能像AMQ那样可以多个BET作为consumer去处理message,这是因为多个BET去消费一个Queue中的数据的时候,由于要保证不能多个线程拿同一条message,所以就需要行级别悲观所(for update),这就导致了consume的性能下降,吞吐量不够。而kafka为了保证吞吐量,只允许一个consumer线程去访问一个partition。如果觉得效率不高的时候,可以加partition的数量来横向扩展,那么再加新的consumer thread去消费。这样没有锁竞争,充分发挥了横向的扩展性,吞吐量极高。这也就形成了分布式消费的概念。
- Replica:partition 的副本,保障 partition 的高可用。
- Leader replica 中的一个角色, producer 和 consumer 只跟 leader 交互。
- Follower:replica 中的一个角色,从 leader 中复制数据。
- Controller:kafka 集群中的其中一个服务器,用来进行 leader election 以及 各种 failover。
- Zookeeper:kafka 通过 zookeeper 来存储集群的 meta 信息。
设计思想
Consumer:客户端从broker拉的策略,支持批量拉和压缩,由消费者在zk记录消息offset
Producer:A 异步发送,支持累积数据量64k或者10毫秒;B 负载均衡,消费者发送的消息分发到不同的broker上
Broker:把文件系统作为存储系统,顺序写入磁盘,zero-copy方式文件传输
Replica:如果topic设置了replication,那意味着每个Partition都会有2个备份,对外提供服务的只有leader,follwer只是备份leader的数据;leader和follwer之间通过副本来选出leader,如果follwer跟不上leader就会被提出副本,如果leader不在,就会在副本中选取一个做为leader,如果所有的备份都down了,则选择最近down掉的一个备份作为leader
