- Kafka重要概念
- Kafka核心API
- Kafka使用场景
1 Kafka重要概念
- 主流MQ对比
- 主要功能
- 相关概念
1.1 主流MQ对比
ActiveMQ | RabbitMQ | Kafka | |
---|---|---|---|
所属社区 | Apache | Mozilla Public License | Apache/LinkedIn |
开发语言 | Java | Erlang | Scala |
支持的协议 | OpenWire、STOMP、REST、AMQP、XMPP | AMQP | 仿AMQP |
事务 | 支持 | 不支持 | 0.11开始支持 |
集群 | 支持 | 支持 | 支持 |
负载均衡 | 支持 | 支持 | 支持 |
动态扩容 | 不支持 | 不支持 | 支持(zk) |
1.2 主要功能
Apache Kafka是一个分布式流处理平台,流处理平台特性如下:
- 可以发布和订阅流式的记录,这一方面与消息队列或者企业消息系统类似
- 可以储存流式的记录,并且有较好的容错性
- 可以在流式记录产生时就进行处理
1.3 相关概念
- kafka作为一个集群运行在一个或多个服务器上
- kafka通过topic对存储的流数据进行分类
- 每条记录中包含一个key,一个value和一个timestamp(时间戳)
AMQP(Advanced Message Queuing Protocol)是一个提供统一消息服务的标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件而设计。
AMQP服务器端(Broker):用来接收生产者发送的消息并将这些消息路由给服务器中的队列
消费者(Consumer):从消息队列中请求消息的客户端应用程序
- 如果所有消费者实例在同一消费组中,消息记录会负载均衡到每一个消费者实例。
- 如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程。
生产者(Producer):向broker发布消息的客户端应用程序,往某个Topic上发布消息,生产者也负责选择发布到Topic上的哪一个分区,开发者负责选择分区的算法。
数据主题(Topic):数据记录发布的地方,可以用来区分业务系统。kafka中的topics总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。
分区(Partition)
2 Kafka核心API
- 四个核心API
- API-producer
- API-consumer
- kafka整体架构
2.1 四个核心API
- Producer API
- 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic
- Consumer API
- 允许一个应用程序订阅一个或多个topic,并且对发布给他们的流式数据进行处理
- Streams API
- 允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。
- Connector API
- 允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表的所有变更内容。
2.2 API-producer
Properties props = new Properties();
props.put("batch.size", 16384);
props.put("lingers.ms", 16384);
props.put("acks", "all");
props.put("retries", 1);
Producer<String, String> producer = new KafkaProducer(props);
ProducerRecord<String, String> record = new ProducerRecord<String, String>("my-topic", "key", "value");
producer.send(record);
producer.close();
Producer会为每个partition维护一个缓冲,用来记录还没有发送的数据,每个缓冲区大小用batch.size指定,默认值为16k。
linger.ms:buffer中的数据在达到batch.size前,需要等待的时间 acks用来配置请求成功的标准
Producer写入流程图
2.3 API-consumer
Kafka Simple Consumer
simple consumer位于kafka.javaapi.consumer包中,不提供负载均衡、容错的特性
每次获取数据都要只要topic/partition/offset/fetchSize
High-level Consumer
该客户端透明地处理kafka broker异常,透明地切换consumer的partition,通过和broker交互来实现consumer group级别的负载均衡。
2.4 kafka整体架构
3 Kafka使用场景
- 消息系统
- 日志聚合
- 流处理
- 事件采集
- 提交日志
3.1 消息系统
kafka更好的替换传统的消息系统,消息系统被用于各种场景(如解耦数据生产者,缓存未处理的消息),与大多数消息系统比较,kafka有更好的吞吐量、内置分区、副本和故障转移等功能,这有利于处理大规模的消息。
根据官方的经验,通常消息传递使用较低的吞吐量,但可能要求较低的端到端延迟,kafka提供强大的持久性来满足这一要求。
在这方面,kafka可以与传统的消息传递系统(ActiveMQ和RabbitMQ)相媲美。
3.2 日志聚合
许多人使用kafka来替代日志聚合解决方案。
日志聚合系统通常从服务器收集物理日志文件,并将其置于一个中心系统(可能是文件服务器或HDFS)进行处理。
kafka从这些日志文件中提取信息,并将其抽象为一个更加清晰的消息流。这样可以实现更低的延迟处理且易于支持多个数据源及分布式数据的消耗。
与Scribe或Flume等以日志为中心的系统相比,kafka具备同样出色的性能、更强的耐用性(因为复制功能)和更低的端到端延迟。
3.3 流处理
从0.10.0.0开始,kafka支持轻量,但功能强大的流处理。
kafka消息处理报包含多个阶段。其中原始输入数据是从kafka主题消费的,然后汇总,丰富,或者以其他的方式处理转化为新主题以供进一步消费或后续处理。
例如,一个推荐新闻文章,文章内容可能从“articles”主题获取;然后进一步处理内容,得到一个处理后的新内容,最后推荐给用户。这种处理是基于单个主题的实时数据流。
除了kafka streams,还有apache storm和apache samza也是不错的流处理框架。
3.4 事件采集
Event sourcing是一种应用程序设计风格,按时间来记录状态的更改。kafka可以存储非常多的日志数据,为基于event sourcing的应用程序提供强有力的支持。
3.5 提交日志
kafka可以从外部为分布式系统提供日志提交功能。日志有助于记录节点和行为间的数据,采用重新同步机制可以从失败节点恢复数据。kafka的日志压缩功能支持这一用法。这一点与Apache BookKeeper项目类似。
参考文章
结语
本人所有博客仅用于学习记录,不做任何商业用途,如涉及侵权,还请联系删除,感谢阅读,欢迎留言,一起进步~