Kafka总结笔记

概述

Kafka 是一个分布式消息队列(MQ, Message queue)。常见的消息队列还有:ActiveMQRabbitMQRocketMQZeroMQMetaMQ 等等。当然,我们也可以使用Redis作为简单的消息队列使用。

消息队列对比参考:https://zhuanlan.zhihu.com/p/60288391

(图片来源于互联网)

官网:http://kafka.apache.org/
中文站:http://kafka.apachecn.org/

快速入门

官方的 quickstart 已经非常详细了,按照文档可以一步一步的达到入门的效果。地址:http://kafka.apache.org/quickstart

这里我记录一下简单的步骤,仅作为测试使用,真实环境请参考官方文档部署:
1、下载解压:

$ cd /opt
$ wget http://mirror.bit.edu.cn/apache/kafka/2.2.0/kafka_2.12-2.2.0.tgz
$ tar -xzf kafka_2.12-2.2.0.tgz
$ cd kafka_2.12-2.2.0

Kafka 依赖 ZooKeeper 。安装包里已经包含了 ZooKeeper。

2、启动 ZooKeeper

$ bin/zookeeper-server-start.sh config/zookeeper.properties

# 限于篇幅,省略大部分输出
...
[2019-05-11 13:15:44,643] INFO binding to port 0.0.0.0/0.0.0.0:2181 (org.apache.zookeeper.server.NIOServerCnxnFactory)

如果需要后台运行,请在命令后面追加&

3、启动 Kafka Server端

$ bin/kafka-server-start.sh config/server.properties

# 限于篇幅,省略大部分输出
...
[2019-05-11 13:18:34,578] INFO Kafka version: 2.2.0 (org.apache.kafka.common.utils.AppInfoParser)
[2019-05-11 13:18:34,578] INFO Kafka commitId: 05fcfde8f69b0349 (org.apache.kafka.common.utils.AppInfoParser)
[2019-05-11 13:18:34,579] INFO [KafkaServer id=0] started (kafka.server.KafkaServer)

如果需要后台运行,请在命令后面追加&

4、创建主题(Topic)
创建一个名为 test 的主题,包含1个分区(partition),1个副本(replication-factor):

$ bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test

创建完毕后可以查看该主题:

$  bin/kafka-topics.sh --list --bootstrap-server localhost:9092

test

也可以在配置里设置为在发布不存在的主题时自动创建主题,而不是手动创建主题。这个后面再说明。

5、发布消息
我们新启动一个命令行窗口充当生产者,向 Kafka 里发送消息,指定主题为 test

$ cd /opt/kafka_2.12-2.2.0/
$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

>

然后命令行等待我们输入消息。我们输入 hello回车:

>hello
>

消息就发出去了。接下来我们启动消费者。

6、消费消息

我们新启动一个命令行窗口充当消费者来消费消息,指定主题为 test

$ cd /opt/kafka_2.12-2.2.0/
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

hello

就消费了1条消息。我们可以在生产者命令行窗口继续发生消息,消费者端可以实时消费。

好了,基本的安装测试就到这。关于设置kakfa集群请参考:http://kafka.apache.org/quickstart#quickstart_multibroker

如何在项目里使用

上一节仅演示了在命令行里使用,可以方便调试。对于在项目里使用,需要借助 SDK。

PHP

常用的SDK:

这里以 kafka-php 为例。

kafka-php 使用纯粹的PHP 编写的 kafka 客户端,目前支持 0.8.x 以上版本的 Kafka。最新的kafka-php 版本是 v0.2.8 (截止到2019-05-11),详见:https://github.com/weiboad/kafka-php/releaseskafka-phpv0.2.xv0.1.x 不兼容,如果使用原有的 v0.1.x 的可以参照文档 Kafka PHP v0.1.x Document, 不过建议切换到 v0.2.x 上。

kafka-php (v0.2.8) 环境要求:

  • PHP 版本大于 5.5
  • Kafka Server 版本大于 0.8.0
  • 消费模块 Kafka Server 版本需要大于 0.9.0

1、发送消息,同步方式:

require '../vendor/autoload.php';
date_default_timezone_set('PRC');

// use Monolog\Logger;
// //use Monolog\Handler\StdoutHandler;
// Create the logger
// $logger = new Logger('my_logger');
// //Now add some handlers
// $logger->pushHandler(new StdoutHandler());

