介绍
Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
主要应用场景是:日志收集系统和消息系统。
1. kafka
具备吞吐量大无限扩容的特点,相比起同类,它更适合需要无限扩容, 吞吐量要大(并发量很大)
的场景,比如日志大数据等。
2.
本来也是个消息系统,所以可以做: 解耦,异步处理,流量削峰,消息队列
安装
安装kafka集群
需要先准备linux服务器,使用docker安装,设当前ip为1.1.1.1,建立目录结构如下
建立docker-compose-kafka-cluster.yml
version: '3.7'
networks:
docker_net:
external: true
services:
kafka1:
image: wurstmeister/kafka
restart: unless-stopped
container_name: kafka1
ports:
- "9093:9092"
external_links:
- zoo1
- zoo2
- zoo3
environment:
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_HOST_NAME: 1.1.1.1 ## 修改:宿主机IP
KAFKA_ADVERTISED_PORT: 9093 ## 修改:宿主机映射port
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://1.1.1.1:9093 ## 绑定发布订阅的端口。 修改:宿主机IP
KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181,zoo3:2181"
volumes:
- "./kafka/kafka1/docker.sock:/var/run/docker.sock"
- "./kafka/kafka1/data/:/kafka"
networks:
- docker_net
kafka2:
image: wurstmeister/kafka
restart: unless-stopped
container_name: kafka2
ports:
- "9094:9092"
external_links:
- zoo1
- zoo2
- zoo3
environment:
KAFKA_BROKER_ID: 2
KAFKA_ADVERTISED_HOST_NAME: 1.1.1.1 ## 修改:宿主机IP
KAFKA_ADVERTISED_PORT: 9094 ## 修改:宿主机映射port
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://1.1.1.1:9094 ## 修改:宿主机IPKAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181,zoo3:2181"
volumes:
- "./kafka/kafka2/docker.sock:/var/run/docker.sock"
- "./kafka/kafka2/data/:/kafka"
networks:
- docker_net
kafka3:
image: wurstmeister/kafka
restart: unless-stopped
container_name: kafka3
ports:
- "9095:9092"
external_links:
- zoo1
- zoo2
- zoo3
environment:
KAFKA_BROKER_ID: 3
KAFKA_ADVERTISED_HOST_NAME: 1.1.1.1 ## 修改:宿主机IP
KAFKA_ADVERTISED_PORT: 9095 ## 修改:宿主机映射port
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://1.1.1.1:9095 ## 修改:宿主机IP
KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181,zoo3:2181"
volumes:
- "./kafka/kafka3/docker.sock:/var/run/docker.sock"
- "./kafka/kafka3/data/:/kafka"
networks:
- docker_net
##kafka可视化管理工具
kafka-manager:
image: sheepkiller/kafka-manager:latest
restart: unless-stopped
container_name: kafka-manager
hostname: kafka-manager
ports:
- "9000:9000"
links: # 连接本compose文件创建的container
- kafka1
- kafka2
- kafka3
external_links: # 连接本compose文件以外的container
- zoo1
- zoo2
- zoo3
environment:
ZK_HOSTS: zoo1:2181,zoo2:2181,zoo3:2181 ## 修改:宿主机IP
TZ: CST-8
networks:
- docker_net
运行安装指令
# docker-compose -f docker-compose-kafka-cluster.yml up -d
kafka集群安装成功。地址为1.1.1.1:9093
我们建立服务器提供kafka服务。
示例
本实例使用linux环境,推荐使用phpstorm编辑器,将本地代码与服务端代码同步,便于开发管理。使用composer部署,可以查看相关文档。
示例1(原生php调用kafka)
服务器建立测试目录,执行
# composer require nmred/kafka-php
建立生产者producer.php
<?php
require './vendor/autoload.php';
date_default_timezone_set('PRC');
$config = \Kafka\ProducerConfig::getInstance();
$config->setMetadataRefreshIntervalMs(10000);
$config->setMetadataBrokerList('1.1.1.1:9093');
$config->setBrokerVersion('1.0.0');
$config->setRequiredAck(1);
$config->setIsAsyn(false);
$config->setProduceInterval(500);
$producer = new \Kafka\Producer();
for($i = 0; $i < 1; $i++) {
$result = $producer->send([
[
'topic' => 'topicA',
'value' => 'topicA下面的第一条消息-消息1'.time(),
'key' => '',
],
]);
var_dump($result);
}
建立消费者consumer.php
<?php
require './vendor/autoload.php';
date_default_timezone_set('PRC');
$config = \Kafka\ConsumerConfig::getInstance();
$config->setMetadataRefreshIntervalMs(10000);
$config->setMetadataBrokerList('1.1.1.1:9093');
$config->setGroupId('test');
$config->setBrokerVersion('1.0.0');
$config->setTopics(array('topicA'));
//$config->setOffsetReset('earliest');
$consumer = new \Kafka\Consumer();
$consumer->start(function ($topic, $part, $message) {
var_dump($message);
});
运行生产者
# php producer.php
运行消费者
# php consumer.php
上述实现了生产者产生的消息提交到kafka,消费者从kafka获取消息。