Apache kafka
一、基本概念
官网将kafka定义为一个分布式流媒体平台,它主要用于处理活跃的流式数据。并且出列它的三大功能:
1、它可以让你发布和订阅记录流。在这方面,它类似于消息队列或企业消息传递系统。
2、它允许您以容错方式存储记录流。
3、它可以让您在发生记录时处理记录流。
换句话说,它是一个高吞吐量的分布式发布订阅消息系统,它具有以下特点:
1、高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒
2、可扩展性:kafka集群支持热扩展
3、持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
4、容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
5、高并发:支持数千个客户端同时读写
二、kafka的使用场景
1、日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
2、消息系统:解耦和生产者和消费者、缓存消息等。
3、用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。4、运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
5、流式处理:比如spark streaming和storm
三、整体架构
Kafka的整体架构非常简单,是显式分布式架构,producer、broker(kafka)和consumer都可以有多个。Producer,consumer实现Kafka注册的接口,数据从producer发送到broker,broker承担一个中间缓存和分发的作用。broker分发注册到系统中的consumer。broker的作用类似于缓存,即活跃的数据和离线处理系统之间的缓存。客户端和服务器端的通信,是基于简单,高性能,且与编程语言无关的TCP协议。几个基本概念:
1、Topic:特指Kafka处理的消息源(feeds of messages)的不同分类。
2、Partition:Topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。
3、Message:消息,是通信的基本单位,每个producer可以向一个topic(主题)发布一些消息。
4、Producers:消息和数据生产者,向Kafka的一个topic发布消息的过程叫做producers。
5、Consumers:消息和数据消费者,订阅topics并处理其发布的消息的过程叫做consumers。
6、Broker:将已发布的消息保存在一组服务器中,它们被称为代理(Broker)或Kafka集群,Kafka集群中的一台或多台服务器统称为broker。
四、工作流程
对于每个topic,kafka集群维护了分区的日志文件(分区1、分区2、分区3),每个分区()是顺序的、不可改变的、一直不停地往后面追加的消息队列,称之为提交日志(commit log),每个在其中的消息都有一个称之为offset的序列号,来唯一的标识在分区里的每条消息,Producers向topics发送数据,每个producer负责选择将消息发送给topic的哪个partition
消息系统通常有两个模型:排队模式和广播模式,排队模式是许多消费者同时去服务器争夺数据,但是一条数据只分发给一个消费者,广播模式是消息广播给所有消费者,每个消费者都可以拿到消息。
生产者示例代码:
producer = new Producer(…);
message = new Message(“test message str”.getBytes());
set = new MessageSet(message);
producer.send(“topic1”, set);
消费者示例代码:
streams[] = Consumer.createMessageStreams(“topic1”, 1)
for (message : streams[0]) {
bytes = message.payload();
// do something with the bytes
}
五、与其他消息服务比较
1、kafka能实现批量发送消息,可以设置单位时间能批量处理发往同一分区的消息,而ActiveMQ和RabbitMQ暂时没有简单的办法来批量发送消息
2、Kafka性能比其他消息服务更好,它拥有高效的存储格式,从代理传输到消费者的字节更少;ActiveMQ和RabbitMQ两个容器中的代理必须维护每个消息的传输状态
3、RabbitMQ遵循AMQP,RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding组成了消息的路由键;客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据)。rabbitMQ以broker为中心;有消息的确认机制。
4、kafka遵从一般的MQ结构,producer,broker,consumer,以consumer为中心,消息的消费信息保存的客户端consumer上,consumer根据消费的点,从broker上批量pull数据;无消息确认机制。
5、RabbitMq比kafka成熟,支持AMQP事务处理,在可靠性上,RabbitMq超过kafka,
Kafka设计的初衷就是处理日志的,不支持AMQP事务处理,可以看做是一个日志系统,针对性很强,所以它并没有具备一个成熟MQ应该具备的特性;Kafka的性能(吞吐量、tps)比RabbitMq要强,如果用来做大数据量的快速处理是比RabbitMq有优势的。有大量的事件要分区、按顺序处理适合用kafka,较少的事件并且是系统消息投递可靠的、不关心顺序适合选用RabbitMQ