$config = \Kafka\ProducerConfig::getInstance();
$config->setMetadataRefreshIntervalMs(10000);
$config->setMetadataBrokerList('127.0.0.1:9192,127.0.0.1:9193');
$config->setBrokerVersion('0.10.2.1');
$config->setRequiredAck(1);
$config->setIsAsyn(false);
$config->setProduceInterval(500);
$config->setTimeout(2000);

$producer = new \Kafka\Producer();
// $producer->setLogger($logger);

for($i = 0; $i < 100; $i++) {
    $result = $producer->send(array(
        array(
            'topic' => 'test1',
            'value' => 'test1....message.',
            'key' => '',
        ),
    ));
    var_dump($result);
}

说明:
1) 设置 logger 不是必选的。但是如果需要调试,建议加上。如果没有安装Monolog,也可以自己定一个 logger ,只要实现了 psr/log规范即可。
2) MetadataBrokerList支持集群配置。使用英文逗号隔开即可。
3) BrokerVersion版本需与安装的 kafka 版本一致。

2、消费消息

消费消息一般需要写脚本常驻运行。可以借助 Supervisor 工具。

require '../vendor/autoload.php';
date_default_timezone_set('PRC');

// use Monolog\Logger;
// use Monolog\Handler\StdoutHandler;
// // Create the logger
// $logger = new Logger('my_logger');
// // Now add some handlers
// $logger->pushHandler(new StdoutHandler());

$config = \Kafka\ConsumerConfig::getInstance();
$config->setMetadataRefreshIntervalMs(10000);
$config->setMetadataBrokerList('10.13.4.159:9192');
$config->setGroupId('test'); //消费者组
$config->setBrokerVersion('0.10.2.1');
$config->setTopics(['test']); //主题
//$config->setOffsetReset('earliest');
$consumer = new \Kafka\Consumer();

// $consumer->setLogger($logger);

$consumer->start(function($topic, $part, $message) {
    var_dump($message);
});

注意:
1) 消费者组可以有多个,互相之间不影响。每个消费者组都可以消费到完整的一份消息。
2) setOffsetReset的值有:earliest(从最早的开始消费)、latest(从最新的开始消费)。

Golang

分区、组、消费者的关系

1、同一个分区(partition)内的消息只能被同一个组中的一个消费者(consumer)消费,当消费者数量多于分区的数量时,多余的消费者空闲。
2、启动多个组,则会使同一个消息被消费多次。

详细请看:https://www.jianshu.com/p/6233d5341dfe

常用命令

  • 启动zookeeper
$ bin/zookeeper-server-start.sh config/zookeeper.properties &
  • 关闭zookeeper
$ bin/zookeeper-server-stop.sh
  • 启动kafka
$ bin/kafka-server-start.sh config/server.properties &
  • 关闭kafka
$ bin/kafka-server-stop.sh
  • 创建topic
$ bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
  • 查看所有topic
$ bin/kafka-topics.sh --list --bootstrap-server localhost:9092
  • 查看某个topic具体信息
$ bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test
  • 删除topic (可直接删除的前提:delete.topic.enable=true)
$ bin/kafka-topics.sh --delete --bootstrap-server localhost:9092 --topic test
  • 生产消息
$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
  • 消费消息
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

参考

1、Apache Kafka
http://kafka.apache.org/documentation/
2、消息队列Kafka、RocketMQ、RabbitMQ的优劣势比较 - 知乎
https://zhuanlan.zhihu.com/p/60288391
3、weiboad/kafka-php: kafka php client
https://github.com/weiboad/kafka-php
4、kafka中partition和消费者对应关系 - 简书
https://www.jianshu.com/p/6233d5341dfe
5、kafka常用的命令 - 随笔 - SegmentFault 思否
https://segmentfault.com/a/1190000010040990
6、消息中间件部署及比较:rabbitMQ、activeMQ、zeroMQ、rocketMQ、Kafka、redis - 掘金
https://juejin.im/post/5b32044ef265da59654c3027
7、面试官问分布式技术面试题,一脸懵逼怎么办?_ITPUB博客
http://blog.itpub.net/69917606/viewspace-2642545/

猜你喜欢

转载自www.cnblogs.com/52fhy/p/10848659.html