Kafka简单实践

news2024/11/19 12:02:04

使用 Apache Kafka 和 Swoole 的 PHP 实践案例

一、引言

Apache Kafka 是一个开源的分布式流处理平台,能够处理大量的实时数据流。由于其高吞吐量、可扩展性和持久性,Kafka 成为构建微服务架构和大数据处理的重要工具。Swoole 是一个高性能的异步网络通信框架,允许 PHP 以异步方式进行高并发的处理。结合这两者,我们可以构建一个高效的消息传递系统。本文将介绍 Kafka 的基本概念,并通过一个使用 PHP 和 Swoole 的实际案例来演示如何使用 Kafka 进行消息处理。

二、Kafka 的基本概念

2.1 什么是 Kafka

Kafka 是一个分布式的流处理平台,设计用来处理实时数据流。其核心组件如下:

  • 主题(Topic):Kafka 中的数据流分类,消费者可以通过订阅主题来接收消息。
  • 生产者(Producer):向主题发布消息的客户端。
  • 消费者(Consumer):从主题读取消息的客户端。
  • 消费者组(Consumer Group):多个消费者可以组成一个消费者组,共享读取同一主题的消息。
  • 代理(Broker):Kafka 集群中的服务器,负责存储消息和处理请求。

2.2 Kafka 的特点

  • 高吞吐量:Kafka 能够每秒处理数百万条消息,适合大规模数据处理。
  • 持久性:所有消息都被持久化到磁盘,可以通过设置保留策略来管理。
  • 可扩展性:Kafka 可以横向扩展,增加更多代理以提高处理能力。
  • 容错性:Kafka 具有内置的故障转移能力,保证消息传递的可靠性。

三、Swoole 的基本概念

3.1 什么是 Swoole

Swoole 是一个高性能的 PHP 扩展,提供了异步、协程和多线程等功能,使 PHP 能够处理高并发请求。它可以用于构建高性能的 Web 服务器、API 服务器及微服务。

3.2 Swoole 的特点

  • 高性能:能够处理数万并发连接,适合高并发应用。
  • 异步非阻塞:支持异步 IO,能够提升应用的响应速度。
  • 协程支持:提供协程机制,使得异步编程更加简单直观。

四、使用 Kafka 和 Swoole 的 PHP 实践案例

4.1 环境准备

在本示例中,我们将创建一个 Kafka 生产者和消费者,并使用 Swoole 来处理高并发请求。

1. 安装 Kafka

确保在你的环境中已经安装并配置好 Kafka 和 ZooKeeper。可以参考 Kafka 官方文档进行安装。

2. 安装 Swoole

在你的 PHP 环境中安装 Swoole 扩展。可以使用 PECL 进行安装:

pecl install swoole
3. 安装 php-rdkafka

同样需要安装 php-rdkafka 扩展,以便与 Kafka 进行交互:

sudo apt-get install librdkafka-dev
pecl install rdkafka

php.ini 文件中添加以下行启用扩展:

extension=rdkafka.so

重启你的 Web 服务器。

4.2 创建 Kafka 生产者和消费者

4.2.1 生产者示例
<?php
// Producer.php
use RdKafka\Producer;
use RdKafka\Topic;

require 'vendor/autoload.php';

$conf = new RdKafka\Conf();
$conf->set('metadata.broker.list', 'localhost:9092'); // 设置 Kafka 代理地址

$producer = new Producer($conf);
$topic = 'test_topic'; // 主题名称

// Swoole HTTP 服务器
$http = new Swoole\Http\Server("127.0.0.1", 9501);

$http->on("request", function ($request, $response) use ($producer, $topic) {
    $message = isset($request->post['message']) ? $request->post['message'] : "Hello Kafka!";
    $producer->newTopic($topic)->produce(RD_KAFKA_PARTITION_UA, 0, $message); // 发送消息
    $producer->flush(10000);

    $response->header("Content-Type", "text/plain");
    $response->end("Message sent: " . $message);
});

// 启动服务器
$http->start();
?>
4.2.2 消费者示例
<?php
// Consumer.php
use RdKafka\Consumer;
use RdKafka\ConsumerTopic;

require 'vendor/autoload.php';

$conf = new RdKafka\Conf();
$conf->set('metadata.broker.list', 'localhost:9092'); // 设置 Kafka 代理地址
$conf->set('group.id', 'test_group'); // 设置消费者组

$consumer = new Consumer($conf);
$consumer->addBrokers("localhost:9092");

$topic = $consumer->newTopic("test_topic"); // 创建或获取主题
$topic->consumeStart(0, RD_KAFKA_OFFSET_END); // 从结束位置开始消费

