Kafka是一种高吞吐的分布式发布订阅消息系统

kafka安装和简单测试

安装kafka

下载

wget https://www-us.apache.org/dist/kafka/2.1.1/kafka_2.11-2.1.1.tgz

解压

tar -xzvf kafka_2.11-2.1.1.tgz

修改配置文件

cd kafka_2.11-2.1.1/config

zookeeper.properties 是zookeeper的配置文件,默认端口号2181,可不做修改

server.properties 是kafka配置文件,将 zookeeper.connect 这行 改为自己的zookeeper地址和端口号

这样就可以哦

修改完成之后 返回kafka主目录

cd ..

运行zookeeper和kafka

bin/zookeeper-server-start.sh config/zookeeper.properties   运行zookeeper

不要关闭此窗口 再开一个新窗口 重新进入kafka目录

bin/kafka-server-start.sh config/server.properties     运行kafka

运行producer和consumer

跟上步操作一样 不要关闭窗口 重新开 重新进入kafka目录

创建一个topic为test

把ip和port改为自己zookeeper中的    咱们上边就是localhost:2181

bin/kafka-topics.sh --create --zookeeper ip:port --replication-factor 1 --partitions 1 --topic test

我们这么运行

(bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

)      

运行producer

bin/kafka-console-producer.sh --broker-list ip:port --topic test

(bin/kafka-console-producer.sh  --broker-list  localhost:2181 –topic  test )

跟上步操作一样 不要关闭窗口 重新开 重新进入kafka目录

运行consumer

bin/kafka-console-consumer.sh --bootstrap-server ip:port --topic test --from-beginning

(bin/kafka-console-consumer.sh –bootstrap-server localhost:2181 –topic test –from-beginning)

然后在producer发送信息 会发现 consumer的窗口会出现你发送的消息

cd  /usr/local/下边执行

安装kafka的php扩展

# 先安装rdkfka库文件

git clone https://github.com/edenhill/librdkafka.git

cd librdkafka/

./configure

make

sudo make install

执行完退出到local目录下

git clone https://github.com/arnaud-lb/php-rdkafka.git

cd php-rdkafka

phpize

./configure

make all -j 5

sudo make install

退出到cd /etc/nginx目录下

修改php.ini文件

vim [php]/php.ini

添加 extension=rdkafka.so

如果没有报错,php扩展安装就完成啦!

接下来 创建生产者文件

cd /usr/share/nginx/html/

PHP代码实践

<?php

$conf = new RdKafka\Conf();

$conf->setDrMsgCb(function ($kafka, $message) {

file_put_contents("./dr_cb.log", var_export($message, true).PHP_EOL, FILE_APPEND);

});

$conf->setErrorCb(function ($kafka, $err, $reason) {

file_put_contents("./err_cb.log", sprintf("Kafka error: %s (reason: %s)", rd_kafka_err2str($err), $reason).PHP_EOL, FILE_APPEND);

});

$rk = new RdKafka\Producer($conf);

$rk->setLogLevel(LOG_DEBUG);

$rk->addBrokers("127.0.0.1");

$cf = new RdKafka\TopicConf();

// -1必须等所有brokers同步完成的确认 1当前服务器确认 0不确认,这里如果是0回调里的offset无返回,如果是1和-1会返回offset

// 我们可以利用该机制做消息生产的确认,不过还不是100%,因为有可能会中途kafka服务器挂掉

$cf->set('request.required.acks', 0);

$topic = $rk->newTopic("test", $cf);

$option = 'qkl';

for ($i = 0; $i < 20; $i++) {

//RD_KAFKA_PARTITION_UA自动选择分区

//$option可选

$topic->produce(RD_KAFKA_PARTITION_UA, 0, "qkl . $i", $option);

}

$len = $rk->getOutQLen();

while ($len > 0) {

$len = $rk->getOutQLen();

var_dump($len);

$rk->poll(50);

}

