1. 概述

Apache Kafka是一个分布式消息系统,凭借其优异的特性而被广泛使用。

  • 高性能:O(1)复杂度消息快速持久化。
  • 高吞吐率: 单机每秒10w条消息传输。
  • 支持消息分区和分布式消费。
  • 支持在线水平扩展。
架构及核心组件

  • Producer: 消息生产者,即向kafka broker发送消息的客户端。
  • Consumer:消息消费者,即从kafka broker获取消息的客户端。
  • Topic:消息根据topic进行归类。
  • Partition:消息分片,每个topic中的消息被分为n个独立的partition,以提高消息处理效率。
  • Broker:kafka集群中的kafka实例(服务器节点),一个broker可以容纳多个topic。

Kafka依赖于zookeeper保存一些meta信息,来保证系统可用性。

2. 环境准备

2.1 安装zookeeper

zk官网下载安装包,如zookeeper-3.4.13.tar.gz,解压即可。

  • 启动服务,默认监听端口2181
./bin/zkServer.sh start
  • 客户端连接
./bin/zkCli.sh -server 10.183.222.203:2181

2.2 安装kafka

kafka官网下载安装包,如kafka_2.12-2.0.0.tgz,解压即可。

/config/server.properties配置:

log.dirs=/tmp/kafka-logs

listeners=PLAINTEXT://10.183.222.203:9092

zookeeper.connect=10.183.222.203:2181 #连接zookeeper

  • 启动服务,默认监听端口9092
./bin/kafka-server-start.sh  config/server.properties  &

启动kafka后,zk增加了brokers、consumers等节点:

3. 命令行常用命令

创建topic (-create)
# 创建topic:test01,并指定了replication-factor和partitions分别为1。
# replication-factor控制一个Message会被写到多少台服务器上,因此这个值必须≤Broker数量。
./bin/kafka-topics.sh -create -zookeeper 10.183.222.203:2181 -replication-factor 1 -partitions 1 -topic test01

查看topic详情 (-describe)
./bin/kafka-topics.sh -describe -zookeeper 10.183.222.203:2181

发送消息到指定topic
./bin/kafka-console-producer.sh --broker-list 10.183.222.203:9092 -topic test01

消费指定topic上的消息
./bin/kafka-console-consumer.sh -bootstrap-server 10.183.222.203:9092 -topic test01 -from-beginning

4. java api实现

4.1 添加maven配置
        <!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.0.0</version>
</dependency>
4.2 消息生产者
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord; import java.util.Properties; /**
* 消息生产者
*/
public class ProducerDemo {
private static final String helloTopic = "HelloWorld"; public static void main(String[] args) {
// 1. 构造Propertity,进行producer 相关配置。
Properties properties = new Properties();
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "10.183.222.203:9092");
properties.put(ProducerConfig.ACKS_CONFIG, "all");
properties.put(ProducerConfig.RETRIES_CONFIG, 0);
properties.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
properties.put(ProducerConfig.LINGER_MS_CONFIG, 1);
properties.put(ProducerConfig.BATCH_SIZE_CONFIG, 33554432);
// 消息序列化方式
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
Producer<String, String> producer = null;
try {
// 2. 构造Producer对象
producer = new KafkaProducer<>(properties);
for (int i = 0; i < 10; i++) {
String msgValue = "Message " + i;
// 3. 发送消息
producer.send(new ProducerRecord<>(helloTopic, msgValue));
System.out.println("Sent:" + msg);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (producer != null) {
producer.close();
}
}
}
}
4.3 消息消费者
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Collections;
import java.util.Properties; /**
* consumer从kafka读取消息
*/
public class ConsumerDemo {
private static final String helloTopic = "HelloWorld"; public static void main(String[] args) {
// 1. 构造Propertity,进行consumer相关配置。
Properties properties = new Properties();
properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "10.183.222.203:9092");
properties.put(ConsumerConfig.GROUP_ID_CONFIG, "group-1");
properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true");
properties.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000");
properties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
properties.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "30000");
// 消息反序列化方式
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); // 2. 生成消费实例
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties);
// 3. 订阅相应的 topic
// 说明:可以消费多个topic: Arrays.asList(topic);
// topic支持正则表达式:如:subscribe(Pattern.compile("test.*")
consumer.subscribe(Collections.singleton(helloTopic)); // 4. 循环消费消息
while (true) {
try {
// 4.1 poll方法拉取订阅的消息, 消费者必须不断的执行poll,获取消息、维持连接。
ConsumerRecords<String, String> records = consumer.poll(1000);
// 4.2 消费数据,必须在下次poll之前消费完这些数据, 且总耗时不得超过SESSION_TIMEOUT_MS_CONFIG
// 若不能在下次poll之前消费完,则会触发一次负载均衡,产生卡顿。
// 可以开一个单独的线程池来消费消息,然后异步返回结果。
for (ConsumerRecord<String, String> record : records) {
System.out.printf("topic = %s, partition = %d, offset = %d, key = %s, value = %s\n",
record.topic(), record.partition(), record.offset(), record.key(), record.value());
} } finally {
// 不再消费主动关闭
consumer.close();
}
}
}
}

