kafka的使用

kafka的优点

1 通过O(1)的磁盘数据结构提供消息的持久化,
    这种结构对于即使数以TB的消息存储也能够
    保持长时间的稳定性能。
2 高吞吐量[2]:即使是非常普通的硬件Kafka
    也可以支持每秒数百万[2]的消息。
3 支持通过Kafka服务器和消费机集群来分区消息。
4 支持Hadoop并行数据加载。[3] 

kafka的关键字

Broker

    Kafka集群包含一个或多个服务器,这种服务器被称为broker

Topic

    每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。
    (
        物理上不同Topic的消息分开存储,
        逻辑上一个Topic的消息虽然保存于一个或多个broker上
        但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)

Partition

    Partition是物理上的概念,每个Topic包含一个或多个Partition.

Producer

    负责发布消息到Kafka broker

Consumer

    消息消费者,向Kafka broker读取消息的客户端。

Consumer Group
    每个Consumer属于一个特定的Consumer Group
    (可为每个Consumer指定group name,若不指定group name则属于默认的group)。

kafka的基本的使用

使用最新版的php

kafka的使用

https://arnaud-lb.github.io/php-rdkafka/phpdoc/index.html

安装kafka扩展

mac下安装

1 安装 brew install kafka

kafka配置

/usr/local/etc/kafka/server.properties
/usr/local/etc/kafka/zookeeper.properties

启动zookeeper

zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties &

启动kafka

kafka-server-start /usr/local/etc/kafka/server.properties &

创建一个topic

kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

列出topic

扫描二维码关注公众号,回复: 1069994 查看本文章
kafka-topics --list --zookeeper localhost:2181

发送消息

kafka-console-producer --broker-list localhost:9092 --topic test 

消费消息

kafka-console-consumer --bootstrap-server localhost:9092 --topic test --from-beginning

php可用的扩展

https://packagist.org/packages/nmred/kafka-php
https://arnaud-lb.github.io/php-rdkafka/phpdoc/book.rdkafka.html

产生消息

// 安装php kafka扩展
//创建一个
$rk = new RdKafka\Producer();
$rk->setLogLevel(LOG_DEBUG);
$rk->addBrokers("localhost:9092");

// new topic
$topic = $rk->newTopic("test");

$topic->produce(RD_KAFKA_PARTITION_UA, 0, "Message payload");

消费消息

$rk = new RdKafka\Consumer();
$rk->setLogLevel(LOG_DEBUG);
// 指定 broker 地址,多个地址用"," 分割
$rk->addBrokers("localhost:9092");
$topic = $rk->newTopic("test");
$topic->consumeStart(0, RD_KAFKA_OFFSET_BEGINNING);

//消费
while (true) {
    // 第一个参数是分区号
    // 第二个参数是超时时间
    $msg = $topic->consume(0, 1000);
    if ($msg->err) {
        echo $msg->errstr(), "\n";
        break;
    } else {
        echo $msg->payload, "\n";
    }
}

猜你喜欢

转载自blog.csdn.net/cabing2005/article/details/78721867