二、kafka
1、开发流程
produce
Properties props = new Properties();
// 此处配置的是kafka的端口
props.put("metadata.broker.list", broker_list);
// 配置value的序列化类
props.put("serializer.class", serializer);
// 配置key的序列化类
props.put("key.serializer.class", key);
props.put("request.required.acks", acks);
producer = new Producer<String, String>(new ProducerConfig(props));
KeyedMessage<String, String> keyedMessage = new KeyedMessage<String, String>(topic, key, data);
producer.send(keyedMessage);
consumer
Properties props = new Properties();
//zookeeper 配置
props.put("zookeeper.connect", connect);
//group 代表一个消费组
props.put("group.id", group_id);
//zk连接超时
props.put("zookeeper.session.timeout.ms", session_timeout);
props.put("zookeeper.sync.time.ms", sync);
props.put("auto.commit.interval.ms", interval);
props.put("auto.offset.reset", offset_reset);
//序列化类
props.put("serializer.class", serializer);
ConsumerConfig config = new ConsumerConfig(props);
consumer = kafka.consumer.Consumer.createJavaConsumerConnector(config);
Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
topicCountMap.put(topic, new Integer(1));
StringDecoder keyDecoder = new StringDecoder(new VerifiableProperties());
StringDecoder valueDecoder = new StringDecoder(new VerifiableProperties());
Map<String, List<KafkaStream<String, String>>> consumerMap = consumer.createMessageStreams(topicCountMap,keyDecoder,valueDecoder);
KafkaStream<String, String> stream = consumerMap.get(topic).get(0);
2、高吞吐量原理: 数据磁盘持久化:消息不在内存中cache,直接写入到磁盘,充分利用磁盘的顺序读写性能。
支持数据批量发送和拉取。
支持数据压缩。
Topic划分为多个partition,提高并行处理能力。
因为每条消息都被append到该Partition中,属于顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证
offet由Consumer控制,所以Kafka broker是无状态的,它不需要标记哪些消息被哪些消费过,也不需要通过broker去保证同一个Consumer Group只有一个Consumer能消费某一条消息,因此也就不需要锁机制,这也为Kafka的高吞吐率提供了有力保障
3、特新
Kafka集群会保留所有的消息,无论其被消费与否。当然,因为磁盘限制,不可能永久保留所有数据(实际上也没必要),因此Kafka提供两种策略删除旧数据。
一是基于时间,二是基于Partition文件大小。例如可以通过配置$KAFKA_HOME/config/server.properties
log.segment.bytes
消息被路由到哪个partition上,有producer客户端决定.比如可以采用"random""key-hash""轮询"等
在JMS实现中,Topic模型基于push方式,即broker将消息推送给consumer端.不过在kafka中,采用了pull方式,即consumer在和broker建立连接之后,主动去pull(或者说fetch)消息;
这中模式有些优点,首先consumer端可以根据自己的消费能力适时的去fetch消息并处理,且可以控制消息消费的进度(offset);
4.HA机制
Kafka分配Replica的算法如下:
将所有Broker(假设共n个Broker)和待分配的Partition排序
将第i个Partition分配到第(i mod n)个Broker上
将第i个Partition的第j个Replica分配到第((i + j) mode n)个Broker上