Kafka(分布式发布订阅消息系统)-阿里云开发者社区

开发者社区> 大数据> 正文

Kafka(分布式发布订阅消息系统)

简介: http://kafka.apache.org/目前越来越多的开源分布式处理系统如Apache Storm、Spark都支持与Kafka集成。 使用场景:设想这样一个情景:想分析用户在网站上的的浏览行为。这些浏览日志,存数据库浪费,直接存硬盘又怕到时候操作效率低。 此时,消息系统就是一个选择。 1.组件 Broker ['brəʊkə] n.经纪人 Kafka集群包含一个或多个
http://kafka.apache.org/

目前越来越多的开源分布式处理系统如Apache Storm、Spark都支持与Kafka集成。

微笑使用场景:设想这样一个情景:想分析用户在网站上的的浏览行为。这些浏览日志,存数据库浪费,直接存硬盘又怕到时候操作效率低。
此时,消息系统就是一个选择。


1.组件

Broker
['brəʊkə] n.经纪人
Kafka集群包含一个或多个服务器,这种服务器被称为broker。
Topic
每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。
Partition
每个Topic包含一个或多个Partition。
Producer
生产者,负责发布消息到Kafka broker。
Consumer
消费者,从Kafka broker读取消息的客户端。
Consumer Group

每个Consumer属于一个特定的Consumer Group。


2.常用类

2.1消费者

kafka.javaapi.consumer.ConsumerConnector
kafka消费者的连接信息。
ConsumerConnector kafka.consumer.Consumer.createJavaConsumerConnector(ConsumerConfig arg0)
创建ConsumerConnector。
Map<String, List<KafkaStream<byte[], byte[]>>> kafka.javaapi.consumer.ConsumerConnector.createMessageStreams(Map<String, Integer> topicCountMap)
根据制定的map创建
kafka.consumer.KafkaStream<byte[], byte[]>
Kafka消息流。
kafka.consumer.ConsumerIterator<byte[], byte[]>
kafka消费者的迭代器。
MessageAndMetadata<byte[], byte[]>
Kafka消息。
byte[] kafka.message.MessageAndMetadata.message()
得到MessageAndMetadata中的信息。

2.2生产者

kafka.javaapi.producer.Producer<Integer, String>
kafka生产者。
kafka.javaapi.producer.Producer.Producer<Integer, String>(ProducerConfig arg0)
Producer的构造函数。
kafka.producer.ProducerConfig
Producer配置。
kafka.producer.ProducerConfig.ProducerConfig(Properties arg0)
ProducerConfig的构造函数。
void kafka.javaapi.producer.Producer.send(KeyedMessage<Integer, String> arg0)
kafka生产者发送消息。

3.消息交付特点

1. kafka对消息的重复、丢失、错误以及顺序没有严格的要求。
2. kafka提供at-least-once delivery,即当consumer宕机后,有些消息可能会被重复delivery。
3. 因每个partition只会被同一consumer group内的一个consumer消费,故kafka保证每个partition内的消息会被顺序的订阅。

4. Kafka为每条消息为每条消息计算CRC校验,用于错误检测,crc校验不通过的消息会直接被丢弃掉。

5.增减consumer,broker,partition会导致rebalance,所以rebalance后consumer对应的partition会发生变化。

4. partition 的个数考虑

a) 如果consumer比partition多,是浪费,因为kafka的设计是在一个partition上是不允许并发的,所以consumer数不要大于partition数。
b) 如果consumer比partition少,一个consumer会对应于多个partitions,这里主要合理分配consumer数和partition数,否则会导致partition里面的数据被取的不均匀。

5.带弄懂

a)server怎么标识不同的consumer?是zk自己分配编号,还是consumer构造函数的参数指定?
b) 何为一个consumer?进程还是线程还是别的什么?
c)consumer所在机器性能低,个数与partition个数一致还是消费不充分怎么办?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
大数据
使用钉钉扫一扫加入圈子
+ 订阅

大数据计算实践乐园,近距离学习前沿技术

其他文章