如何解决PHP与Avro序列化兼容性问题?使用flix-tech/avro-serde-php库可以!

发布时间 - 2025-04-21 00:00:00    点击率:

在处理一个需要与 Confluent 平台集成的大型项目时,我遇到了一个棘手的问题:如何确保在 Avro 序列化格式下,模式演变不会影响下游消费者。Confluent 开发的 Schema Registry 能够通过验证模式演变来解决这个问题,但遗憾的是,Confluent 并没有为 PHP 提供官方的 Avro SerDe 包。经过一番研究,我找到了 flix-tech/avro-serde-php 这个库,它不仅实现了 Confluent 的线格式,还集成了 FlixTech 的 Schema Registry 客户端,彻底解决了我的问题。

可以通过以下地址学习 composer:学习地址

使用 Composer 安装 flix-tech/avro-serde-php 非常简单,只需运行以下命令:

composer require 'flix-tech/avro-serde-php:^2.2'

接下来,我将介绍如何使用这个库来解决 Avro 序列化和反序列化的问题。

首先,需要创建一个缓存的 Schema Registry 客户端,以避免每次序列化或反序列化消息时都进行 HTTP 请求:

use FlixTech\SchemaRegistryApi\Registry\Cache\AvroObjectCacheAdapter;
use FlixTech\SchemaRegistryApi\Registry\CachedRegistry;
use FlixTech\SchemaRegistryApi\Registry\PromisingRegistry;
use GuzzleHttp\Client;

$schemaRegistryClient = new CachedRegistry(
    new PromisingRegistry(
        new Client(['base_uri' => 'registry.example.com'])
    ),
    new AvroObjectCacheAdapter()
);

然后,构建 RecordSerializer 实例,这是与库交互的主要方式,它提供了 encodeRecorddecodeMessage 方法来执行序列化和反序列化操作:

use FlixTech\AvroSerializer\Objects\RecordSerializer;

$recordSerializer = new RecordSerializer(
    $schemaRegistry,
    [
        RecordSerializer::OPTION_REGISTER_MISSING_SCHEMAS => false,
        RecordSerializer::OPTION_REGISTER_MISSING_SUBJECTS => false,
    ]
);

使用 RecordSerializer 可以轻松地编码和解码消息。例如,编码记录:

$subject = 'my-topic-value';
$avroSchema = AvroSchema::parse('{"type": "string"}');
$record = 'Test message';

$encodedBinaryAvro = $recordSerializer->encodeRecord($subject, $avroSchema, $record);
// 发送到网络...

解码消息:

$record = $recordSerializer->decodeMessage($encodedBinaryAvro);

echo $record; // 'Test message'

此外,flix-tech/avro-serde-php 还提供了多种 Schema Resolver 来管理 Avro 模式。例如,FileResolver 可以从文件中加载模式,CallableResolver 可以使用自定义函数来获取模式,而 DefinitionInterfaceResolver 则通过实现 HasSchemaDefinitionInterface 接口来解析模式。

如果你使用 Symfony Serializer 组件,这个库还提供了相应的集成:

use FlixTech\AvroSerializer\Integrations\Symfony\Serializer\AvroSerDeEncoder;
use FlixTech\AvroSerializer\Objects\DefaultRecordSerializerFactory;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Serializer;

$recordSerializer = DefaultRecordSerializerFactory::get(
    getenv('SCHEMA_REGISTRY_HOST')
);

$normalizer = new GetSetMethodNormalizer();
$encoder = new AvroSerDeEncoder($recordSerializer);

$symfonySerializer = new Serializer([$normalizer], [$encoder]);

最后,这个库还提供了 Schema Builder 和 Schema Generator 功能,允许你使用 PHP 代码定义和生成 Avro 模式。

使用 flix-tech/avro-serde-php 库解决了我的 Avro 序列化和反序列化问题,使得我的项目能够顺利与 Confluent 平台集成。它的灵活性和强大功能大大提高了开发效率,确保了模式演变的兼容性。我强烈推荐任何需要在 PHP 中处理 Avro 序列化的开发者使用这个库。


# composer  # php  # symfony  # 接口  # http  # 序列化  # 使用这个  # 的是  # 客户端  # 这是  # 解决了  # 如果你  # 只需  # 可以通过  # 自定义 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python3.6正式版新特性预览  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  网站建设要注意的标准 促进网站用户好感度!  Laravel安装步骤详细教程_Laravel环境搭建指南  网站制作报价单模板图片,小松挖机官方网站报价?  JavaScript如何实现类型判断_typeof和instanceof有什么区别  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  微信推文制作网站有哪些,怎么做微信推文,急?  Swift中swift中的switch 语句  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  iOS验证手机号的正则表达式  如何在Ubuntu系统下快速搭建WordPress个人网站?  Java解压缩zip - 解压缩多个文件或文件夹实例  如何挑选优质建站一级代理提升网站排名?  javascript中闭包概念与用法深入理解  详解MySQL数据库的安装与密码配置  javascript日期怎么处理_如何格式化输出  北京企业网站设计制作公司,北京铁路集团官方网站?  使用C语言编写圣诞表白程序  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  如何在IIS管理器中快速创建并配置网站?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  如何安全更换建站之星模板并保留数据?  实例解析angularjs的filter过滤器  香港服务器建站指南:免备案优势与SEO优化技巧全解析  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  如何在腾讯云服务器快速搭建个人网站?  北京的网站制作公司有哪些,哪个视频网站最好?  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Laravel如何生成URL和重定向?(路由助手函数)  如何实现javascript表单验证_正则表达式有哪些实用技巧  PHP正则匹配日期和时间(时间戳转换)的实例代码  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  b2c电商网站制作流程,b2c水平综合的电商平台?  网站制作价目表怎么做,珍爱网婚介费用多少?  如何续费美橙建站之星域名及服务?  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  如何快速生成可下载的建站源码工具?  网站制作企业,网站的banner和导航栏是指什么?