{"id":17074,"date":"2023-04-27T07:11:17","date_gmt":"2023-04-27T01:41:17","guid":{"rendered":"https:\/\/blogrevamp.cashfree.com\/?p=17074"},"modified":"2023-04-28T15:58:12","modified_gmt":"2023-04-28T10:28:12","slug":"how-we-manage-high-throughput-transactional-events-across-services","status":"publish","type":"post","link":"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/","title":{"rendered":"How We Manage High Throughput Transactional Events Across Services"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_81 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a8f7684c1e31\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #364250;color:#364250\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #364250;color:#364250\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a8f7684c1e31\"  aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/#Motivation\" >Motivation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/#Challenges\" >Challenges<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/#Transactions_in_Distributed_Systems\" >Transactions in Distributed Systems&nbsp;<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/#Probable_Solutions\" >Probable Solutions<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/#2_PC_2_Phase_commit_Transactions\" >2 PC (2 Phase commit) Transactions<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/#Outbox_Pattern\" >Outbox Pattern<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/#CDC_Outbox_Pattern\" >CDC Outbox Pattern&nbsp;<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/#Relayer\" >Relayer<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/#Wins\" >Wins<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/#Whats_Next\" >What&#8217;s Next<\/a><\/li><\/ul><\/nav><\/div>\n\n<h2 class=\"wp-block-heading\" id=\"h-motivation\"><span class=\"ez-toc-section\" id=\"Motivation\"><\/span><strong>Motivation<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">At Cashfree Payments, we move billions of dollars every day and each of these transactions has a journey across hundreds of microservices. These high throughput services communicate with each other using asynchronous communication channels such as SQS and Kafka.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, for every transaction, we need to send webhooks and also perform post-processing of \u201cside effects\u201d, such as computing merchant charges, updating the ledger as well as scheduling a successful transaction for settlement to merchant accounts.<br><br>Asynchronous communication ensures that:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The services are not tightly coupled and can be evolved independently.<\/li>\n\n\n\n<li>It allows us to fail and handle faults gracefully. That is, even if there is an issue with a component that sends webhooks or communications, there is no impact on actual transactions.&nbsp;<\/li>\n\n\n\n<li>It can be retried and if idempotent, it can also be replayed in case of partial downtimes to restore the system to the right state.&nbsp;<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-challenges\"><span class=\"ez-toc-section\" id=\"Challenges\"><\/span><strong>Challenges<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most of the challenges of service communication can be traced back to issues with distributed systems and communication over the network.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" fetchpriority=\"high\" decoding=\"async\" width=\"770\" height=\"505\" data-attachment-id=\"17078\" data-permalink=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/1-10\/\" data-orig-file=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/1.png?fit=6945%2C4552&amp;ssl=1\" data-orig-size=\"6945,4552\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/1.png?fit=770%2C505&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/1.png?resize=770%2C505&#038;ssl=1\" alt=\"\" class=\"wp-image-17078\" srcset=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/1.png?resize=1024%2C671&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/1.png?resize=300%2C197&amp;ssl=1 300w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/1.png?resize=768%2C503&amp;ssl=1 768w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/1.png?resize=1536%2C1007&amp;ssl=1 1536w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/1.png?resize=2048%2C1342&amp;ssl=1 2048w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/1.png?w=2310&amp;ssl=1 2310w\" sizes=\"(max-width: 770px) 100vw, 770px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Transactions_in_Distributed_Systems\"><\/span><strong>Transactions in Distributed Systems&nbsp;<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Transactions, by old school definition, should be ACID compliant (emphasis on Atomic, all or nothing) and this is really difficult to achieve in distributed systems. Lots of moving parts, loosely coupled communication using APIs, and a high probability of failures makes it hard to predict.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" width=\"770\" height=\"380\" data-attachment-id=\"17080\" data-permalink=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/2-5\/\" data-orig-file=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/2.png?fit=1727%2C853&amp;ssl=1\" data-orig-size=\"1727,853\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/2.png?fit=770%2C380&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/2.png?resize=770%2C380&#038;ssl=1\" alt=\"\" class=\"wp-image-17080\" srcset=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/2.png?resize=1024%2C506&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/2.png?resize=300%2C148&amp;ssl=1 300w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/2.png?resize=768%2C379&amp;ssl=1 768w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/2.png?resize=1536%2C759&amp;ssl=1 1536w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/2.png?w=1727&amp;ssl=1 1727w\" sizes=\"(max-width: 770px) 100vw, 770px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In the above example, once service B crashes or the network times out, there is no easy way for A to make the next decision. It\u2019s even harder if the request from the user is supposed to be atomic; for example payments and settlements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To solve this synchronous communication challenge, most teams add a layer of indirection using a queuing solution. While this allows for retries and can provide other benefits provided by typical consumer-producer patterns, it also poses an interesting challenge: how do we ensure database commits and queue publish work as a single atomic transaction. Consider this example: a payment process commits and pushes to a notification queue. What would happen if: a)payment commit fails but notification gets delivered leading to bad user experience or b) payment succeeds but no notification and hence payment gets eventually stuck and seems to be abandoned.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A service must atomically update the database and send messages to a queue in order to avoid data inconsistencies and bugs. The queue should also ensure to maintain the order in which messages are sent; so that the out state of every system is aligned once all messages or events are consumed.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Probable_Solutions\"><\/span><strong>Probable Solutions<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are a handful of options at this point:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_PC_2_Phase_commit_Transactions\"><\/span>2 PC (2 Phase commit) Transactions<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" width=\"770\" height=\"421\" data-attachment-id=\"17083\" data-permalink=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/3-4\/\" data-orig-file=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/3.png?fit=1727%2C945&amp;ssl=1\" data-orig-size=\"1727,945\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"3\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/3.png?fit=770%2C421&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/3.png?resize=770%2C421&#038;ssl=1\" alt=\"\" class=\"wp-image-17083\" srcset=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/3.png?resize=1024%2C560&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/3.png?resize=300%2C164&amp;ssl=1 300w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/3.png?resize=768%2C420&amp;ssl=1 768w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/3.png?resize=1536%2C840&amp;ssl=1 1536w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/3.png?w=1727&amp;ssl=1 1727w\" sizes=\"(max-width: 770px) 100vw, 770px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">From <a href=\"https:\/\/en.wikipedia.org\/wiki\/Two-phase_commit_protocol\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Wikipedia<\/a>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In<a href=\"https:\/\/en.wikipedia.org\/wiki\/Transaction_processing\" target=\"_blank\" rel=\"noreferrer noopener nofollow\"> transaction processing<\/a>,<a href=\"https:\/\/en.wikipedia.org\/wiki\/Database\" target=\"_blank\" rel=\"noreferrer noopener nofollow\"> databases<\/a>, and<a href=\"https:\/\/en.wikipedia.org\/wiki\/Computer_networking\" target=\"_blank\" rel=\"noreferrer noopener nofollow\"> computer networking<\/a>, the <strong>two-phase commit protocol<\/strong> (<strong>2PC<\/strong>) is a type of<a href=\"https:\/\/en.wikipedia.org\/wiki\/Atomic_commit\" target=\"_blank\" rel=\"noreferrer noopener nofollow\"> atomic commitment protocol<\/a> (ACP). It is a<a href=\"https:\/\/en.wikipedia.org\/wiki\/Distributed_algorithm\" target=\"_blank\" rel=\"noreferrer noopener nofollow\"> distributed algorithm<\/a> that coordinates all the processes that participate in a<a href=\"https:\/\/en.wikipedia.org\/wiki\/Distributed_transaction\" target=\"_blank\" rel=\"noreferrer noopener nofollow\"> distributed atomic transaction<\/a> on whether to<a href=\"https:\/\/en.wikipedia.org\/wiki\/Commit_(data_management)\" target=\"_blank\" rel=\"noreferrer noopener nofollow\"> commit<\/a> or abort (roll back) the transaction.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pros:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Very simple to implement for the caller<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cons:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Breaks service level encapsulations as cross-DB coordination is required<\/li>\n\n\n\n<li>Performance issues due to network coordination and locks, especially in our environments where failures are expected and traffic can be unpredictable<\/li>\n\n\n\n<li>Can block and stop the world if the coordinator is down<\/li>\n\n\n\n<li>Deadlocks \ud83d\ude41<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Outbox_Pattern\"><\/span>Outbox Pattern<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Outbox pattern relies on the database itself to handle events and have an external relayer to emit the \u201coutbox\u201d message to the message broker.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this pattern, a service that uses a relational database inserts messages\/events into an <em>outbox<\/em> table as part of the local transaction. A service that uses a NoSQL database appends the messages\/events to the attribute of the record (e.g. document or item) being updated.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CDC or change data capture systems work on connecting to database write-ahead logs and use them for propagating changes using queuing systems such as Kafka. They work on the same principle as database replica, connecting and interpreting each statement log.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Given the highly consistent nature of this data, it&#8217;s mostly used in data engineering for creating warehouses\/lakes, etc. They also present a great way of generating event streams outside the service with high consistency. Using a broker such as Kafka also allows durability, multiple consumers and replayability allowing new consumers\/extensions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"CDC_Outbox_Pattern\"><\/span>CDC Outbox Pattern&nbsp;<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For cross-service coordinations, we have started moving towards using a CDC-backed outbox pattern. We use a relayer layer that also converts event data to a proto message to create a contract between services.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">How it works:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"770\" height=\"380\" data-attachment-id=\"17086\" data-permalink=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/attachment\/4\/\" data-orig-file=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/4.png?fit=1727%2C853&amp;ssl=1\" data-orig-size=\"1727,853\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"4\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/4.png?fit=770%2C380&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/4.png?resize=770%2C380&#038;ssl=1\" alt=\"\" class=\"wp-image-17086\" srcset=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/4.png?resize=1024%2C506&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/4.png?resize=300%2C148&amp;ssl=1 300w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/4.png?resize=768%2C379&amp;ssl=1 768w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/4.png?resize=1536%2C759&amp;ssl=1 1536w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/4.png?w=1727&amp;ssl=1 1727w\" sizes=\"(max-width: 770px) 100vw, 770px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The relay layer takes care of cross-cutting concerns such as monitoring, alerting, dashboards, retries, and de-duplications.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This ensures the consumers receive a highly reliable event stream backed by a proto-based contract, which helps in low overhead communication.&nbsp;&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Consider the below classes for payment and another carrying domain event on change of payment status or something downstream apps might be interested in.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s consider example usage:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#188038\" class=\"has-inline-color\">@Table(name=\u201dpayment\u201d)<br>class Payment {<br>\u00a0\u00a0\u00a0\u00a0private Long id;<br>\u00a0\u00a0\u00a0\u00a0private String externalId;<br>\u00a0\u00a0\u00a0\u00a0private BigDecimal amount;<br>\u00a0\u00a0\u00a0\u00a0\/\/ Skipped rest for brevity<br>}<br><br>\u00a0<br>@Table(name=\u201dpayment_event\u201d)<br>class PaymentEvent {<br>\u00a0\u00a0\u00a0\u00a0private BigDecimal amount;<br>\u00a0\u00a0\u00a0\u00a0private String paymentStatus;\u00a0 \/\/Completed, Pending etc\u00a0<br>\u00a0\u00a0\u00a0private String externalId;<br>}\u00a0<\/mark><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now, we publish domain updates and outgoing events (hence, the outbox) to an events table within the same transaction:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#188038\" class=\"has-inline-color\">@Transactional<br>void process(Payment payment) {<br>\u00a0\u00a0PaymentEvent paymentEvent = new PaymentEvent(payment);<br>\u00a0\u00a0entityManager.persist(payment);<br>\u00a0\u00a0entityManager.persist(paymentEvent);<br>}<\/mark><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On the relayer layer, we would need to configure a simple converter that can understand columns from the above payment events table and convert them into the defined proto objects. The relayer layer adds additional 200 microseconds of latency at the 99th percentile while giving its consumers a defined proto definition and an out-of-box observability and monitoring available on the entire pipeline.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Relayer\"><\/span><strong>Relayer<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In our systems, Relayer is a simple Java [Spring Boot] based service which listens to Kafka topics generated by the CDC provider.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Based on defined configurations, it performs two tasks:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Marshall incoming message on a Kafka topic and decide if this is a table for which conversion is required.&nbsp;<\/li>\n\n\n\n<li>If configuration is present, it converts the incoming JSON blob to a predefined proto contract from configuration and publishes it to the target Kafka topic.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This way, any application which requires an event to be consumed can directly consume from the target topic and can get the Proto from the common git repo for proto events. From a platform perspective, we also generate sources from proto and publish them to Nexus for applications to use directly.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Wins\"><\/span><strong>Wins<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The relayer layer being heavily configuration driven, helps teams focus on business requirements and get onboarded quickly to consume cross-service events. The emphasis on proto as a message exchange format also forces teams to discuss contracts instead of schemaless definitions which can be prone to issues.&nbsp;&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Using Kafka as a communication layer also enables new consumers to be onboarded quickly given both topics and the contracts are public. It has helped us scale up to millions of events per second at peak duration while allowing us to be highly available and eventually consistent in our post-processing systems.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"770\" height=\"314\" data-attachment-id=\"17089\" data-permalink=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/attachment\/5\/\" data-orig-file=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/5.png?fit=1736%2C707&amp;ssl=1\" data-orig-size=\"1736,707\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"5\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/5.png?fit=770%2C314&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/5.png?resize=770%2C314&#038;ssl=1\" alt=\"\" class=\"wp-image-17089\" srcset=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/5.png?resize=1024%2C417&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/5.png?resize=300%2C122&amp;ssl=1 300w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/5.png?resize=768%2C313&amp;ssl=1 768w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/5.png?resize=1536%2C626&amp;ssl=1 1536w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/5.png?w=1736&amp;ssl=1 1736w\" sizes=\"(max-width: 770px) 100vw, 770px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"770\" height=\"314\" data-attachment-id=\"17091\" data-permalink=\"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/attachment\/6\/\" data-orig-file=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/6.png?fit=1736%2C707&amp;ssl=1\" data-orig-size=\"1736,707\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"6\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/6.png?fit=770%2C314&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/6.png?resize=770%2C314&#038;ssl=1\" alt=\"\" class=\"wp-image-17091\" srcset=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/6.png?resize=1024%2C417&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/6.png?resize=300%2C122&amp;ssl=1 300w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/6.png?resize=768%2C313&amp;ssl=1 768w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/6.png?resize=1536%2C626&amp;ssl=1 1536w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/6.png?w=1736&amp;ssl=1 1736w\" sizes=\"(max-width: 770px) 100vw, 770px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Whats_Next\"><\/span><strong>What&#8217;s Next<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">While the system works well for our use cases, we still have some ground to cover in making it easier for teams to add their own layers of deduplication and have visibility around idempotency and retries.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><br>There are also a few interesting use cases around being able to clean up the events table, which we will soon pick up.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you find this interesting, get in touch with us for exciting opportunities for engineers like you!<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.cashfree.com\/careers?utm_source=blog&amp;utm_medium=organic&amp;utm_campaign=high-throughput-blog\/\" target=\"_blank\" rel=\"noreferrer noopener\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"770\" height=\"172\" data-attachment-id=\"13055\" data-permalink=\"https:\/\/blogrevamp.cashfree.com\/reporting-systems-to-ensure-enhanced-customer-satisfaction\/tech-blog\/\" data-orig-file=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2022\/10\/Tech-Blog.png?fit=1600%2C358&amp;ssl=1\" data-orig-size=\"1600,358\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Tech Jobs at Cashfree Payments\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2022\/10\/Tech-Blog.png?fit=770%2C172&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2022\/10\/Tech-Blog.png?resize=770%2C172&#038;ssl=1\" alt=\"Jobs at Cashfree Payments\" class=\"wp-image-13055\" srcset=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2022\/10\/Tech-Blog.png?resize=1024%2C229&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2022\/10\/Tech-Blog.png?resize=300%2C67&amp;ssl=1 300w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2022\/10\/Tech-Blog.png?resize=768%2C172&amp;ssl=1 768w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2022\/10\/Tech-Blog.png?resize=1536%2C344&amp;ssl=1 1536w, https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2022\/10\/Tech-Blog.png?w=1600&amp;ssl=1 1600w\" sizes=\"(max-width: 770px) 100vw, 770px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>we move billions of dollars every day and each of these transactions has a journey across hundreds of microservices. These high throughput services communicate with each other using asynchronous communication channels such as SQS and Kafka.<\/p>\n","protected":false},"author":26,"featured_media":17094,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_themeisle_gutenberg_block_has_review":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1497],"tags":[],"class_list":["post-17074","post","type-post","status-publish","format-standard","has-post-thumbnail","category-engineering"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How We Manage High Throughput Transactional Events Across Services<\/title>\n<meta name=\"description\" content=\"We move billions of dollars every day and each of these transactions has a journey across hundreds of microservices. These high throughput services communicate with each other using asynchronous communication channels such as SQS and Kafka.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.cashfree.com\/blog\/how-we-manage-high-throughput-transactional-events-across-services\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How We Manage High Throughput Transactional Events Across Services\" \/>\n<meta property=\"og:description\" content=\"We move billions of dollars every day and each of these transactions has a journey across hundreds of microservices. These high throughput services communicate with each other using asynchronous communication channels such as SQS and Kafka.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.cashfree.com\/blog\/how-we-manage-high-throughput-transactional-events-across-services\/\" \/>\n<meta property=\"og:site_name\" content=\"Cashfree Payments Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-27T01:41:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-28T10:28:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/Thumbnail.png?fit=1208%2C803&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1208\" \/>\n\t<meta property=\"og:image:height\" content=\"803\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Supal Dubey\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Supal Dubey\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How We Manage High Throughput Transactional Events Across Services","description":"We move billions of dollars every day and each of these transactions has a journey across hundreds of microservices. These high throughput services communicate with each other using asynchronous communication channels such as SQS and Kafka.","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:\/\/www.cashfree.com\/blog\/how-we-manage-high-throughput-transactional-events-across-services\/","og_locale":"en_US","og_type":"article","og_title":"How We Manage High Throughput Transactional Events Across Services","og_description":"We move billions of dollars every day and each of these transactions has a journey across hundreds of microservices. These high throughput services communicate with each other using asynchronous communication channels such as SQS and Kafka.","og_url":"https:\/\/www.cashfree.com\/blog\/how-we-manage-high-throughput-transactional-events-across-services\/","og_site_name":"Cashfree Payments Blog","article_published_time":"2023-04-27T01:41:17+00:00","article_modified_time":"2023-04-28T10:28:12+00:00","og_image":[{"width":1208,"height":803,"url":"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/Thumbnail.png?fit=1208%2C803&ssl=1","type":"image\/png"}],"author":"Supal Dubey","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Supal Dubey","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.cashfree.com\/blog\/how-we-manage-high-throughput-transactional-events-across-services\/#article","isPartOf":{"@id":"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/"},"author":{"name":"Supal Dubey","@id":"https:\/\/blogrevamp.cashfree.com\/#\/schema\/person\/56e8785573831cd3ed450a32a6413f7f"},"headline":"How We Manage High Throughput Transactional Events Across Services","datePublished":"2023-04-27T01:41:17+00:00","dateModified":"2023-04-28T10:28:12+00:00","mainEntityOfPage":{"@id":"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/"},"wordCount":1273,"commentCount":0,"image":{"@id":"https:\/\/www.cashfree.com\/blog\/how-we-manage-high-throughput-transactional-events-across-services\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/Thumbnail.png?fit=1208%2C803&ssl=1","articleSection":["Engineering"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.cashfree.com\/blog\/how-we-manage-high-throughput-transactional-events-across-services\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogrevamp.cashfree.com\/how-we-manage-high-throughput-transactional-events-across-services\/","url":"https:\/\/www.cashfree.com\/blog\/how-we-manage-high-throughput-transactional-events-across-services\/","name":"How We Manage High Throughput Transactional Events Across Services","isPartOf":{"@id":"https:\/\/blogrevamp.cashfree.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.cashfree.com\/blog\/how-we-manage-high-throughput-transactional-events-across-services\/#primaryimage"},"image":{"@id":"https:\/\/www.cashfree.com\/blog\/how-we-manage-high-throughput-transactional-events-across-services\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/Thumbnail.png?fit=1208%2C803&ssl=1","datePublished":"2023-04-27T01:41:17+00:00","dateModified":"2023-04-28T10:28:12+00:00","author":{"@id":"https:\/\/blogrevamp.cashfree.com\/#\/schema\/person\/56e8785573831cd3ed450a32a6413f7f"},"description":"We move billions of dollars every day and each of these transactions has a journey across hundreds of microservices. These high throughput services communicate with each other using asynchronous communication channels such as SQS and Kafka.","breadcrumb":{"@id":"https:\/\/www.cashfree.com\/blog\/how-we-manage-high-throughput-transactional-events-across-services\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.cashfree.com\/blog\/how-we-manage-high-throughput-transactional-events-across-services\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.cashfree.com\/blog\/how-we-manage-high-throughput-transactional-events-across-services\/#primaryimage","url":"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/Thumbnail.png?fit=1208%2C803&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/Thumbnail.png?fit=1208%2C803&ssl=1","width":1208,"height":803},{"@type":"BreadcrumbList","@id":"https:\/\/www.cashfree.com\/blog\/how-we-manage-high-throughput-transactional-events-across-services\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blogrevamp.cashfree.com\/"},{"@type":"ListItem","position":2,"name":"Engineering","item":"https:\/\/blogrevamp.cashfree.com\/category\/engineering\/"},{"@type":"ListItem","position":3,"name":"How We Manage High Throughput Transactional Events Across Services"}]},{"@type":"WebSite","@id":"https:\/\/blogrevamp.cashfree.com\/#website","url":"https:\/\/blogrevamp.cashfree.com\/","name":"Cashfree Payments Blog","description":"Cashfree Payments- Payment Gateway for India","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogrevamp.cashfree.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blogrevamp.cashfree.com\/#\/schema\/person\/56e8785573831cd3ed450a32a6413f7f","name":"Supal Dubey","url":"https:\/\/blogrevamp.cashfree.com\/author\/supalcf\/"}]}},"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9MjXo-4ro","jetpack_likes_enabled":false,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blogrevamp.cashfree.com\/wp-content\/uploads\/2023\/04\/Thumbnail.png?fit=1208%2C803&ssl=1","_links":{"self":[{"href":"https:\/\/blogrevamp.cashfree.com\/wp-json\/wp\/v2\/posts\/17074","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogrevamp.cashfree.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogrevamp.cashfree.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogrevamp.cashfree.com\/wp-json\/wp\/v2\/users\/26"}],"replies":[{"embeddable":true,"href":"https:\/\/blogrevamp.cashfree.com\/wp-json\/wp\/v2\/comments?post=17074"}],"version-history":[{"count":15,"href":"https:\/\/blogrevamp.cashfree.com\/wp-json\/wp\/v2\/posts\/17074\/revisions"}],"predecessor-version":[{"id":17125,"href":"https:\/\/blogrevamp.cashfree.com\/wp-json\/wp\/v2\/posts\/17074\/revisions\/17125"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogrevamp.cashfree.com\/wp-json\/wp\/v2\/media\/17094"}],"wp:attachment":[{"href":"https:\/\/blogrevamp.cashfree.com\/wp-json\/wp\/v2\/media?parent=17074"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogrevamp.cashfree.com\/wp-json\/wp\/v2\/categories?post=17074"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogrevamp.cashfree.com\/wp-json\/wp\/v2\/tags?post=17074"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}