如何解决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 实例,这是与库交互的主要方式,它提供了 encodeRecord 和 decodeMessage 方法来执行序列化和反序列化操作:
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和导航栏是指什么?


ializer\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]);