{"id":243,"date":"2025-10-18T05:55:00","date_gmt":"2025-10-18T05:55:00","guid":{"rendered":"https:\/\/harshad-sonawane.com\/blog\/?p=243"},"modified":"2025-08-05T06:19:30","modified_gmt":"2025-08-05T06:19:30","slug":"schema-evolution-in-microservices-communication","status":"publish","type":"post","link":"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/","title":{"rendered":"How to Handle Schema Evolution in Microservices Communication"},"content":{"rendered":"\n<p>In <a href=\"https:\/\/harshad-sonawane.com\/blog\/reduce-cloud-costs-java-applications\/\">microservices<\/a> architecture, services often evolve independently. Over time, this leads to <strong>changes in data contracts<\/strong>\u2014commonly referred to as <strong>schema evolution<\/strong>. If not handled carefully, even minor schema changes can break inter-service communication, leading to data loss, runtime errors, or system outages.<\/p>\n\n\n\n<p>This article explores how to safely manage schema evolution across microservices, ensuring backward and forward compatibility using well-established patterns and tools.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Understanding the Problem<\/h2>\n\n\n\n<p>Let\u2019s say <strong>Service A<\/strong> sends a JSON payload to <strong>Service B<\/strong>. At version 1, the payload looks like:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">jsonCopyEdit<code>{\n  \"name\": \"Alice\",\n  \"email\": \"alice@example.com\"\n}\n<\/code><\/pre>\n\n\n\n<p>In version 2, Service A adds a new field:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">jsonCopyEdit<code>{\n  \"name\": \"Alice\",\n  \"email\": \"alice@example.com\",\n  \"birthday\": \"1990-01-01\"\n}\n<\/code><\/pre>\n\n\n\n<p>If Service B isn&#8217;t designed to ignore unknown fields or parse optional ones, this evolution can cause failures.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Core Challenges in Schema Evolution<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Tight Coupling<\/strong>: Changes in one service force changes in others.<\/li>\n\n\n\n<li><strong>Data Loss<\/strong>: Older clients may not understand or persist new fields.<\/li>\n\n\n\n<li><strong>Deserialization Failures<\/strong>: Strict deserializers may reject unknown fields.<\/li>\n\n\n\n<li><strong>Versioning Confusion<\/strong>: Difficult to know which version is in use where.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Best Practices for Schema Evolution<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. Design for Forward and Backward Compatibility<\/h3>\n\n\n\n<p>A schema change should neither break existing clients (backward compatible) nor prevent future clients from working with older versions (forward compatible).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Guidelines:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add, but don\u2019t remove or rename fields.<\/li>\n\n\n\n<li>Never change the data type of an existing field.<\/li>\n\n\n\n<li>Mark new fields as optional.<\/li>\n<\/ul>\n\n\n\n<p><strong>Reference<\/strong>: <a>Protocol Buffers Versioning Guide<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2. Use Format-Aware Serializers<\/h3>\n\n\n\n<p>Leverage formats that support schema evolution inherently.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Common Choices:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Protocol Buffers (Protobuf)<\/strong> \u2013 Compact, type-safe, and evolution-aware.<\/li>\n\n\n\n<li><strong>Apache Avro<\/strong> \u2013 Popular with <a href=\"https:\/\/harshad-sonawane.com\/blog\/building-real-time-applications-java-architecture-frameworks\/\">Kafka<\/a>, schema registry support.<\/li>\n\n\n\n<li><strong>JSON with tolerant deserializers<\/strong> \u2013 Use libraries like Jackson with <code>@JsonIgnoreProperties(ignoreUnknown = true)<\/code>.<\/li>\n<\/ul>\n\n\n\n<p>Example (Jackson):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">javaCopyEdit<code>@JsonIgnoreProperties(ignoreUnknown = true)\npublic class User {\n    private String name;\n    private String email;\n}\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3. Implement Schema Versioning<\/h3>\n\n\n\n<p>Add a <code>version<\/code> field to payloads, headers, or topic names.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">jsonCopyEdit<code>{\n  \"version\": \"v2\",\n  \"name\": \"Alice\",\n  \"email\": \"alice@example.com\",\n  \"birthday\": \"1990-01-01\"\n}\n<\/code><\/pre>\n\n\n\n<p>Then route based on version or use version-aware consumers.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4. Use API Gateways for Transformation<\/h3>\n\n\n\n<p>If your consumers expect old payloads, an <strong>API gateway<\/strong> can mediate between versions, transforming requests or responses on-the-fly.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use tools like <strong>Kong<\/strong>, <strong>Spring Cloud Gateway<\/strong>, or <strong><a href=\"https:\/\/harshad-sonawane.com\/blog\/choosing-right-cloud-database-rds-dynamodb-aurora-documentdb\/\">AWS<\/a> API Gateway<\/strong> to handle transformations.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">5. Schema Registry in Event-Driven Systems<\/h3>\n\n\n\n<p>For Kafka or other message queues, use a <strong>schema registry<\/strong> (like <strong>Confluent Schema Registry<\/strong>) to manage compatibility checks during publishing.<\/p>\n\n\n\n<p>This helps you enforce:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>BACKWARD<\/strong> compatibility: New schema must read old data.<\/li>\n\n\n\n<li><strong>FORWARD<\/strong> compatibility: Old schema must read new data.<\/li>\n\n\n\n<li><strong>FULL<\/strong> compatibility: Both directions must work.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">6. Contract Testing<\/h3>\n\n\n\n<p>Use tools like:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Pact<\/strong>: For consumer-driven contract testing.<\/li>\n\n\n\n<li><strong>Spring Cloud Contract<\/strong>: For generating test stubs and ensuring API compatibility.<\/li>\n<\/ul>\n\n\n\n<p>These tools ensure that schema expectations are synchronized between producers and consumers.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">7. Deprecate Gracefully<\/h3>\n\n\n\n<p>Mark old fields as deprecated in documentation or with annotations (for Avro or Protobuf). Give consumers time to migrate before removal.<\/p>\n\n\n\n<p>Example in Protobuf:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">protoCopyEdit<code>string legacy_field = 4 [deprecated = true];\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Real-World Use Case: Schema Evolution with Kafka and Avro<\/h2>\n\n\n\n<p>In a distributed e-commerce system:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Order Service publishes order events in Avro.<\/li>\n\n\n\n<li>Notification Service consumes these events.<\/li>\n<\/ul>\n\n\n\n<p>When a new field <code>deliveryEstimate<\/code> is added:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The schema registry ensures the new schema is backward compatible.<\/li>\n\n\n\n<li>The consumer is designed to ignore unknown fields.<\/li>\n\n\n\n<li>After testing and rollout, the Notification Service is upgraded to use the new field.<\/li>\n<\/ul>\n\n\n\n<p>No downtime, no broken services.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<p>Schema evolution is a reality in any scalable system. But with proactive design, modern serialization formats, and rigorous contract testing, it&#8217;s entirely manageable.<\/p>\n\n\n\n<p>By treating schemas as <strong>contracts<\/strong> and embracing <strong>version-aware design<\/strong>, teams can evolve independently and deliver features without fear of breaking integrations.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"o-typing-delay-100ms ticss-27f7e3e9\"><o-anim-typing>&lt;> <strong>&#8220;Happy developing, one line at a time!&#8221;<\/strong> &lt;\/><\/o-anim-typing><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In microservices architecture, services often evolve independently. Over time, this leads to changes in data contracts\u2014commonly referred to as schema evolution. If not handled carefully, even minor schema changes can break inter-service communication, leading to data loss, runtime errors, or system outages. This article explores how to safely manage schema [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":244,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"footnotes":"","jetpack_publicize_message":"In a world of distributed systems and independent deployments, schema evolution can break your microservices if not handled with care.\n\nHere's a complete guide on:\n\nDesigning forward\/backward compatible schemas\n\nProtobuf, Avro, and JSON strategies\n\nVersioning, contract testing, and API transformation\n\nReal-world practices that scale\n\n#Microservices #SchemaEvolution #Kafka #Protobuf #APIDesign #BackendEngineering #CloudNative #SoftwareArchitecture","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2}},"categories":[113],"tags":[250,251,249,252,9,247,248],"class_list":["post-243","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java-spring-boot-aws-microservices","tag-avro","tag-contract-testing","tag-json","tag-kafka","tag-microservices","tag-protobuf","tag-schema-evolution"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Handle Schema Evolution in Microservices Communication - &lt;&gt;HARSHAD&#039;s Dev Diary&lt;\/&gt;<\/title>\n<meta name=\"description\" content=\"Learn how to handle schema evolution in microservices communication with backward compatibility, versioning, Protobuf, Avro, and best practices for resilient APIs.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Handle Schema Evolution in Microservices Communication - &lt;&gt;HARSHAD&#039;s Dev Diary&lt;\/&gt;\" \/>\n<meta property=\"og:description\" content=\"Learn how to handle schema evolution in microservices communication with backward compatibility, versioning, Protobuf, Avro, and best practices for resilient APIs.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/\" \/>\n<meta property=\"og:site_name\" content=\"&lt;&gt;HARSHAD&#039;s Dev Diary&lt;\/&gt;\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-18T05:55:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2025\/07\/ChatGPT-Image-Jul-13-2025-09_27_04-PM-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1075\" \/>\n\t<meta property=\"og:image:height\" content=\"716\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"HS\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"HS\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/schema-evolution-in-microservices-communication\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/schema-evolution-in-microservices-communication\\\/\"},\"author\":{\"name\":\"HS\",\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/#\\\/schema\\\/person\\\/d82781218ba30c34fa81b49e8393681e\"},\"headline\":\"How to Handle Schema Evolution in Microservices Communication\",\"datePublished\":\"2025-10-18T05:55:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/schema-evolution-in-microservices-communication\\\/\"},\"wordCount\":546,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/#\\\/schema\\\/person\\\/d82781218ba30c34fa81b49e8393681e\"},\"image\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/schema-evolution-in-microservices-communication\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/ChatGPT-Image-Jul-13-2025-09_27_04-PM-1.png\",\"keywords\":[\"Avro\",\"Contract Testing\",\"JSON\",\"Kafka\",\"Microservices\",\"Protobuf\",\"Schema Evolution\"],\"articleSection\":[\"Java, Spring Boot, AWS, Microservices\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/schema-evolution-in-microservices-communication\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/schema-evolution-in-microservices-communication\\\/\",\"url\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/schema-evolution-in-microservices-communication\\\/\",\"name\":\"How to Handle Schema Evolution in Microservices Communication - &lt;&gt;HARSHAD&#039;s Dev Diary&lt;\\\/&gt;\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/schema-evolution-in-microservices-communication\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/schema-evolution-in-microservices-communication\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/ChatGPT-Image-Jul-13-2025-09_27_04-PM-1.png\",\"datePublished\":\"2025-10-18T05:55:00+00:00\",\"description\":\"Learn how to handle schema evolution in microservices communication with backward compatibility, versioning, Protobuf, Avro, and best practices for resilient APIs.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/schema-evolution-in-microservices-communication\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/schema-evolution-in-microservices-communication\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/schema-evolution-in-microservices-communication\\\/#primaryimage\",\"url\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/ChatGPT-Image-Jul-13-2025-09_27_04-PM-1.png\",\"contentUrl\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/ChatGPT-Image-Jul-13-2025-09_27_04-PM-1.png\",\"width\":1075,\"height\":716,\"caption\":\"How to Handle Schema Evolution in Microservices Communication\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/schema-evolution-in-microservices-communication\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Handle Schema Evolution in Microservices Communication\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/\",\"name\":\"Harshad's Dev Diary\",\"description\":\"HARSHAD&#039;s Dev Diary\",\"publisher\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/#\\\/schema\\\/person\\\/d82781218ba30c34fa81b49e8393681e\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/#\\\/schema\\\/person\\\/d82781218ba30c34fa81b49e8393681e\",\"name\":\"HS\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/about.jpg\",\"url\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/about.jpg\",\"contentUrl\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/about.jpg\",\"width\":400,\"height\":400,\"caption\":\"HS\"},\"logo\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/about.jpg\"},\"sameAs\":[\"https:\\\/\\\/harshad-sonawane.com\\\/blog\"],\"url\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/author\\\/admin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Handle Schema Evolution in Microservices Communication - &lt;&gt;HARSHAD&#039;s Dev Diary&lt;\/&gt;","description":"Learn how to handle schema evolution in microservices communication with backward compatibility, versioning, Protobuf, Avro, and best practices for resilient APIs.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/","og_locale":"en_US","og_type":"article","og_title":"How to Handle Schema Evolution in Microservices Communication - &lt;&gt;HARSHAD&#039;s Dev Diary&lt;\/&gt;","og_description":"Learn how to handle schema evolution in microservices communication with backward compatibility, versioning, Protobuf, Avro, and best practices for resilient APIs.","og_url":"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/","og_site_name":"&lt;&gt;HARSHAD&#039;s Dev Diary&lt;\/&gt;","article_published_time":"2025-10-18T05:55:00+00:00","og_image":[{"width":1075,"height":716,"url":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2025\/07\/ChatGPT-Image-Jul-13-2025-09_27_04-PM-1.png","type":"image\/png"}],"author":"HS","twitter_card":"summary_large_image","twitter_misc":{"Written by":"HS","Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/#article","isPartOf":{"@id":"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/"},"author":{"name":"HS","@id":"https:\/\/harshad-sonawane.com\/blog\/#\/schema\/person\/d82781218ba30c34fa81b49e8393681e"},"headline":"How to Handle Schema Evolution in Microservices Communication","datePublished":"2025-10-18T05:55:00+00:00","mainEntityOfPage":{"@id":"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/"},"wordCount":546,"commentCount":0,"publisher":{"@id":"https:\/\/harshad-sonawane.com\/blog\/#\/schema\/person\/d82781218ba30c34fa81b49e8393681e"},"image":{"@id":"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/#primaryimage"},"thumbnailUrl":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2025\/07\/ChatGPT-Image-Jul-13-2025-09_27_04-PM-1.png","keywords":["Avro","Contract Testing","JSON","Kafka","Microservices","Protobuf","Schema Evolution"],"articleSection":["Java, Spring Boot, AWS, Microservices"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/","url":"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/","name":"How to Handle Schema Evolution in Microservices Communication - &lt;&gt;HARSHAD&#039;s Dev Diary&lt;\/&gt;","isPartOf":{"@id":"https:\/\/harshad-sonawane.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/#primaryimage"},"image":{"@id":"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/#primaryimage"},"thumbnailUrl":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2025\/07\/ChatGPT-Image-Jul-13-2025-09_27_04-PM-1.png","datePublished":"2025-10-18T05:55:00+00:00","description":"Learn how to handle schema evolution in microservices communication with backward compatibility, versioning, Protobuf, Avro, and best practices for resilient APIs.","breadcrumb":{"@id":"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/#primaryimage","url":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2025\/07\/ChatGPT-Image-Jul-13-2025-09_27_04-PM-1.png","contentUrl":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2025\/07\/ChatGPT-Image-Jul-13-2025-09_27_04-PM-1.png","width":1075,"height":716,"caption":"How to Handle Schema Evolution in Microservices Communication"},{"@type":"BreadcrumbList","@id":"https:\/\/harshad-sonawane.com\/blog\/schema-evolution-in-microservices-communication\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/harshad-sonawane.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Handle Schema Evolution in Microservices Communication"}]},{"@type":"WebSite","@id":"https:\/\/harshad-sonawane.com\/blog\/#website","url":"https:\/\/harshad-sonawane.com\/blog\/","name":"Harshad's Dev Diary","description":"HARSHAD&#039;s Dev Diary","publisher":{"@id":"https:\/\/harshad-sonawane.com\/blog\/#\/schema\/person\/d82781218ba30c34fa81b49e8393681e"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/harshad-sonawane.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/harshad-sonawane.com\/blog\/#\/schema\/person\/d82781218ba30c34fa81b49e8393681e","name":"HS","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2025\/02\/about.jpg","url":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2025\/02\/about.jpg","contentUrl":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2025\/02\/about.jpg","width":400,"height":400,"caption":"HS"},"logo":{"@id":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2025\/02\/about.jpg"},"sameAs":["https:\/\/harshad-sonawane.com\/blog"],"url":"https:\/\/harshad-sonawane.com\/blog\/author\/admin\/"}]}},"jetpack_publicize_connections":[],"_links":{"self":[{"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/posts\/243","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/comments?post=243"}],"version-history":[{"count":1,"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/posts\/243\/revisions"}],"predecessor-version":[{"id":245,"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/posts\/243\/revisions\/245"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/media\/244"}],"wp:attachment":[{"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/media?parent=243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/categories?post=243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/tags?post=243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}