创建完运行生产者

php producer.php

会输出

int(20)
int(20)
int(20)
int(20)
int(0)



你也可以试着输入一些消息



创建消费者文件,同一个目录

cd /usr/share/nginx/html/

comsumer.php

<?php

$conf = new RdKafka\Conf();

$conf->setDrMsgCb(function ($kafka, $message) {

    file_put_contents("./c_dr_cb.log", var_export($message, true), FILE_APPEND);

});

$conf->setErrorCb(function ($kafka, $err, $reason) {

    file_put_contents("./err_cb.log", sprintf("Kafka error: %s (reason: %s)", rd_kafka_err2str($err), $reason).PHP_EOL, FILE_APPEND);

});

 

//设置消费组

$conf->set('group.id', 'myConsumerGroup');

 

$rk = new RdKafka\Consumer($conf);

$rk->addBrokers("127.0.0.1");

 

$topicConf = new RdKafka\TopicConf();

$topicConf->set('request.required.acks', 1);

//在interval.ms的时间内自动提交确认、建议不要启动

//$topicConf->set('auto.commit.enable', 1);

$topicConf->set('auto.commit.enable', 0);

$topicConf->set('auto.commit.interval.ms', 100);

 

// 设置offset的存储为file

//$topicConf->set('offset.store.method', 'file');

// 设置offset的存储为broker

 $topicConf->set('offset.store.method', 'broker');

//$topicConf->set('offset.store.path', __DIR__);

 

//smallest:简单理解为从头开始消费,其实等价于上面的 earliest

//largest:简单理解为从最新的开始消费,其实等价于上面的 latest

//$topicConf->set('auto.offset.reset', 'smallest');

 

$topic = $rk->newTopic("test", $topicConf);

 

// 参数1消费分区0

// RD_KAFKA_OFFSET_BEGINNING 重头开始消费

// RD_KAFKA_OFFSET_STORED 最后一条消费的offset记录开始消费

// RD_KAFKA_OFFSET_END 最后一条消费

$topic->consumeStart(0, RD_KAFKA_OFFSET_BEGINNING);

//$topic->consumeStart(0, RD_KAFKA_OFFSET_END); //

//$topic->consumeStart(0, RD_KAFKA_OFFSET_STORED);

 

while (true) {

    //参数1表示消费分区,这里是分区0

    //参数2表示同步阻塞多久

    $message = $topic->consume(0, 12 * 1000);

    if (is_null($message)) {

        sleep(1);

        echo "No more messages\n";

        continue;

    }

    switch ($message->err) {

        case RD_KAFKA_RESP_ERR_NO_ERROR:

            var_dump($message);

            break;

        case RD_KAFKA_RESP_ERR__PARTITION_EOF:

            echo "No more messages; will wait for more\n";

            break;

        case RD_KAFKA_RESP_ERR__TIMED_OUT:

            echo "Timed out\n";

            break;

        default:

            throw new \Exception($message->errstr(), $message->err);

            break;

    }

}

设置完启动,会接收到你刚刚输入的消息

成功了!

 

