kafka入门及技术指南

介绍

         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获取消息。

 

Guess you like

Origin blog.csdn.net/yan_dk/article/details/117573887