Java技术栈 —— Kafka入门(二)

  • 一、如何在Java项目中使用Kafka?
  • 1.1 导入依赖
  • 1.2 执行Java代码
  • 1.3 在Kafka中查看数据
  • 二、Kafka辨析
  • 2.1 术语
  • 2.2 Kafka与数据库的区别?
  • 三、业务提炼与总结


一、如何在Java项目中使用Kafka?

让我们先从简单的往topic存message与取message开始[1],也就是先实现文章[1]的那种效果,文章[1]的代码没有完整告诉我们他是怎么做到这一切的。

一、参考文章或视频链接

[1] kafka的topic分区后partion中的数据是一致的么?

1.1 导入依赖

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>1.0.2</version>
</dependency>

1.2 执行Java代码

执行文章[1]里的代码,这里我对代码稍作改动。

import java.util.Properties;
import java.util.Random;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;

public class Producer {
    public static String topic = "kafka_test";//定义主题
    public static void main(String[] args) throws InterruptedException {
        Properties p = new Properties();
        p.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");//kafka地址,多个地址用逗号分割
        p.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        p.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(p);
        try {
            while (true) {
                String msg = "Hello," + new Random().nextInt(100);
                ProducerRecord<String, String> record = new ProducerRecord<String, String>(topic, msg);
                kafkaProducer.send(record);
                System.out.println("消息发送成功:" + msg);
                Thread.sleep(500);
            }
        } finally {
            kafkaProducer.close();
        }

    }
}

1.3 在Kafka中查看数据

为方便使用,我们将Kafka的安装路径添加到系统路径PATH中去。

# 或者vim /etc/profile
$ vim ~/.bashrc
export KAFKA_HOME=/home/programmer/DevelopEnvironment/kafka_2.13-3.6.1
export PATH=$KAFKA_HOME/bin:$PATH
$ source ~/.bashrc
# (1)实时查看对应topic的历史数据
# kafka-console-consumer.sh --bootstrap-server <broker地址> --topic <主题名称> [--from-beginning]
$ kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic "kafka_test" --from-beginning

# (2)kafka-topics.sh可以查看以前发送给topic的数据
# 查看所有topic
$ kafka-topics.sh --bootstrap-server 127.0.0.1:9092  --list 
# 查看指定topic
$ kafka-topics.sh --bootstrap-server 127.0.0.1:9092 -describe -topic "kafka_test"

# (3)删除指定topic
$ kafka-topics.sh  --bootstrap-server 127.0.0.1:9092 --delete --topic "kafka_test"

二、Kafka辨析

2.1 术语

按照从小到大的关系进行排列。

java 获取kafka 主题 java使用kafka教程_linq

2.2 Kafka与数据库的区别?

虽然都有查询与存储数据的功能,但Kafka更适合处理大规模的实时数据流,而数据库更适合存储和管理结构化数据。

三、业务提炼与总结

我发现现在设计的这类业务系统,不管是分布式、高并发,还是什么Hadoop、Redis,亦或是现实中的组织架构也好,都有这两个重要特点:

  • 水平易扩展(提高易用性)。 提高并发度,可以多使唤一些线程。
  • 垂直可备份(提高可用性)。 多备份一点没错,有备无患。

现实中的组织架构也有这种特点,同级别的官员可以相互调动,这叫水平可扩展,下级官员干出成绩,经过考察认定具备了一定能力后,就可以得到提拔,这叫垂直易备份,从这个角度上来说,下级也可以是上级的备份,一个省的组织架构和国家机关的组织架构就是垂直关系,从命名上就可以看出这种关系,国家级 –> 省部 –> 厅局 –> 县处 –> 乡科。 因此,无论是从计算机角度出发,还是从现实出发,具备上述两种特点的系统,绝对是一个兼具可用与易用性的系统。我想,需要在生活中带着好奇的眼光去观察,观察哪些地方需要水平可扩展,垂直易备份的,首先是分析物的关系,然后是分析人的关系,只有做到这两点,才是一个好的系统。