Kafka简介及使用PHP处理Kafka消息

Kafka 是一种高吞吐的分布式消息系统,能够替代传统的消息队列用于解耦合数据处理,缓存未处理消息等,同时具有更高的吞吐率,支持分区、多副本、冗余,因此被广泛用于大规模消息数据处理应用。

Kafka的特点:

  • 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间复杂度的访问性能。
  • 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条以上消息的传输。【据了解,Kafka每秒可以生产约25万消息(50 MB),每秒处理55万消息(110 MB)】
  • 支持Kafka Server间的消息分区,同时保证每个Partition内的消息顺序传输。
  • 分布式系统,易于向外扩展。所有的producer、broker和consumer都会有多个,均为分布式的。无需停机即可扩展机器。
  • 消息被处理的状态是在consumer端维护,而不是由server端维护。当失败时能自动平衡。
  • 同时支持离线数据处理和实时数据处理。

Kafka的架构:

kafka架构图

Kafka的整体架构非常简单,producer、broker(kafka)和consumer都可以有多个。Producer,consumer实现Kafka注册的接口,数据从producer发送到broker,broker承担一个中间缓存和分发的作用。broker分发注册到系统中的consumer。broker的作用类似于缓存,即活跃的数据和离线处理系统之间的缓存。客户端和服务器端的通信,是基于简单,高性能,且与编程语言无关的TCP协议。

Kafka基本概念:

  • Topic:特指Kafka处理的消息源(feeds of messages)的不同分类。
  • Partition:Topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。
  • Message:消息,是通信的基本单位,每个producer可以向一个topic(主题)发布一些消息。
  • Producers:消息和数据生产者,向Kafka的一个topic发布消息的过程叫做producers。
  • Consumers:消息和数据消费者,订阅topics并处理其发布的消息的过程叫做consumers。
  • Broker:缓存代理,Kafa集群中的一台或多台服务器统称为broker。

Kafka消息发送的流程:

Kafka消息发送

下面是PHP生产、消费Kafka消息的例子(假设已经配置好Kafka):

1.从zookeeper源码src/c/src安装zookeeper c client

  1.  
    cd zookeeper-3.4.8/src/c
  2.  
    ./configure
  3.  
    make && make install

2.编译php libzookper扩展

  1.  
    git clone https://github.com/Timandes/libzookeeper.git
  2.  
    cd libzookeeper
  3.  
    phpize
  4.  
    ./configure--with-libzookeeper=/usr/local/bin/cli_mt
  5.  
    make && makeinstall

3.编译php zookeeper扩展

  1.  
    git clone https://github.com/andreiz/php-zookeeper.git
  2.  
    cd php-zookeeper
  3.  
    phpize
  4.  
    ./configure
  5.  
    make && make install

4.修改php.ini配置,添加libzookeeper和php-zookeeper扩展

  1.  
    extension=libzookeeper.so
  2.  
    extension=zookeeper.so

PHP处理Kafka消息:

1.启动zookeeper和kafka

  1.  
    ./bin/zookeeper-server-start.sh config/zookeeper.properties
  2.  
     
  3.  
    ./bin/kafka-server-start.sh config/server.properties

2.创建由2个partition组成的、名为testtopic的topic

kafka_2.11-0.10.0.0/bin/kafka-topics.sh --create--zookeeper localhost:2181 --replication-factor --partitions --topic testtopic

3.composer安装nmred/kafka-php

1 composer require "nmred/kafka-php"

4.producer.php代码

  1.  
    <php 
  2.  
    require_once('./vendor/autoload.php'); 
  3.  
    $produce=/Kafka/Produce::getInstance('localhost:2181',3000); 
  4.  
    $produce->setRequireAck(-1); $topicName='testtopic';
  5.  
    //获取到topic下可用的partitions
  6.  
    $partitions=$produce->getAvailablePartitions($topicName);
  7.  
    $partitionCount=count($partitions); 
  8.  
    $count=1;//可以处理的消费者数量(可以理解为server数量)
  9.  
    while(true){    $message=json_encode(array('uid'=>$count,'age'=>$count%100,'datetime'=>date('Y-m-d H:i:s')));     
  10.  
    //发送消息到不同的partition   
  11.  
     $partitionId=$count%$partitionCount;    
  12.  
    $produce->setMessages('testtopic',$partitionId,array($message));   
  13.  
     $result=$produce->send();    
  14.  
    var_dump($result);     
  15.  
    $count++;   
  16.  
     echo"producer sleeping/n";   
  17.  
     sleep(1);
  18.  
    }

