Kafka是一种分布式的,基于发布/订阅的消息系统。主要设计目标如下:

  • 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。

  • 高吞吐量:即使是非常普通的硬件kafka也可以支持每秒数十万的消息。

  • Consumer客户端pull,随机读,利用sendfile系统调用进行zero-copy ,批量拉数据

  • 消费状态保存在客户端

  • 支持Kafka Server间的消息分区,及分布式消费,同时保证每个Partition内的消息顺序传输。

  • 数据迁移、扩容对用户透明

  • 支持Hadoop并行数据加载。

  • 支持online(在线)和offline(离线)的场景。

  • 持久化:通过将数据持久化到硬盘以及replication防止数据丢失。

  • scale out:无需停机即可扩展机器。

  • 定期删除机制,支持设定partitions的segment file保留时间。

项目实例:https://github.com/windwant/kafka-demo

kafka.properties

value.serializer=org.apache.kafka.common.serialization.StringSerializer
key.serializer=org.apache.kafka.common.serialization.StringSerializer
request.required.acks=1
bootstrap.servers=localhost:9092 value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
group.id=test-consumer-group

Producer:

package org.windwant.kafka;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata; import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.ExecutionException; /**
* Producer
*/
public class MyKafkaProducer { private Properties props;
public static void main(String[] args) throws ConfigurationException {
new MyKafkaProducer().start();
} public MyKafkaProducer() throws ConfigurationException {
props = new Properties();
PropertiesConfiguration config = new PropertiesConfiguration("kafka.properties");
config.setReloadingStrategy(new FileChangedReloadingStrategy());
//×Ô¶¯±£´æ
config.setAutoSave(true);
props.put("value.serializer", config.getString("value.serializer"));
props.put("key.serializer", config.getString("key.serializer"));
props.put("request.required.acks", config.getString("request.required.acks"));
props.put("bootstrap.servers", config.getString("bootstrap.servers"));
} public void start(){
try {
Producer<String, String> producer = new KafkaProducer<>(props);
for(int i = 0; i < 100; i++) {
RecordMetadata result = producer.send(new ProducerRecord<>("mykafka",
"kafka key: " + Integer.toString(i),
"kafka value: " + Integer.toString(i))).get();
System.out.println("producer send: " + result);
Thread.sleep(1000);
}
producer.close();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}

Consumer:

package org.windwant.kafka;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer; import java.util.Arrays;
import java.util.Properties; /**
* Consumer.
*/
public class MyKafkaConsumer {
private Properties props;
public static void main(String[] args) throws ConfigurationException {
new MyKafkaConsumer().start();
} public MyKafkaConsumer() throws ConfigurationException {
props = new Properties();
PropertiesConfiguration config = new PropertiesConfiguration("kafka.properties");
config.setReloadingStrategy(new FileChangedReloadingStrategy());
//自动保存
config.setAutoSave(true);
props.put("value.deserializer", config.getString("value.deserializer"));
props.put("key.deserializer", config.getString("key.deserializer"));
props.put("bootstrap.servers", config.getString("bootstrap.servers"));
props.put("group.id", config.getString("group.id"));
} public void start(){
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("mykafka"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records) {
System.out.printf("offset = %d, key = %s, value = %s", record.offset(), record.key(), record.value());
System.out.println();
}
}
}
}

Kafka 分布式的,基于发布/订阅的消息系统的更多相关文章

  1. kafka高吞吐量的分布式发布订阅的消息队列系统

