目录:

kafka启动脚本以及关闭脚本

1. 同一个生产者同一个Topic,两个相同的消费者相同的Group

2. 同一个生产者同一个Topic,两个消费者不同Group

3. 两个生产者同一个Topic,生产不同的消息,一个消费者

运行的前提是有kafka,并启动kafka,这里我写了个kafka启动脚本:

#!/bin/sh
#创建启动脚本
#启动zookeeper
/user/kafka_2.-2.0./bin/zookeeper-server-start.sh /user/kafka_2.-2.0./config/zookeeper.properties &
sleep #等3秒后执行 #启动kafka
/user/kafka_2.-2.0./bin/kafka-server-start.sh /user/kafka_2.-2.0./config/server.properties &

kafka关闭脚本:

#!/bin/sh
#创建关闭脚本
#关闭kafka
/user/kafka_2.-2.0./bin/kafka-server-stop.sh /user/kafka_2.-2.0./config/server.properties &
sleep #等3秒后执行 #关闭zookeeper
/user/kafka_2.-2.0./bin/zookeeper-server-stop.sh /user/kafka_2.-2.0./config/zookeeper.properties &

1. 同一个生产者同一个Topic,两个相同的消费者相同的Group

新建一个生产者TestKafkaProducer,需要引入kafka的lib中的jar包,主要包括两个类,如下所示:

kafka生产者:

package com.zc.kafka.producer.main;

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; /**
* Kafka生产者
* 先启动生产者,发送消息到broker,这里简单发送了10条从0-9的消息,再启动消费者,控制台输出如下:
*/
public class SimpleKafkaProducer { private static long i = ; public void send(String str) {
// TODO Auto-generated method stub Properties props = new Properties(); //broker地址
props.put("bootstrap.servers", "localhost:9092"); //请求时候需要验证
props.put("acks", "all"); //请求失败时候需要重试
props.put("retries", ); //内存缓存区大小
props.put("buffer.memory", ); //指定消息key序列化方式
props.put("key.serializer",
"org.apache.kafka.common.serialization.StringSerializer"); //指定消息本身的序列化方式
props.put("value.serializer",
"org.apache.kafka.common.serialization.StringSerializer"); Producer<String, String> producer = new KafkaProducer<>(props); //for (int i = 0; i < 10; i++) { //i < 10
// 生产一条消息的时间有点长
//producer.send(new ProducerRecord<>("test", Integer.toString(i), Integer.toString(i)));
//System.out.println(i);
//}
// 这里的“test“是topic
producer.send(new ProducerRecord<>("test", String.valueOf(i), str));
i++;
System.out.println("Message sent successfully");
producer.close();
} }

生产数据:

package com.zc.kafka.producer.test;

import com.zc.kafka.producer.main.SimpleKafkaProducer;

public class TestSimpleKafkaProducer {

