天天看点

Kafka(分布式发布订阅消息系统)1.组件2.常用类3.消息交付特点4. partition 的个数考虑5.带弄懂

http://kafka.apache.org/

目前越来越多的开源分布式处理系统如apache storm、spark都支持与kafka集成。

Kafka(分布式发布订阅消息系统)1.组件2.常用类3.消息交付特点4. partition 的个数考虑5.带弄懂

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

此时,消息系统就是一个选择。

broker

['brəʊkə] n.经纪人

kafka集群包含一个或多个服务器,这种服务器被称为broker。

topic

每条发布到kafka集群的消息都有一个类别,这个类别被称为topic。

partition

每个topic包含一个或多个partition。

producer

生产者,负责发布消息到kafka broker。

consumer

消费者,从kafka broker读取消息的客户端。

consumer group

每个consumer属于一个特定的consumer group。

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中的信息。

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生产者发送消息。

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会发生变化。

a) 如果consumer比partition多,是浪费,因为kafka的设计是在一个partition上是不允许并发的,所以consumer数不要大于partition数。

b) 如果consumer比partition少,一个consumer会对应于多个partitions,这里主要合理分配consumer数和partition数,否则会导致partition里面的数据被取的不均匀。

a)server怎么标识不同的consumer?是zk自己分配编号,还是consumer构造函数的参数指定?

b) 何为一个consumer?进程还是线程还是别的什么?

c)consumer所在机器性能低,个数与partition个数一致还是消费不充分怎么办?