// Swoole 协程
Co\run(function () use ($topic) {
    while (true) {
        $message = $topic->consume(0, 1000); // 消费消息,超时为1000ms

        if ($message->err) {
            if ($message->err === RD_KAFKA_RESP_ERR__TIMED_OUT) {
                continue; // 超时,继续循环
            } else {
                echo "Error: " . $message->errstr() . "\n"; // 输出错误信息
                break; // 出现错误,退出循环
            }
        }

        echo "Received message: " . $message->payload . "\n"; // 输出消息内容
    }
});
?>

4.3 启动示例

  1. 启动 ZooKeeper 和 Kafka 代理:
# 启动 ZooKeeper
bin/zookeeper-server-start.sh config/zookeeper.properties

# 启动 Kafka 代理
bin/kafka-server-start.sh config/server.properties
  1. 在另一个终端中,运行消费者脚本:
php Consumer.php
  1. 在另一个终端中,运行生产者脚本:
php Producer.php
  1. 使用 HTTP 客户端(如 Postman 或 curl)向生产者发送 POST 请求:
curl -X POST http://127.0.0.1:9501 -d "message=Hello from Swoole!"

消费者将在终端中接收到消息。

五、总结

通过结合 Apache Kafka 和 Swoole,我们能够构建一个高效的消息传递系统。Kafka 提供了可靠的消息队列,而 Swoole 则为 PHP 提供了高并发处理能力。本文中的示例展示了如何使用这两者创建简单的生产者和消费者。随着项目需求的增加,我们可以进一步扩展该系统,例如进行消息处理、增加错误处理逻辑、实现数据持久化等。

Kafka 和 Swoole 的组合使得开发实时数据处理和高性能应用变得更加容易,是现代应用架构中不可或缺的一部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2243372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 与腾讯云 MySQL 监听 Binlog 数据变化,并使用 UI 展示页面效果

引言 在现代的分布式系统和微服务架构中&#xff0c;数据同步和变更监控是保证系统一致性和实时性的核心问题之一。MySQL 数据库的 binlog&#xff08;二进制日志&#xff09;功能能够记录所有对数据库的修改操作&#xff0c;如插入&#xff08;INSERT&#xff09;、更新&…

Spring Boot汽车资讯:科技与速度的新纪元

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了汽车资讯网站的开发全过程。通过分析汽车资讯网站管理的不足&#xff0c;创建了一个计算机管理汽车资讯网站的方案。文章介绍了汽车资讯网站的系统分析部分&…

thinkphp6模板调用URL方法生成的链接异常

var uul params.url ;console.log(params.url);console.log("{:Url(UserLog/index)}");console.log("{:Url("uul")}"); 生成的链接地址 UserLog/index /jjg/index.php/Home/UserLog/index.html /jjg/index.php/Home/Index/UserLog/index.html…

NodeJS 百度智能云文本转语音(实测)

现在文本转语音的技术已经非常完善了&#xff0c;尽管网络上有许多免费的工具&#xff0c;还是测试了专业的服务&#xff0c;选择了百度的TTS服务。 于是&#xff0c;在百度智能云注册和开通了文本转语音的服务&#xff0c;尝试使用NodeJS 实现文本转语音服务。但是百度的文档实…

UML 类图讲解

UML 类图符号含义 在 UML 类图中&#xff0c;每个符号都有其特定的含义。以下是常见符号的解释&#xff1a; : Public&#xff08;公共访问权限&#xff09;-: Private&#xff08;私有访问权限&#xff09;#: Protected&#xff08;受保护访问权限&#xff09;~: Package&…

【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本

GRAPH ATTENTION NETWORKS 代码详解 前言0.引言1. 环境配置2. 代码的运行2.1 报错处理2.2 运行结果展示 3.总结 前言 在前文中&#xff0c;我们已经深入探讨了图卷积神经网络和图注意力网络的理论基础。还没看的同学点这里补习下。接下来&#xff0c;将开启一个新的阶段&#…

远程控制步骤

当远在千里之外的朋友想求助你帮他找到他电脑上的文件、或者是给他安装软件时。但是你给他说了他又找不到&#xff0c;那么这时你就可以通过控制对方的电脑去做一系列的操作。 如何远程控制对方的电脑非常关键。 方法一&#xff08;Windows自带远程桌面功能&#xff09;&#…

C指针之舞——指针探秘之旅

❤博客主页&#xff1a;折枝寄北-CSDN博客 ❤专栏内容&#xff1a;C语言学习专栏https://blog.csdn.net/2303_80170533/category_12794764.html?spm1001.2014.3001.5482 指针基础学习 在之前的博客文章中&#xff0c;简单总结了指针的基础概念 我们知道了指针的概念&#xf…