    public static void main(String[] args) {
// TODO Auto-generated method stub
long i=;
SimpleKafkaProducer skp = new SimpleKafkaProducer();
while(true) {
skp.send("Hello: "+ String.valueOf(i));
i++;
try {
Thread.sleep(); //ms
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }

新建两个消费者,引入kafka中lib中的jar包,分别是TestKafkaConsumer和TestKafkaConsumer2,他们有一个相同的类,如下所示:

消息消费者:

package com.zc.kafka.consumer.main;

import java.util.Collections;
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; /**
* kafka消费者
*/
public class SimpleKafkaConsumer { @SuppressWarnings({ "deprecation", "resource" })
public static void main(String[] args) {
// TODO Auto-generated method stub
Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092");
//每个消费者分配独立的组号,这里的“test”是group
props.put("group.id", "test"); //如果value合法,则自动提交偏移量
props.put("enable.auto.commit", "true"); //设置多久一次更新被消费消息的偏移量
props.put("auto.commit.interval.ms", "1000"); //设置会话响应的时间,超过这个时间kafka可以选择放弃消费或者消费下一条消息
props.put("session.timeout.ms", "30000"); //
//props.put("auto.offset.reset", "earliest"); 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<>(props); consumer.subscribe(Collections.singletonList("test")); //核心函数1:订阅topic System.out.println("Subscribed to topic " + "test");
//int i = 0; while (true) {
//System.out.println(i++);
//核心函数2:long poll,一次拉取回来多个消息
/* 读取数据,读取超时时间为100ms */
ConsumerRecords<String, String> records = consumer.poll(100);
//System.out.println(records.count());
for (ConsumerRecord<String, String> record : records)
// print the offset,key and value for the consumer records.
System.out.printf("offset = %d, key = %s, value = %s\n",
record.offset(), record.key(), record.value());
}
} }

启动生产者,并启动两个消费者。(我的生产者和两个消费者都在同一主机上)

结果是:

第一个启动的消费者消费消息,第二个消费者没有消费消息;我关闭掉第一个消费者,第二个消费者就会消费消息; (因为Group相同)

同时只会有一个消费者在消费消息,并且消费消息没有重叠。

消费者1:

Subscribed to topic test
offset = 4451, key = 25, value = Hello: 25
offset = 4452, key = 26, value = Hello: 26
offset = 4453, key = 27, value = Hello: 27
offset = 4454, key = 28, value = Hello: 28
offset = 4455, key = 29, value = Hello: 29
offset = 4456, key = 30, value = Hello: 30
offset = 4457, key = 31, value = Hello: 31
offset = 4458, key = 32, value = Hello: 32

消费者2:

Subscribed to topic test
offset = 4459, key = 33, value = Hello: 33
offset = 4460, key = 34, value = Hello: 34
offset = 4461, key = 35, value = Hello: 35
offset = 4462, key = 36, value = Hello: 36

2. 同一个生产者同一个Topic,两个消费者不同Group

这里只是修改了TestKafkaConsumer2的源码,修改了组,具体如下所示:

package com.zc.kafka.consumer.main;

import java.util.Collections;
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; /**
* kafka消费者
*/
public class SimpleKafkaConsumer { @SuppressWarnings({ "deprecation", "resource" })
public static void main(String[] args) {
// TODO Auto-generated method stub
Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092");
//每个消费者分配独立的组号
props.put("group.id", "Consumer2"); //修改了组 //如果value合法,则自动提交偏移量
props.put("enable.auto.commit", "true"); //设置多久一次更新被消费消息的偏移量
props.put("auto.commit.interval.ms", "1000"); //设置会话响应的时间,超过这个时间kafka可以选择放弃消费或者消费下一条消息
props.put("session.timeout.ms", "30000"); //
//props.put("auto.offset.reset", "earliest"); 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<>(props); consumer.subscribe(Collections.singletonList("test")); //核心函数1:订阅topic System.out.println("Subscribed to topic " + "test");
//int i = 0; while (true) {
//System.out.println(i++);
//核心函数2:long poll,一次拉取回来多个消息
/* 读取数据,读取超时时间为100ms */
ConsumerRecords<String, String> records = consumer.poll(100);
//System.out.println(records.count());
for (ConsumerRecord<String, String> record : records)
// print the offset,key and value for the consumer records.
System.out.printf("offset = %d, key = %s, value = %s\n",
record.offset(), record.key(), record.value());
}
} }

启动生产者,并启动两个消费者。(我的生产者和两个消费者都在同一主机上)

结果是:

第一个启动的消费者消费消息,第二个消费者也再消费消息;(因为Group不相同)

同时两个消费者都在消费消息,并且消费消息重叠。

消费者1:

Subscribed to topic test
offset = 4463, key = 0, value = Hello: 0
offset = 4464, key = 1, value = Hello: 1
offset = 4465, key = 2, value = Hello: 2
offset = 4466, key = 3, value = Hello: 3
offset = 4467, key = 4, value = Hello: 4
offset = 4468, key = 5, value = Hello: 5
offset = 4469, key = 6, value = Hello: 6
offset = 4470, key = 7, value = Hello: 7
offset = 4471, key = 8, value = Hello: 8
offset = 4472, key = 9, value = Hello: 9

消费者2:

Subscribed to topic test
offset = 4466, key = 3, value = Hello: 3
offset = 4467, key = 4, value = Hello: 4
offset = 4468, key = 5, value = Hello: 5
offset = 4469, key = 6, value = Hello: 6
offset = 4470, key = 7, value = Hello: 7
offset = 4471, key = 8, value = Hello: 8
offset = 4472, key = 9, value = Hello: 9

3. 两个生产者同一个Topic,生产不同的消息,一个消费者

生产的数据和第一个生产者不同:

package com.zc.kafka.producer.test;

import com.zc.kafka.producer.main.SimpleKafkaProducer;

public class TestSimpleKafkaProducer2 {