kafka作为目前广泛使用的消息中间件。本文对其核心组件和基本用法做了学习记录。

参考:Kafka: The Definitive Guide

消息中间件kafka学习记录的更多相关文章

  1. Kafka学习记录

    1 Kafka的基本介绍 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.具有快速.可扩展.分布式.可复制等特点.Kafka与传 ...

  2. 消息队列Kafka学习记录

    Kafka其实只是众多消息队列中的一种,对于Kafka的具体释义我这里就不多说了,详见:http://baike.baidu.com/link?url=HWFYszYuMdP_lueFH5bmYnlm ...

  3. kafka学习笔记——基本概念与安装

    Kafka是一个开源的,轻量级的.分布式的.具有复制备份.基于zooKeeper协调管理的分布式消息系统. 它具备以下三个特性: 能够发布订阅流数据: 存储流数据时,提供相应的容错机制 当流数据到达时 ...

  4. kafka学习笔记(一)消息队列和kafka入门

    概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...

  5. Kafka学习-简介

      Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cloudera.Apache Storm.S ...

  6. java后端学习记录2019

    学习计划 2019年计划 1.学习计算机基础,并加以实践.包括LeetCode刷题.数据库原理(索引和锁.Sql优化等).网络协议(Http.Tcp).操作系统(加深Linux).<Http权威 ...

  7. 区块链Hyperledger Fabric 学习记录(一)开发环境搭建(ubuntu16.04/ubuntu18.04)

    目录 Fabric开发环境搭建 更新说明 教程环境及软件版本 Docker 安装Docker 配置用户组 配置Aliyun Docker加速器 安装docker-compose Go 下载源码 安装源 ...

  8. Spring Boot 2.0 教程 | 快速集成整合消息中间件 Kafka

    欢迎关注个人微信公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site ...

  9. Spring Boot 2.0 快速集成整合消息中间件 Kafka

    欢迎关注个人微信公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site ...

随机推荐

  1. elementUI拿到当前表格行的数据的另一种写法

    背景: 这里是通过点击“修改”按钮后才拿到当前行的数据,不是点击当前行任意位置拿到数据,所以不能用 @row-click 方法 改用点击的时候直接拿到这个表里面的这一条数据 1.绑定事件 <te ...

  2. cgroup & oom-killer 简介

    cgroup内存限制 memory.failcnt memory.limit_in_bytes memory.usage_in_bytes memory.max_usage_in_bytes memo ...

  3. 戏说 .NET GDI+系列学习教程(三、Graphics类的应用_自定义控件--主要用于画面拖拽效果)

    如题,需求:在某个图片上用户可以手动指定位置. 如下: 中心思想:仿照Visual Studio工具中的控件的做法 如何仿照呢? 1.自定义的控件类继承System.Windows.Forms.Con ...

  4. SAS市场研究应用介绍:组合/联合分析

    SAS市场研究应用介绍:组合/联合分析 一 SAS市场研究模块介绍 市场研究是指研究组织(企业)与客户.公众三者关系的规律的过程,是市场营销领域中的一个重要元素.它把消费者.客户.公众和营销者通过信息 ...

  5. HTML5自定义属性的设置与获取

    <div id="box" aaa="bbb" data-info="hello"></div> <body& ...

  6. HDU 1700 Points on Cycle (坐标旋转)

    题目链接:HDU 1700 Problem Description There is a cycle with its center on the origin. Now give you a poi ...

  7. Collection map

    HashMap 的工作原理及代码实现 底层数组+链表实现,可以存储null键和null值,线程不安全 初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂 扩容针 ...

  8. Codeforces 1183A Nearest Interesting Number

    题目链接:http://codeforces.com/problemset/problem/1183/A 题意:求不小于 a 且每位数和能被 4 整除的 最小 n 思路:暴力模拟就好. AC代码: # ...

  9. Codeforces 1176B - Merge it!

    题目链接:http://codeforces.com/problemset/problem/1176/B 题意:给定序列,任意俩个元素可以相加成一个元素,求序列元素能被3整除的最大数量. 思路: 对于 ...

  10. 调用phone库,查询手机号码归属地(4)

    需要安装pymysql,phone库 #!/usr/bin/python # -*- coding: utf-8 -*- import sys, pymysql, logging, phone fro ...