前端 JS 浅拷贝与深拷贝

目录 一、问题引出 二、浅拷贝 1、通过解构重构实现浅拷贝 三、深拷贝 1、自定义实现深拷贝 2、JSON实现深拷贝 四、总结 一、问题引出 基础类型的数据存放&#xff1a; let a 100let b aconsole.log("a:" a, "b:" b)a 50console.log("a…

72项!湖北省2024年度第二批省级科技计划项目拟立项项目公示!

本期精选 SCI&EI ●IEEE 1区TOP 计算机类&#xff08;含CCF&#xff09;&#xff1b; ●EI快刊&#xff1a;最快1周录用&#xff01; 知网(CNKI)、谷歌学术期刊 ●7天录用-检索&#xff08;100%录用&#xff09;&#xff0c;1周上线&#xff1b; 免费稿件评估 免费匹配…

uniapp微信小程序转发跳转指定页面

onShareAppMessage 是微信小程序中的一个重要函数&#xff0c;用于自定义转发内容。当用户点击右上角的菜单按钮&#xff0c;并选择“转发”时&#xff0c;会触发这个函数。开发者可以在这个函数中返回一个对象&#xff0c;用于定义分享卡片的标题、图片、路径等信息。 使用场…

[N1CTF 2018]eating_cms

打开题目 只有个登录框&#xff0c;其他什么都没有&#xff0c;尝试了一下弱口令&#xff0c;没能成功 尝试访问一下register.php&#xff0c;看看能不能注册个账号 注册页面&#xff0c;随便注册个账号登陆一下 url中感觉是个注入点&#xff0c;尝试使用file伪协议读取一下us…

PMP–一、二、三模、冲刺–分类–5.范围管理–技巧–引导

文章目录 技巧一模5.范围管理--3.定义范围--工具与技术--引导--在研讨会和座谈会中使用引导技能来协调具有不同期望或不同专业知识的关键干系人&#xff0c;使他们就项目可交付成果以及项目和产品边界达成跨职能的共识。引导&#xff1a;题干关键词 “需求不同、需求差异、需求…

C语言-字符串指针及多变的访问方式

1、字符串指针 示例;输出字符串数组 1. #include <stdio.h> 2. #include <string.h> 3. 4. int main(){ 5. char str[] "<http://baidu.com>"; 6. int len strlen(str), i; 7. //直接输出字符串 8. printf("%s\\n", str); 9. //每次…

Linux之vim模式下全选命令

在Linux系统中&#xff0c;使用Vim编辑器进行全选操作可以通过以下几种方式实现&#xff1a; 1.使用键盘快捷键 按下 ”ggVG”&#xff08;先按下”g”&#xff0c;再按下”g”&#xff0c;再按下”V”&#xff0c;最后按下”G”&#xff09;可以全选当前文件内容。其中 ”g…

解决虚拟机未被自动分配ip

文章目录 1. 背景2. 解决步骤 1. 背景 从vulnhub下载的靶场文件&#xff0c;网络适配器模式设置为nat模式之后&#xff0c;启动虚拟机之后发现没有成功分配动态ip。推测是虚拟机分配的网卡名称和原先靶机作者设置网络配置文件 网络接口名称不一致导致。 2. 解决步骤 解决办法就…

【数据结构与算法】排序

文章目录 排序1.基本概念2.分类2.存储结构 一.插入排序1.1直接插入排序1.2折半插入排序1.3希尔排序 二.选择排序2.1简单选择排序2.2堆排序 三.交换排序3.1冒泡排序3.2快速排序 四.归并排序五.基数排序**总结** 排序 1.基本概念 排序&#xff08;sorting&#xff09;又称分类&…

5. ARM_指令集

概述 分类 汇编中的符号&#xff1a; 指令&#xff1a;能够编译生成一条32位机器码&#xff0c;并且能被处理器识别和执行伪指令&#xff1a;本身不是指令&#xff0c;编译器可以将其替换成若干条指令伪操作&#xff1a;不会生成指令&#xff0c;只是在编译阶段告诉编译器怎…

WPF MVVM框架

一、MVVM简介 MVC Model View Control MVP MVVM即Model-View-ViewModel&#xff0c;MVVM模式与MVP&#xff08;Model-View-Presenter&#xff09;模式相似&#xff0c;主要目的是分离视图&#xff08;View&#xff09;和模型&#xff08;Model&#xff09;&#xff0c;具有低…

Java-03 深入浅出 MyBatis - 快速入门(无 Spring) 增删改查 核心配置讲解 XML 与 注解映射

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…