5、consumer.php代码

  1.  
    <?php 
  2.  
    require_once('./vendor/autoload.php'); 
  3.  
    //获取需要处理的partitionId
  4.  
    $partitionId = isset($argv[1]) ? intval($argv[1]) :0; 
  5.  
    $consumer =/Kafka/Consumer::getInstance('localhost:2181'); 
  6.  
    $consumer->setGroup('test-consumer-group');
  7.  
    $consumer->setPartition('testtopic', $partitionId);
  8.  
    $consumer->setFromOffset(true);
  9.  
    $consumer->setMaxBytes(102400); 
  10.  
    while(true){    
  11.  
    $topic = $consumer->fetch();     
  12.  
    foreach ($topic as $topicName => $partition{        
  13.  
    foreach ($partition as $partId => $messageSet{            
  14.  
    foreach ($messageSet as $message){                
  15.  
    var_dump($message);           
  16.  
    }        
  17.  
    }    
  18.  
    }    
  19.  
    echo"consumer sleeping/n";   
  20.  
    sleep(1);
  21.  
    }

6、在3个终端界面分别运行

  1.  
    php producer.php
  2.  
    php consumer.php
  3.  
    php consumer.php

7、两个consumer脚本依次收到producer发送的消息

Kafka简介及使用PHP处理Kafka消息的更多相关文章

  1. KafKa简介和利用docker配置kafka集群及开发环境

    KafKa的基本认识,写的很好的一篇博客:https://www.cnblogs.com/sujing/p/10960832.html 问题:1.kafka是什么?Kafka是一种高吞吐量的分布式发布 ...

  2. Kafka记录-Kafka简介与单机部署测试

    1.Kafka简介 kafka-分布式发布-订阅消息系统,开发语言-Scala,协议-仿AMQP,不支持事务,支持集群,支持负载均衡,支持zk动态扩容 2.Kafka的架构组件 1.话题(Topic) ...

  3. 发布-订阅消息系统Kafka简介

    转载请注明出处:http://www.cnblogs.com/BYRans/ Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式 ...

  4. 高并发面试必问:分布式消息系统Kafka简介

    转载:https://blog.csdn.net/caisini_vc/article/details/48007297 Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成 ...

  5. Kafka简介

    Kafka简介 转载请注明出处:http://www.cnblogs.com/BYRans/ Apache Kafka发源于LinkedIn,于2011年成为Apache的孵化项目,随后于2012年成 ...

  6. Apache Kafka简介与安装(二)

    Kafka在Windows环境上安装与运行 简介 Apache kafka 是一个分布式的基于push-subscribe的消息系统,它具备快速.可扩展.可持久化的特点.它现在是Apache旗下的一个 ...

  7. Kafka简介、安装

    一.Kafka简介 Kafka是一个分布式.可分区的.可复制的消息系统.几个基本的消息系统术语:1.消费者(Consumer):从消息队列(Kafka)中请求消息的客户端应用程序.2.生产者(Prod ...

  8. 【Apache Kafka】一、Kafka简介及其基本原理

      对于大数据,我们要考虑的问题有很多,首先海量数据如何收集(如Flume),然后对于收集到的数据如何存储(典型的分布式文件系统HDFS.分布式数据库HBase.NoSQL数据库Redis),其次存储 ...

  9. Kafka学习笔记(1)----Kafka的简介和Linux下单机安装

    1. Kafka简介 Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性,但是在设计实现上完全不 ...

随机推荐

  1. Entity Framework 查漏补缺 (二)

    数据加载 如下这样的一个lamda查询语句,不会立马去查询数据库,只有当需要用时去调用(如取某行,取某个字段.聚合),才会去操作数据库,EF中本身的查询方法返回的都是IQueryable接口. 链接: ...

  2. 微信公众号开发C#系列-4、获取接口调用凭证

    概述 获取接口调用凭证实质就是获取access_token.在微信接口开发中,许多服务的使用都离不开Access Token,Access Token相当于打开这些服务的钥匙,正常情况下会在7200秒 ...

  3. Spring Cloud Alibaba 新版本发布:众多期待内容整合打包加入!

    在Nacos 1.0.0 Release之后,Spring Cloud Alibaba也终于发布了最新的版本.该版本距离上一次发布,过去了整整4个月!下面就随我一起看看,这个大家期待已久的版本都有哪些 ...

  4. Ajax全局处理错误

    背景:项目前端ajax请求很多都没有写error方法,所以用户体验很不好 新来的前端负责人发现这个问题,写了一个错误处理方法,如下 //统一处理Ajax错误方法 function onAjaxErro ...

  5. 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法

    一,制作U盘启动盘 随着个人电脑的“飞入寻常百姓家”,喜欢DIY电脑的发烧友们也越来越多. 安装系统是DIY最基本的要求,很容易做到: 那么如果要求用U盘装系统呢,你可能会说简单,直接下载个老毛桃或是 ...

  6. C#保留2位小数几种场景总结

    场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.25.可不可以刚好保留到最后一位不是 ...

  7. Yii2设计模式——注册树模式

    应用举例 在Yii.php中: <?php class ServiceLocator extends Component { //保存实例化的对象,每个对象都是单例,且有唯一string类型的I ...

  8. H5与C3权威指南笔记--box-shadow

    box-shadow 用于给盒子添加阴影效果.IE9+ 举个栗子:box-shadow: inset 5px 5px 5px red; inset可选,该值会让阴影出现在盒子内部. 第一个5px是阴影 ...

  9. jsp内置对象-pageContext对象

    1.概念:pageContext对象能够获取JSP页面中的request.response.session.application等其他内置对象.pageContext对象的创建和初始化由容器完成,可 ...

  10. Web前端-CSS必备知识点

    Web前端-CSS必备知识点 css基本内容,类选择符,id选择符,伪类,伪元素,结构,继承,特殊性,层叠,元素分类,颜色,长度,url,文本,字体,边框,块级元素,浮动元素,内联元素,定位. 链接: ...