    public static void main(String[] args) {
// TODO Auto-generated method stub
long i=0;
SimpleKafkaProducer skp = new SimpleKafkaProducer();
while(true) {
skp.send("Kafka: "+ String.valueOf(i)); //生产的数据不同
i++;
try {
Thread.sleep(10000); //ms
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }

启动两个生产者,并启动消费者。(我的生产者和消费者都在同一主机上)

结果是:

消费者同时收到了两个生产者的消息; (因为Topic相同)

消费者:

Subscribed to topic test
offset = 4473, key = 0, value = Hello: 0
offset = 4474, key = 0, value = Kafka: 0
offset = 4475, key = 1, value = Hello: 1
offset = 4476, key = 1, value = Kafka: 1
offset = 4477, key = 2, value = Hello: 2
offset = 4478, key = 2, value = Kafka: 2
offset = 4479, key = 3, value = Hello: 3
offset = 4480, key = 3, value = Kafka: 3
offset = 4481, key = 4, value = Hello: 4
offset = 4482, key = 4, value = Kafka: 4

Kafka入门之生产者消费者测试的更多相关文章

  1. Kafka入门之生产者消费者

    一.Kafka安装与使用 ( kafka介绍     ) 1. 下载Kafka 官网 http://kafka.apache.org/    以及各个版本的下载地址 http://archive.ap ...

  2. centos7单机安装kafka,进行生产者消费者测试

    [转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11364852.html   作者:jstarseven    码字挺辛苦的.....  一.k ...

  3. kafka配置监控和消费者测试

    概念 运维 配置 监控 生产者与消费者 流处理 分区partition 一定条件下,分区数越多,吞吐量越高.分区也是保证消息被顺序消费的基础,kafka只能保证一个分区内消息的有序性 副本 每个分区有 ...

  4. 生产者消费者代码学习,Producer_Consuner

    使用BlockingQuery实现生产者者消费者:考虑并发,解耦. 生产者消费者模式是面向过程的设计模式. 生产者制造数据   ------> 生产者把数据放入缓冲区  -------> ...

  5. Python 使用python-kafka类库开发kafka生产者&消费者&客户端

    使用python-kafka类库开发kafka生产者&消费者&客户端   By: 授客 QQ:1033553122       1.测试环境 python 3.4 zookeeper- ...

  6. kafka集群搭建和使用Java写kafka生产者消费者

    1 kafka集群搭建 1.zookeeper集群  搭建在110, 111,112 2.kafka使用3个节点110, 111,112 修改配置文件config/server.properties ...

  7. Hadoop生态圈-Kafka的新API实现生产者-消费者

         Hadoop生态圈-Kafka的新API实现生产者-消费者 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  8. Hadoop生态圈-Kafka的旧API实现生产者-消费者

    Hadoop生态圈-Kafka的旧API实现生产者-消费者 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.旧API实现生产者-消费者 1>.开启kafka集群 [yinz ...

  9. Kafka入门(4):深入消费者

    摘要 在这一篇文章中,我将向你介绍消费者的一些参数. 这些参数影响了每次poll()请求的数据量,以及等待时间. 在这之后,我将向你介绍Kafka用来保证消费者扩展性以及可用性的设计--消费者组. 在 ...

随机推荐

  1. HTML5、CSS3等新特性:

    HTML5:1/绘画 canvas 元素;2/用于媒介回放的 video 和 audio 元素;3/本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;4/sessionSt ...

  2. ffmpeg api升级到3.3 api变化

     void av_free_packet(AVPacket * pkt) Use void av_packet_unref(AVPacket * pkt) Wipe the packet. Unref ...

  3. 02 http协议之方法与状态码

    一:HTTP请求信息和响应信息的格式 请求: ()请求行 ()请求头信息 ()请求主体信息(可以没有) () 头信息结束后和主体信息之间要空一行 请求行又分3部分 请求方法 请求路径 所用的协议 请求 ...

  4. 转_【大话IT】你离大数据架构师有多远?

    话题背景: 首先,先科普下“数据架构师”的相关职责:数据架构师要负责建立和维持公司数据储存的技术基准,策划硬体和软体的结构,确保数据储存系统可以支持未来的数据量和分析需求. 据了解,美国地区数据架构师 ...

  5. git和github菜鸟使用步骤

    刚刚在windows7下安装完git.奉上安装步骤. git安装 安装git程序.运行以下操作: 1. $ cd ~/.ssh    //检查计算机ssh密钥 2.假设没有提示:No such fil ...

  6. SDWebImage学习

    SDWebImage学习 SDWebImage版本是:'4.2.2' SDWebImage是iOS开发中常用的图片加载的库,能下载并缓存图片.这次就着重介绍SDWebImage的特色功能:下载与缓存. ...

  7. AAC包增加ADTS头Without MediaCodec

    AAC原始码流无法直接播放,一般需要封装为ADTS格式才能再次使用,本博主在android中用MediaCodec编码得到的AAC就是raw格式,为了保存为.aac格式,需要增加adts头,这样就可以 ...

  8. 九度OJ 1118:数制转换 (进制转换)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3873 解决:1494 题目描述: 求任意两个不同进制非负整数的转换(2进制-16进制),所给整数在long所能表达的范围之内.     不 ...

  9. a REST API

    https://spring.io/guides/tutorials/bookmarks/ http://roy.gbiv.com/untangled/2008/rest-apis-must-be-h ...

  10. 可以执行全文搜索的原因 Elasticsearch full-text search Kibana RESTful API with JSON over HTTP elasticsearch_action es 模糊查询

    https://www.elastic.co/guide/en/elasticsearch/guide/current/getting-started.html Elasticsearch is a ...