kafka "HelloWorld"实践
前面我们分别介绍了kafka的相关基本原理,kafka的集群服务器搭建以及kafka相关的配置,本文综合前面的理论知识,运用kafka Java API实现一个简单的客户端Demo。
开发环境
- 操作系统:MacOS 10.12.3
- 开发平台:Eclipse Neon.2 Release (4.6.2)
- JDK: java version 1.8.0_121
- zookeeper: zookeeper-3.4.9
- kafka: kafka-2.10-0.10.2.0
项目的建立与实现
首先为大家展示一下项目最终的结构图,如下:
下面开始建立项目:
- 首先建立一个基本的Maven Java Project 项目框架,项目名称为 kafkaDemo,建立项目流程参考:maven 基本框架搭建;
- 然后修改pom.xml文件内容,为项目引入kafka 客户端jar包:
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.10.2.0</version>
</dependency>
添加完成后保存pom.xml,然后maven update project。当update完成后,maven依赖包里的jar包应该如上图所示。
下面分别添加producer和consumer客户端代码。
在src/main/java目录下新建package,命名为 com.unionpay.producer。由于kafka producer端有同步发送和异步发送之分,本项目将两个示例都进行展示,首先编写同步发送ProducerSync代码。
ProducerSync.java:
package com.unionpay.producer; import java.util.Properties; import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord; public class ProducerSync { private static final String TOPIC = "my-replicated-topic";
public static void main(String[] args) {
// TODO Auto-generated method stub Properties properties = new Properties();
//客户端用于建立与kafka集群连接的host:port组,如果有多个broker,则用“,”隔开
// "host1:port1,host2:port2,host3,post3"
properties.put("bootstrap.servers", "127.0.0.1:9092"); // producer在向servers发送信息后,是否需要serveres向客户端(producer)反馈接受消息状态用此参数配置
// acks=0:表示producer不需要等待集群服务器发送的确认消息;acks=1:表示producer需要等到topic对应的leader发送的消息确认;
// acks=all:表示producer需要等到leader以及所有followers的消息确认,这是最安全的消息保障机制
properties.put("acks", "all");
properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
properties.put("buffer.memory", "33554432"); Producer<String,String> producer = new KafkaProducer<String,String>(properties); for(int i=0;i<100;i++){ String message = "Sync : this is the " + i + "th message for test!";
ProducerRecord<String, String> producerRecord = new ProducerRecord<String, String>(TOPIC, message);
producer.send(producerRecord); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} producer.close(); } }
然后编写异步ProducerAsync代码。
ProducerAsync.java:
package com.unionpay.producer; import java.util.Properties; import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord; public class ProducerAsync { private static final String TOPIC = "my-replicated-topic";
public static void main(String[] args) {
// TODO Auto-generated method stub Properties props = new Properties();
props.put("bootstrap.servers", "127.0.0.1:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("producer.type", "async");
props.put("batch.size", "16384"); Producer<String,String> producer = new KafkaProducer<String,String>(props); for(int i=0;i<100;i++){ String message = "Async : this is the " + i + "th message for test!"; ProducerRecord producerRecord = new ProducerRecord(TOPIC, message);
producer.send(producerRecord); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} producer.close();
}
}
从两个代码文件比对来看,异步中多了一句配置语句props.put("producer.type", "async");
然后编写consumer端代码
GroupConsumer.java:
package com.unionpay.consumer; import java.util.Arrays;
import java.util.Properties; import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer; public class GroupConsumer { private static final String BROKER = "127.0.0.1:9092";
private static final String TOPIC = "my-replicated-topic"; public static void main(String[] args) {
// TODO Auto-generated method stub Properties props = new Properties();
props.put("bootstrap.servers",BROKER);
// 用来唯一标识consumer进程所在组的字符串,如果设置同样的group id,表示这些processes都是属于同一个consumer group
props.put("group.id", "group1");
// 如果为真,consumer所fetch的消息的offset将会自动的同步到zookeeper。这项提交的offset将在进程挂掉时,由新的consumer使用
props.put("enable.auto.commit", "true");
// consumer向zookeeper提交offset的频率
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "30000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props); // 订阅topic,可以为多个用,隔开Arrays.asList("topic1","topic2");
consumer.subscribe(Arrays.asList(TOPIC)); while(true){
ConsumerRecords<String,String> consumerRecords = consumer.poll(100); for(ConsumerRecord<String,String> consumerRecord : consumerRecords){
System.out.println(consumerRecord.value());
}
}
}
}
到目前为止,我们的项目建立完成啦,下面启动zookeeper集群服务器,启动kafka集群服务器:
//启动zookeeper集群服务器
cd ~/DevelopEnvironment/zookeeper-3.4.9-kafka/bin
./zkServer.sh start //启动kafka集群服务器
cd ~/DevelopEnvironment/kafka_2.10-0.10.2.0/bin
./kafka-server-start.sh ../config/server.properties
./kafka-server-start.sh ../config/server-1.properties
./kafka-server-start.sh ../config/server-2.properties
当zookeeper集群服务器和kafka集群服务器启动成功后,然后分别运行GroupConsumer.java和ProducerAsync.java,客户端获取如下信息:
然后运行ProducerSync.java,客户端获取如下信息:
到此,游戏结束,我们的kafka API 使用demo介绍到此结束。
kafka "HelloWorld"实践的更多相关文章
- 【译】Kafka最佳实践 / Kafka Best Practices
本文来自于DataWorks Summit/Hadoop Summit上的<Apache Kafka最佳实践>分享,里面给出了很多关于Kafka的使用心得,非常值得一看,今推荐给大家. 硬 ...
- Kafka应用实践与生态集成
1.前言 Apache Kafka发展至今,已经是一个很成熟的消息队列组件了,也是大数据生态圈中不可或缺的一员.Apache Kafka社区非常的活跃,通过社区成员不断的贡献代码和迭代项目,使得Apa ...
- Spark Streaming与kafka整合实践之WordCount
本次实践使用kafka console作为消息的生产者,Spark Streaming作为消息的消费者,具体实践代码如下 首先启动kafka server .\bin\windows\kafka-se ...
- Kafka项目实践
用户日志上报实时统计之编码实践 1.概述 本课程的视频教程地址:<Kafka实战项目之编码实践> 该课程我以用户实时上报日志案例为基础,带着大家去完成各个KPI的编码工作,实现生产模块. ...
- Kafka最佳实践
一.硬件考量 1.1.内存 不建议为kafka分配超过5g的heap,因为会消耗28-30g的文件系统缓存,而是考虑为kafka的读写预留充足的buffer.Buffer大小的快速计算方法是平均磁盘写 ...
- window下Kafka最佳实践
Kafka的介绍和入门请看这里kafka入门:简介.使用场景.设计原理.主要配置及集群搭建(转) 当前文章从实践的角度为大家规避window下使用的坑. 1.要求: java 6+ 2.下载kafka ...
- HP下kafka的实践
kafka 简介 Kafka 是一种高吞吐量的分布式发布订阅消息系统 kafka角色必知 producer:生产者. consumer:消费者. topic: 消息以topic为类别记录,Kafka将 ...
- Kafka~HelloWorld得来不易
今天连搭了zookeeper和kafka的环境,并部署成功,但在.net驱动的操作下,没有消费成功,原因何在? 防火墙 zookeeper没运行? kafka没有公开IP? 第一感觉也就是这向个原因了 ...
- StatefulSet在ZooKeeper和Kafka的实践
K8s的版本是1.7.6 采用nfs的nas存储模式 NFS的问题 建立zk集群的时候总是发现myid绑定一个id,先describe pod确认每个绑定不同的pvc,然后就确认是pv创建的问题,pv ...
随机推荐
- CSS之千变万化的Div
厂址:http://www.cnblogs.com/yunfeifei/p/4671930.html 一.div和css3在一起 .box1 { width: 100px; height: 100px ...
- unity, SkinnedMeshRenderer.bones[i]不能直接赋值
SkinnedMeshRenderer.bones[i]=xxx,这样写不报错,但也不起作用. 正确的方法是: List<Transform> boneList=new List<T ...
- 常用maven 仓库地址
maven下载jar的时候会去寻国外的地址,因此造成了下载jar很缓慢,影响开发效率,于是就出现maven镜像地址,可以使我们开发人员迅速下载相关的jar. 在maven的config的setting ...
- ECN
ECN是工程变更管理,主要用来管理BOM的生效日期,及记录BOM的更改内容:在SAP系统中,需先创建ECN更改号码,凭ECN号码去更改管理BOM
- Spring学习10-SpringMVC原理及核心组件1
一.SpringMVC原理 请求到来时,第一个接受这个请求的前端控制器叫DispatcherServlet(这个需要在web.xml中配置), 后端控制器叫Controller.负责处理请求U ...
- 使用filter解决request.getParameter的中文乱码问题
注意:一般一个站点的所有页面的编码,包括数据库编码都要保持一致,下面默认的编码都是UTF-8 ----------------------------------例1:直接提交到jsp页面------ ...
- CGPathCreateMutable
ios 图形与动画学习笔记 构造路径(CGPathCreateMutable) 一系列点放在一起,构成了一个形状.一系列的形状放在一起,构成了一个路径. /* 路径属于我们正在绘制他们的上下文.路 ...
- Tomcat7调试运行环境搭建与源代码分析入门
1. 需要准备好下面这些工具 JDK 1.6+ Maven 2或3 TortoiseSVN 1.7+ (从1.7开始”.svn”目录集中放在一处了,不再每个目录下都放一份) Eclipse 3.5+ ...
- 常用cmd
net use 查询相应的共享文件 control userpasswords2--修改计算机的网络凭证 删除计算机记录的网络共享凭证 重启网络
- APP纯黑盒测试—某些可以试试的操作
一.多次快速点击一处功能入口: 该测试方法可以在某些应用中打开俩次目标界面,举一些具体一点的例子: 1.比如现在很多APP需要登陆,如果打开了俩次登录页面,就容易造成登录成功后应用跳转界面又是登录界面 ...