    一:kafka介绍kafka(官网地址:http://kafka.apache.org)是一种高吞吐量的分布式发布订阅的消息队列系统,具有高性能和高吞吐率. 1.1 术语介绍BrokerKafka集群 ...

  2. 分布式事务解决方案(二)消息系统避免分布式事务 & MQ事务消息 & Sagas 事务模型

    参考文档: 如何用消息系统避免分布式事务:http://blog.jobbole.com/89140/ https://www.cnblogs.com/savorboard/p/distributed ...

  3. Publisher/Subscriber(发布/订阅者)消息模式开发流程

    该模式的作用是发布者和订阅者 可以相互发送消息 发布者和订阅者都充当 生产者和消费者 发布者 package publisher.to.subscriber; import java.awt.font ...

  4. node-amqp 使用fanout发布订阅rabbitmq消息

    publisher代码 const amqp = require('amqp'); let option = { host: 'server-ip', port: 5672, login: 'gues ...

  5. 【转载】Apache Kafka:下一代分布式消息系统

    http://www.infoq.com/cn/articles/kafka-analysis-part-1 Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩 ...

  6. 大数据之路【第十篇】:kafka消息系统

    一.简介 1.简介 简 介• Kafka是Linkedin于2010年12月份开源的消息系统• 一种分布式的.基于发布/订阅的消息系统 2.特点 – 消息持久化:通过O(1)的磁盘数据结构提供数据的持 ...

  7. 高吞吐量的分布式发布订阅消息系统Kafka之Producer源码分析

    引言 Kafka是一款很棒的消息系统,今天我们就来深入了解一下它的实现细节,首先关注Producer这一方. 要使用kafka首先要实例化一个KafkaProducer,需要有brokerIP.序列化 ...

  8. 分布式消息系统之Kafka集群部署

    一.kafka简介 kafka是基于发布/订阅模式的一个分布式消息队列系统,用java语言研发,是ASF旗下的一个开源项目:类似的消息队列服务还有rabbitmq.activemq.zeromq:ka ...

  9. 发布订阅 - 基于A2DFramework的事件机制实现

    SUMMARY 能做什么 DEMO 原理图 应用场景 能做什么 A2DFramework的事件机制是基于发布订阅模式改进得来的一套API,中间件部分实现了msmq.redis.Supersocket可 ...

随机推荐

  1. webstorage[html5的本地数据处理]

    1.webStorage是什么? webStorage是html5中用于本地化存储的一种方式,而在之前呢我们是用cookie的存储方式处理; 2.那它们之间的区别是什么? Ⅰ.cookie存在的问题: ...

  2. 实现Android包的批量删除

    由于手机内存有限,有时需要一次删除很多个包,这时就需要一个实现Android包批量删除的应用. 首先是布局文件: <?xml version="1.0" encoding=& ...

  3. JQuery的调用

    在head标签中引用一个JQuery的文件用以制作鼠标点击动画,(JQuery包可从网上下载)   JS包,脚本语言 <script language="javascript" ...

  4. MSSQL N张表关联查询

    declare @newTime varchar(50); declare @lasetTime varchar(50); set @newTime= getdate(); set @lasetTim ...

  5. Gym 100703G---Game of numbers(DP)

    题目链接 http://vjudge.net/contest/132391#problem/G Description standard input/outputStatements — It' s ...

  6. C#中使用System.Web.Mail.MailMessage类无法CC多人的问题

    从.NET 2.0 开始,引入了一个新的类,System.Net.Mail.MailMessage.该类用来取代 .NET 1.1 时代System.Web.Mail.MailMessage类.Sys ...

  7. Verilog学习笔记简单功能实现(七)...............接口设计(并行输入串行输出)

    利用状态机实现比较复杂的接口设计: 这是一个将并行数据转换为串行输出的变换器,利用双向总线输出.这是由EEPROM读写器的缩减得到的,首先对I2C总线特征介绍: I2C总线(inter integra ...

  8. HTTP狀態碼

    1xx消息 这一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束.由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试 ...

  9. 我最常用的几个Xcode快键键

    ⌘(command) ⏎(return) ⌥(option/alt) ⇧(shift) ⌃(control/ctrl) 快速打开文件 ⌘ + ⇧ + O(字母) 快速搜索文本 ⌘ + ⇧ + F 分栏 ...

  10. AES .net 、JS 相互加密解密

    /// <summary> /// AES加密 /// </summary> public class AES { /// <summary> /// 加密 /// ...