最近,我在開發一個涉及大數據處理的 php 項目時,遇到了一個棘手的問題:如何高效地在 PHP 中進行 Avro 格式的數據序列化和反序列化。特別是在使用 Confluent Platform 時,如何確保數據在不同服務間的兼容性成為了一個挑戰。為了解決這個問題,我嘗試了多種方法,最終發現了 mateusjunges/avro-serde-php 這個庫,它徹底解決了我的困擾。
mateusjunges/avro-serde-php 是一個專門為 PHP 設計的 Avro 序列化和反序列化庫,它與 Confluent Schema Registry 完美集成,確保了數據的兼容性和高效處理。使用 composer 安裝這個庫非常簡單:
composer require 'mateusjunges/avro-serde-php:^1.6'
首先,我們需要創建一個緩存的 Schema Registry 客戶端,以避免每次序列化或反序列化時都進行 http 請求:
use FlixTechSchemaRegistryApiRegistryCacheAvroObjectCacheAdapter; use FlixTechSchemaRegistryApiRegistryCachedRegistry; use FlixTechSchemaRegistryApiRegistryPromisingRegistry; use GuzzleHttpClient; $schemaRegistryClient = new CachedRegistry( new PromisingRegistry( new Client(['base_uri' => 'registry.example.com']) ), new AvroObjectCacheAdapter() );
接下來,我們構建一個 RecordSerializer 實例,它是與這個庫交互的主要方式:
use FlixTechAvroSerializerObjectsRecordSerializer; $recordSerializer = new RecordSerializer( $schemaRegistry, [ RecordSerializer::OPTION_REGISTER_MISSING_SCHEMAS => false, RecordSerializer::OPTION_REGISTER_MISSING_SUBJECTS => false, ] );
使用 RecordSerializer 進行編碼非常簡單:
立即學習“PHP免費學習筆記(深入)”;
$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'
此外,mateusjunges/avro-serde-php 還提供了多種 Schema Resolver 來管理 Avro 模式。例如,FileResolver 可以從文件中加載模式,而 CallableResolver 則提供了更高的靈活性。此外,還可以使用 ChainResolver 來組合多個解析器,以滿足不同需求。
對于 symfony 用戶,這個庫還提供了與 Symfony Serializer 組件的集成,使得在 Symfony 項目中使用 Avro 序列化變得更加簡單:
use FlixTechAvroSerializerIntegrationsSymfonySerializerAvroSerDeEncoder; use FlixTechAvroSerializerObjectsDefaultRecordSerializerFactory; use SymfonyComponentSerializerNormalizerGetSetMethodNormalizer; use SymfonyComponentSerializerSerializer; $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 模式變得更加直觀和高效。
使用 mateusjunges/avro-serde-php 庫,我不僅解決了 Avro 序列化和反序列化的難題,還極大地提升了項目的開發效率和數據處理的兼容性。如果你也在 PHP 項目中面臨類似的挑戰,不妨嘗試一下這個庫。