php下kafka实践的更多相关文章

  1. Docker下kafka学习三部曲之二:本地环境搭建

    在上一章< Docker下kafka学习,三部曲之一:极速体验kafka>中我们快速体验了kafka的消息分发和订阅功能,但是对环境搭建的印象仅仅是执行了几个命令和脚本,本章我们通过实战来 ...

  2. Linux下Kafka单机安装配置方法(图文)

    Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢 介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了 ...

  3. Kafka实践、升级和新版本(0.10)特性预研

    本文来自于网易云社区 一.消息总线MQ和Kafka (挡在请求的第一线) 1. 几个应用场景 case a:上游系统往下游系统推送消息,而不关心处理结果: case b:一份新数据生成,需要实时保存到 ...

  4. Linux下Kafka单机安装配置方法

    Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: •Kafka将消息以topi ...

  5. Docker下kafka学习三部曲之一:极速体验kafka

    Kafka是一种高吞吐量的分布式发布订阅消息系统,从本章开始我们先极速体验,再实战docker下搭建kafka环境,最后开发一个java web应用来体验kafka服务. 我们一起用最快的速度体验ka ...

  6. SeaweedFS在.net core下的实践方案

    一直对分布式的文件储存系统很感兴趣,最开始关注淘宝的TFS(Taobao File System),好像搁浅了,官方地址无法访问,github上面,各种编译问题,无意间发现了SeaweedFS 链接s ...

  7. window下Kafka最佳实践

    Kafka的介绍和入门请看这里kafka入门:简介.使用场景.设计原理.主要配置及集群搭建(转) 当前文章从实践的角度为大家规避window下使用的坑. 1.要求: java 6+ 2.下载kafka ...

  8. HP下kafka的实践

    kafka 简介 Kafka 是一种高吞吐量的分布式发布订阅消息系统 kafka角色必知 producer:生产者. consumer:消费者. topic: 消息以topic为类别记录,Kafka将 ...

  9. 【转】MySQL乐观锁在分布式场景下的实践

    背景 在电商购物的场景下,当我们点击购物时,后端服务就会对相应的商品进行减库存操作.在单实例部署的情况,我们可以简单地使用JVM提供的锁机制对减库存操作进行加锁,防止多个用户同时点击购买后导致的库存不 ...

随机推荐

  1. Could not initialize class utils.JdbcUtils

    今天用JdbcUtils时出现了一个问题,被困扰了一晚上.从网上找的原因,说什么url错了,版本不一致等等都不能解决我的问题, 我写好了一个JdbcUtils准备测试,发现从后台用Dao测试完全没问题 ...

  2. 人只能靠自己 编写ETL框架使用工具

    今天开始接触到大数据模块,etl 框架工具目的是对医院中的PACS 和RIS 系统进行数据提取: 目前只查到需要用etl工具,大数据板块 ,具体实现仍是大问题 有缘人看到可以留言提示啊:

  3. C语言博客作业5--指针

    C语言博客作业5--指针 1.本章学习总结(2分) 1.1思维导图 请以思维导图总结本周的学习内容,如下图所示: 1.2本章学习体会及代码量学习体会 1.2.1学习体会 描述本周学习感受,也可以在这里 ...

  4. oracle入坑日记<六>自增列创建和清除(含序列和触发器的基础用法)

    0   前言 用过 SQLserver 和 MySQL 的自增列(auto_increment),然而 Oracle 在建表设置列时却没有自增列. 查阅资料后发现 Oracle 的自增列需要手动编写. ...

  5. 虚拟机上安装django链接Pycharm(版本差异有所差异)

    第一,启动虚拟机,配置好虚拟机 第二,workon查看安装那些虚拟环境 第三,创建虚拟环境命令:mkvirtualenv -p /usr/bin/ python3 my_djangou 第四,进入虚拟 ...

  6. 原生js开发vue的双向数据绑定

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 路由对象route

    路由对象是不可变 (immutable) 的,每次成功的导航后都会产生一个新的对象.不过你可以 watch (监测变化) 它. 通过 this.$route 访问当前路由,还可以通过router.ma ...

  8. 删除pending.xml

    如果提示不能删除 需要在cmd命令行中执行如下命令 echo y|cacls D:\Windows\winsxs\reboot.xml /p everyone:f del /q D:\Windows\ ...

  9. Unable to find a single main class from the following candidates ,显示有两个main class

    由于基础框架是用的网上down的源码,我将项目名字改了,估计没有进行maven clean,本地调试的时候没有问题. 当发布时候,执行maven install 一直提示上述错误. 解决办法:1.ma ...

  10. NamedParameterJdbcTemplate

    NamedParameterJdbcTemplate 在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参 ...