{"id":4399,"date":"2020-06-24T08:00:08","date_gmt":"2020-06-24T15:00:08","guid":{"rendered":"https:\/\/intuitblog.com\/?p=4399"},"modified":"2024-03-13T09:24:10","modified_gmt":"2024-03-13T16:24:10","slug":"intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond","status":"publish","type":"post","link":"https:\/\/www.intuit.com\/blog\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/","title":{"rendered":"Intuit\u2019s Messaging Platform on Public Cloud: Scaling High and Beyond"},"content":{"rendered":"<p><span style=\"font-weight: 400;\"><strong><em>Authors:<\/em> <\/strong>Madhavan Narayanan, Amit Jere, Jason Webb, Amit Kaushal, Sankara Rao, Sajith Sebastian, Gokul Sarangapani<\/span><\/p>\n<p style=\"text-align: center;\"><b>Abstract<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Asynchronous integration is a key enterprise pattern that enables loosely coupled services.\u00a0 With JMS, loose coupling is enabled by services exchanging messages via a messaging system. Intuit\u2019s <\/span><i><span style=\"font-weight: 400;\">Messaging Platform<\/span><\/i><span style=\"font-weight: 400;\">, built on top of RedHat\u2019s ActiveMQ JMS technology, is running in AWS and <\/span><i><span style=\"font-weight: 400;\">supports queueing use cases for asynchronous integration between components in the same application and between different services that are deployed in the same or different AWS regions<\/span><\/i><span style=\"font-weight: 400;\">. It is a highly transactional multi-tenant platform, currently used by 2000+ service integrations processing 60+ Billion messages per year at a concurrency of 36K+ messages per second with less than 20 ms TP99 publish response time with 99.999 availability and 100% self-service support for Day 0\/1\/2 operations. Several tier zero integrations for Intuit flagship products like Quickbooks Online and TurboTax Online are built on top of the platform. While the platform operated out of Intuit\u2019s private data centers (aka IHP) for initial few years since its inception in 2015 and successfully served customer needs, with the migration to AWS in Summer of 2018 and also due to increasing customer traffic a significant degradation in performance and scalability was seen. In this paper, we present the various issues that were observed, the activities\/experiments that were done to troubleshoot them, and the solutions implemented thereof to continue to meet the business needs of high availability, performance, and scale for the next 3 years. The \u201cOutcomes\u201d section describes the improvements to the performance and scalability of the Intuit Messaging Platform.<\/span><\/p>\n<h3><b>1. Overview<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">This section lists the significant improvements that were done to the performance and scalability of the Intuit Messaging Platform. The details of how these improvements were achieved are explained from section 2 onwards.<\/span><\/p>\n<p><b>Outcomes<br \/>\n<\/b><span style=\"font-weight: 400;\">The table given below summarizes the improvements seen in the key metrics of the platform.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-4404 alignnone\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.07.44-PM.png?w=313\" alt=\"\" width=\"313\" height=\"260\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.07.44-PM.png 313w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.07.44-PM.png?resize=150,125 150w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.07.44-PM.png?resize=300,249 300w\" sizes=\"auto, (max-width: 313px) 100vw, 313px\" \/><\/p>\n<h3><b>2. Intuit Messaging Platform<\/b><\/h3>\n<p><b>What is Intuit Messaging Platform?<br \/>\n<\/b><span style=\"font-weight: 400;\">Intuit Messaging Platform is an enterprise messaging solution that consists of a highly distributed set of ActiveMQ broker instances. ActiveMQ is an open source messaging software developed by Apache Software foundation and supports a fully compliant JMS 1.1 client.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The platform is running in 2 AWS regions (US-WEST-2 and US-EAST-2) that are connected over WAN and other than providing DR, it provides an ability for clients to produce in one region and consume in another region, if required. To ensure high availability within one AWs region, the brokers in a swimlane are distributed across 3 AWS availability zones in one AWS region. Further to avoid noisy neighbor situations and manage the blast radius, the broker instances are grouped into multiple swimlanes, with each swimlane running a set of brokers interconnected using ActiveMQ\u2019s network-of-brokers topology. There are ~10 swimlanes in Intuit Messaging Platform and customers are typically assigned a specific swimlane through an onboarding process and are allowed to produce and consume messages within the swimlane.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">While ActiveMQ\u2019s network-of-brokers setup makes it possible for messages to be consumed from any broker within a swimlane, Apache Camel is used to route messages across swimlanes wherever needed. Camel is also used to support custom routing within a broker using header-based filters.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The diagram in Appendix A shows what a swimlane in AWS looks like.<\/span><b>\u00a0<\/b><\/p>\n<p><b>Why Intuit Messaging Platform?<\/b><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Intuit Messaging Platform enables loose coupling in distributed transaction processing wherein different components of the system can be designed, evolved, and operated relatively independently of each other.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">With Intuit Messaging Platform, messages can be synchronously stored, asynchronously forwarded\/processed and synchronously removed enabling the design of reliable distributed transaction processing solutions<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Offers multiple integration patterns for different client needs<\/span>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Simple Point-to-Point Queues\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Topic based Publish\/Subscribe<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Virtual Topics for durable consumption by subscribers<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Camel Routing for advanced filtering and routing of messages<\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Offers reliable messaging with zero message loss and exactly-once message delivery<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Highly available using a cluster of brokers\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Is accessible using JMS API, an industry standard interface for asynchronous messaging<\/span><\/li>\n<\/ul>\n<p><b>ActiveMQ<br \/>\n<\/b><span style=\"font-weight: 400;\">ActiveMQ is an open source, JMS 1.1 compliant, message-oriented middleware (MOM) from the Apache Software Foundation that provides high availability, performance, scalability, and security for enterprise messaging and is widely adopted in the industry<\/span><\/p>\n<p><b>Network of Brokers<br \/>\n<\/b><span style=\"font-weight: 400;\">To support scalability and high availability, activeMQ allows multiple broker instances to be connected together into a network and enable distributed queues and topics. This <\/span><b><i>network of brokers<\/i><\/b><span style=\"font-weight: 400;\"> allows clients to connect to any broker in the network and start consuming messages regardless of the actual location where the messages were produced.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To achieve this, ActiveMQ networks use the concept of store and forward, whereby messages are always stored in the local broker before being forwarded across the network to another broker. This means that if messages can\u2019t be delivered due to connectivity issues when the connection is reestablished, a broker will be able to send any undelivered messages across the network connection to the remote broker<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4406 alignnone\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure1-1.png?w=578\" alt=\"\" width=\"355\" height=\"325\" \/><\/p>\n<p><span style=\"font-weight: 400;\">To form a network, ActiveMQ uses a discovery agent to locate remote broker(s) and (re)establish connections. The discovery can be:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Dynamic &#8211; Searches for brokers using multicast or rendezvous<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Static &#8211; Configured with list of broker URLs with which to establish a connection<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Intuit Messaging Platform currently uses static pre-configured lists to form different swimlanes. To achieve High Availability and also to handle region level outages, the list included connections within brokers in the same region (known as the LAN connections) and connections across the region (WAN connections). Considering the network speed and delays, WAN connections are configured with stricter rules for forwarding messages.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To enable easy access for customers and also to ensure fair distribution of client connections across the brokers in a network, the Intuit Messaging Platform uses a network load balancer that distributes the connection requests in round robin fashion. As the messaging platform is shared by multiple services, the producer connections and consumer connections can land on different brokers.\u00a0<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-4412 size-large\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure2.png?w=640\" alt=\"\" width=\"640\" height=\"466\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure2.png 1368w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure2.png?resize=150,109 150w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure2.png?resize=300,218 300w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure2.png?resize=768,559 768w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure2.png?resize=1024,746 1024w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure2.png?resize=740,539 740w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure2.png?resize=720,524 720w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-4419 size-large\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure3.png?w=640\" alt=\"\" width=\"640\" height=\"471\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure3.png 1288w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure3.png?resize=150,110 150w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure3.png?resize=300,221 300w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure3.png?resize=768,565 768w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure3.png?resize=1024,754 1024w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure3.png?resize=740,545 740w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure3.png?resize=720,530 720w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p><b>KahaDB Message Store\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">For reliable message storage and recovery combined with high performance, ActiveMQ supports a file based message store known as \u2018KahaDB\u2019 and recommends the same for general purpose messages.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">KahaDB is designed to facilitate high-speed message storage and retrieval. The bulk of the data is stored in rolling journal files (data logs), where all broker events are continuously appended. In order to facilitate rapid retrieval of messages from the data logs, a B-tree index is created, which contains pointers to the locations of all the messages embedded in the data log files. The complete B-tree index is stored on disk and part or all of the B-tree index is held in a cache in memory.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-4422 alignnone\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure4.png?w=640\" alt=\"\" width=\"640\" height=\"607\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure4.png 926w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure4.png?resize=150,142 150w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure4.png?resize=300,284 300w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure4.png?resize=768,728 768w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure4.png?resize=740,702 740w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure4.png?resize=720,683 720w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p><b>Apache Camel Integration<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Apache Camel is a versatile open-source integration framework based on known <\/span><a href=\"https:\/\/camel.apache.org\/manual\/latest\/enterprise-integration-patterns.html\" target=\"_blank\"><span style=\"font-weight: 400;\">Enterprise Integration Patterns<\/span><\/a><span style=\"font-weight: 400;\"> and enables one to define routing and mediation rules in a variety of domain-specific languages. Multiple Apache projects leverage Camel as a routing and mediation engine. ActiveMQ is one of them and enables the use of Camel routes via an embedded plugin.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Intuit Messaging Platform uses ActiveMQ\u2019s Camel integration to provide support for advanced filtering and routing of messages<\/span><\/p>\n<h3><b>3. Background<\/b><\/h3>\n<p><b>Evolution of Intuit Messaging Platform<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Intuit Messaging Platform started its journey as a simple messaging solution for a small set of customers in 2015 and evolved over the next few years into an enterprise messaging platform supporting all of Intuit and thousands of asynchronous queuing integrations.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">During the initial phases of its journey, the Intuit Messaging Platform was primarily operated out of Intuit\u2019s private data centers (IHP) by all Intuit services for multiple years before the migration journey to AWS started.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To support customers during the AWS migration journey, the Intuit Messaging Platform was operated in a hybrid mode with brokers running in both IHP servers and AWS EC2 instances.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">During this phase, it was observed that there is a significant difference in the performance of the activeMQ brokers running in IHP host vs EC2. While an IHP host with 256GB RAM, 20 cores (40 vCPUs) and 1TB disk store used to support 15K TPS an EC2 with similar configuration lagged by a factor of up to 5x. With a majority of the Intuit Messaging Platform traffic being handled by IHP brokers, this was not a major concern then.<\/span><\/p>\n<p><b>IHP Exit<\/b><\/p>\n<p><span style=\"font-weight: 400;\">When it was mandated as an organizational goal to move all Intuit services completely out of IHP by end of 2018, it was decided to run all Intuit Messaging Platform brokers on EC2 instances and discard the hybrid mode. This triggered an exercise within the Messaging team to critically evaluate the broker performance on EC2 instances and find solutions to improve bottlenecks if any.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">In the next few sections, we will discuss the various experiments that were done as part of this exercise, the issues found and the solutions that were implemented.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">These solutions were rolled out to production in a release named Intuit Messaging Platform 2.1 and have been successfully effective for the past few months. In this paper, we will also provide a detailed comparison of the performance metrics observed before and after Intuit Messaging Platform 2.1\u00a0<\/span><\/p>\n<p><b>Key Performance Metrics<\/b><\/p>\n<p><span style=\"font-weight: 400;\">The following are some of the key messaging metrics that were considered for the performance evaluation and improvement<\/span><\/p>\n<ul>\n<li><b><i>Publish Latency<br \/>\n<\/i><\/b>This is the time taken by a messaging client to produce a message to the broker and get acknowledgment. Lesser this value, the better<\/li>\n<li><b><i>Publish throughput<br \/>\n<\/i><\/b>This is a measure of the number of messages that could be produced to a broker within a time period. Typically measured as TPS (message transactions per second). Higher this value, the better<\/li>\n<li><b><i>Consumption throughput<br \/>\n<\/i><\/b>This is a measure of the number of messages that could be delivered to starving consumers within a time period. Typically measured as TPS (message transactions per second). Higher this value, the better<\/li>\n<\/ul>\n<h3><b>4. Intuit Messaging Platform Performance, Scalability and Operability Improvements<\/b><\/h3>\n<p><b>Limitations seen in the platform performance and scalability<\/b><\/p>\n<p><span style=\"font-weight: 400;\">The following table captures the performance of some of the key metrics observed with Intuit Messaging Platform 2.0 in AWS when tests were run involving the following commonly used patterns<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Messages were produced to a broker and consumed from a different broker<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Camel routes were used to selectively copy messages to different target queues<\/span><\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-4423 alignnone\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.22.34-PM.png?w=317\" alt=\"\" width=\"359\" height=\"371\" \/><\/p>\n<p><b>Performance Tuning and Scalability Improvement Tracks\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">In the context of above-mentioned challenges and considering the distributed architecture of Intuit Messaging Platform with its network-of-brokers configuration, the analysis and tuning was done in the following 3 distinct tracks to improve the operability, performance, and scalability of the platform<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Understand and improve the read\/write performance for queues and topics in a single broker<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Understand and improve the performance and scalability of network-of-brokers<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Understand and improve the performance and scalability of camel processing<\/span><\/li>\n<\/ul>\n<p><b>Broker Level Performance<\/b><\/p>\n<p><span style=\"font-weight: 400;\">In this track, the team attempted to understand the various factors that affected the read\/write performance of queues and virtual topics.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">It should be noted that the ActiveMQ brokers on AWS EC2 do incur an additional overhead of encryption\/decryption of the message that gets stored in the disk which is not the case with brokers running on IHP hosts.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Notwithstanding the above, Intuit Messaging Platform team wanted to understand if there are other factors in EC2 that influenced the degraded performance.<\/span><\/p>\n<p><b>Disk I\/O\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">One of the main differences between the IHP host and EC2 instance is the use of network-mounted EBS volume in EC2 hosts for the message store. The following tests were done to check if disk I\/O is causing the bottleneck.<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">EC2 brokers were using EBS volumes with type \u2018gp2\u2019 which were provisioned with an IOPS value of 3072. Upgraded to volume type \u2018io1\u2019 which allows up to 6000 IPS. However, it made little difference to the Publish throughput.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Ran standalone tests with ActiveMQ provided DiskBenchmark tool and found that the \u2018gp2\u2019 EBS volume was sufficient enough to handle high throughput if writes are batched.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\"><b style=\"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;\">Improving Batched I\/O\u00a0<\/b><\/span><\/p>\n<p><span style=\"font-weight: 400;\">With the above observation, we browsed through ActiveMQ source code and verified that message write operations by multiple concurrent publisher threads were actually getting batched together for efficient write throughput.<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">To verify if this batching is really happening in practice, we ran tests with the ActiveMQ parameter \u2018<\/span><b><i>org.apache.kahadb. journal.appender.WRITE_STAT_WINDOW<\/i><\/b><b>\u2019<\/b><span style=\"font-weight: 400;\"> set to a non-zero value. This enabled us to monitor the average write batch size.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">In a test running 600 producers writing to 5 different queues (5KB message size, no consumers), it was observed that the average write batch size was low around 20KB<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">To understand why the concurrent producer threads were unable to pass the messages to disk writer thread in time for efficient batching, we took multiple dumps of thread stack traces during the test run and analyzed them to find a pattern<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">From the thread stack traces, it was found that in many cases most of the producer threads were blocked in acquiring the lock to update the in-memory index cache maintained by ActiveMQ KahaDB store. The following graph shows how a large number of threads (blue line) are waiting for the index lock than the threads (orange line)\u00a0 that are waiting for a signal from the disk writer thread. The index lock itself was held by a thread that was flushing the index metadata to disk<\/span><\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-4426 alignnone\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.25.41-PM.png?w=564\" alt=\"\" width=\"564\" height=\"363\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.25.41-PM.png 564w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.25.41-PM.png?resize=150,97 150w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.25.41-PM.png?resize=300,193 300w\" sizes=\"auto, (max-width: 564px) 100vw, 564px\" \/><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">With the above happening, the test could only achieve a maximum overall throughput of ~8K TPS as shown below<\/span><\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-4429 alignnone\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure6.png?w=640\" alt=\"\" width=\"563\" height=\"266\" \/><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">After understanding how the index metadata and the actual journal of the kahaDB store work together, it was realized that the index was being flushed to disk too often resulting in sub-optimal publish latency and throughput.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">To solve this, the kahaDB parameter settings <\/span><b><i>indexCacheSize<\/i><\/b><span style=\"font-weight: 400;\"> and <\/span><b><i>indexWriteBatchSize<\/i><\/b><span style=\"font-weight: 400;\"> were increased\u00a0<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Increasing <\/span><b><i>indexCacheSize <\/i><\/b><span style=\"font-weight: 400;\">reduces the instances of page swaps in and out of memory<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Similarly, increasing <\/span><b><i>indexWriteBatchSize <\/i><\/b><span style=\"font-weight: 400;\">increases the number of dirty indexes that are allowed to accumulate before KahaDB writes the cache to the store.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-4453 size-large\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-10.02.19-PM.png?w=251\" alt=\"\" width=\"251\" height=\"109\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-10.02.19-PM.png 251w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-10.02.19-PM.png?resize=150,65 150w\" sizes=\"auto, (max-width: 251px) 100vw, 251px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">With these new values, it was immediately seen that the number of occurrences of producer threads waiting for index lock reduced drastically, enabling more messages to be passed to the disk writer thread. The average write batch size increased to more than 100 KB<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The below graph shows how the pattern of producer thread waits inverted with the new settings<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-4428 alignnone\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure7-1.png?w=569\" alt=\"\" width=\"569\" height=\"405\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure7-1.png 569w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure7-1.png?resize=150,107 150w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure7-1.png?resize=300,214 300w\" sizes=\"auto, (max-width: 569px) 100vw, 569px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Also, the test was now able to achieve an overall throughput of 11K TPS as shown in the below diagram<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-4425 alignnone\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure8.png?w=640\" alt=\"\" width=\"565\" height=\"279\" \/><\/p>\n<p><span style=\"font-weight: 400;\">While the above improvement was seen with producer-only tests, similar improvements were seen when running both producers and consumers.<\/span><\/p>\n<p><b>Index segregation with mKaha<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Further analysis of the thread stack traces and heap dumps revealed heavy contention between producer and consumer threads to obtain the index lock to record bookkeeping operations.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">One possibility to reduce this contention would be to have separate index stores for each of the queues. This way producers and consumers working on a queue would not be blocked by operations on another queue. This segregation is possible using the mKaha (multiple Kaha) configuration in ActiveMQ where in different Kaha stores are configured for different queues<\/span><\/p>\n<p><span style=\"font-weight: 400;\">With mKaha usage, we were able to see a big improvement in the overall TPS (both producer and consumer).<\/span><\/p>\n<p><b>Concurrency with Virtual Topics\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">While the above changes improved the write performance to queues and resulted in lower publish latency and higher publish TPS, there was another issue seen with Virtual Topics.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A message published to a virtual topic gets copied to all the subscriber queues of the topic. It was noticed that the publish latency for the virtual topic is the sum of the latencies incurred for the individual queues. As the number of subscribers increased, the publish latency for the virtual topic became worse.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To solve this, we enabled an activeMQ setting \u2018concurrentSend\u2019 that can be applied to Virtual Topic interceptors. ConcurrentSend uses an executor to fanout the sends to subscriber queues in parallel. This allows the journal to batch writes which reduces disk io.\u00a0<\/span><span style=\"font-weight: 400;\">After this setting, it was noticed that the\u00a0<\/span><span style=\"font-weight: 400;\">publish latencies on virtual topics vastly reduced and were independent of the number of subscribers<\/span><\/p>\n<p><b>Network-of-Brokers Performance<\/b><\/p>\n<p><span style=\"font-weight: 400;\">While the performance tuning done at the individual broker instance level helped to improve the publisher performance (latency and throughput), the message consumption throughput was still an issue when consumers and producers are connected to different broker instances. The \u2018store and forward\u2019 speed of network-of-brokers were not fast enough to deliver messages to starving consumers. Oftentimes, messages were stuck and growing in the specific broker(s) while consumer connections in a remote broker were only able to consume messages at a speed not exceeding 250-300 TPS.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This resulted in many operational challenges where customers producing messages at high TPS were not able to consume at the same rate if the consumer connections were established with the wrong broker. Intuit Messaging Platform team often had to resort to an operational process known as \u2018connection rebalancing\u2019 to ensure the free-flow of messages.<\/span><\/p>\n<p><b>Increasing LAN\/WAN Connection Bandwidth<\/b><\/p>\n<p><span style=\"font-weight: 400;\">The slowness in inter-broker transfer of messages was mainly due to the use of a single connection (LAN\/WAN) between brokers for transferring messages. With message persistence, a single connection was at best able to support only ~300 TPS.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">As indicated already, Intuit Messaging Platform uses a static list of connections between brokers to establish the \u2018network\u2019. We added support in ActiveMQ configuration to enable dynamic replication of connections. The replication factor could be controlled swimlane-wise.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">With this support, we are able to increase the number of LAN\/WAN connections between brokers and were able to go well past the 300 TPS limit.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">While the increase in LAN connections had a positive impact on the easy and quick flow of messages between brokers, it opened a new set of challenges. The next few sections describe these issues in detail<\/span><\/p>\n<p><b>Stuck messages\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">While messages can move across the network of brokers to find their way to an external consumer, there are instances when they get stuck at a particular broker. This happens mostly when external consumers re-establish their connections and get connected to a different broker.ActiveMQ, by default, disallows a message from re-visiting a broker that had already seen the message and this results in messages getting stranded at specific brokers after visiting all other brokers. While this was an existing issue, with the increased LAN connections and hence increased inter-broker traffic, we started seeing more of these issues requiring Intuit Messaging Platform team to intervene and manually move the messages to the right brokers where consumers are connected. This became a chronic issue with some customers who had very few consumer connections and kept reconnecting.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To solve this problem we did research on ActiveMQ configuration and code and found an implementation of a network bridge filter known as <\/span><b><i>conditionalNetworkBridgeFilterFactory<\/i><\/b><span style=\"font-weight: 400;\"> that allows replay of a message back to an already visited broker if there are no local consumers.\u00a0 This filter can be applied to destination policies by setting attribute\u00a0 \u2018replayWhenNoConsumers\u2019 to true as shown below<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-4431 alignnone\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.31.15-PM.png?w=311\" alt=\"\" width=\"311\" height=\"275\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.31.15-PM.png 311w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.31.15-PM.png?resize=150,133 150w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.31.15-PM.png?resize=300,265 300w\" sizes=\"auto, (max-width: 311px) 100vw, 311px\" \/><\/p>\n<p><span style=\"font-weight: 400;\"><span style=\"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;\">This can be avoided if Intuit Messaging Platform customers do not use selection filters with their consumer connections and consume all messages (and discard at client side if appropriate). In general, this has always been the recommendation from Intuit Messaging Platform team to customers.<\/span>However, studying the code of conditionalNetworkBridgeFilterFactory, we found that there is still a remote possibility of messages getting stuck if there are local consumers on the broker but the messages cannot be delivered to the consumer if there are selection filters specified which prevent the delivery.\u00a0<\/span><\/p>\n<p><b>Reducing unnecessary\/redundant LAN traffic\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Another undesired side-effect of increased inter-broker connections was a dramatic increase in the traffic between the brokers.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">With more LAN connections between brokers and enabling of message replay to already visited brokers, we started seeing that a large number of messages were hopping amongst all the brokers in a swimlane multiple times before finally delivered to an end consumer. It was so severe that there were many instances when the volume of inter-broker traffic was manifolds the actual customer generated traffic.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">On analyzing this behavior with reference to the activeMQ configuration that was used, we discovered that the inter-broker consumer connections were treated by ActiveMQ brokers as fast consumers and the messages were readily moved to another broker than a locally connected end consumer.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To fix this, we used an ActiveMQ configuration property <\/span><b><i>\u2018decreaseNetworkConsumerPriority<\/i><\/b><span style=\"font-weight: 400;\">` which when set to \u2018true\u2019 gives higher priority to local consumers than network consumers. After enabling this property, we saw a huge improvement in the traffic pattern and the inter-broker traffic reduced by great extent.<\/span><\/p>\n<p><b>Camel Routing Performance<\/b><\/p>\n<p><span style=\"font-weight: 400;\">With performance improvements achieved both at single broker and swimlane (network-of-brokers) level, then next challenge in Intuit Messaging Platform was to solve the severe performance bottleneck seen with Camel processing<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Intuit Messaging Platform uses the embedded Apache Camel plugin in ActiveMQ broker to support advanced routing capabilities for its customers. With Intuit Messaging Platform Camel routes, it is possible for customers to publish messages to a source queue and have the messages routed to multiple different target queues. It is possible to specify different filter conditions for each target queue. This is an advanced feature that is used by some of the top customers of Intuit Messaging Platform<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-4432 size-large\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure9.png?w=640\" alt=\"\" width=\"640\" height=\"381\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure9.png 1600w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure9.png?resize=150,89 150w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure9.png?resize=300,179 300w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure9.png?resize=768,457 768w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure9.png?resize=1024,609 1024w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure9.png?resize=1536,914 1536w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure9.png?resize=740,440 740w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure9.png?resize=1440,857 1440w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure9.png?resize=720,428 720w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">The next section discusses the problem(s) that were seen with Camel routes in Intuit Messaging Platform and how this was solved.<\/span><\/p>\n<p><b>High CPU Usage\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">It has been observed that when messages were processed by the embedded camel processor in ActiveMQ broker, the CPU usage of the broker host goes high. It was also observed that as the number of target queues increased the CPU usage increased further.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This resulted in some serious limitations and had sometimes also caused outages in Intuit Messaging Platform<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">When there is a sudden surge in incoming traffic to the source queue of a camel route, sometimes the CPU usage goes as high as 95% slowing down the entire broker. This results in huge backlogs in multiple queues (source and target queues) affecting downstream use cases. This scenario had happened multiple times in production<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">The number of target queues was limited to 7 (an empirical value based on observed CPU usage data). Intuit Messaging Platform team was not able to handle requests for the addition of further routes, much to the disappointment of customers<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Although an advanced and powerful feature that can benefit customers in apt use cases, Intuit Messaging Platform team generally shied away from recommending usage of Camel routes to customers<\/span><\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-4433 size-large\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure10.png?w=640\" alt=\"\" width=\"640\" height=\"314\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure10.png 928w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure10.png?resize=150,74 150w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure10.png?resize=300,147 300w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure10.png?resize=768,377 768w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure10.png?resize=740,364 740w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure10.png?resize=720,354 720w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">To solve this issue, we used debugging tools\/aids such as Java Flight Recorder, memory heap dumps and thread stack traces to deep-dive into the internals of Camel processing and understand the cause for the CPU usage.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">After multiple iterations of debug and cross-reference with the source code of Apache Camel, we found that the root cause of the high CPU usage was the use of DelayQueue by Camel\u2019s MultiProcessor logic that attempts to execute tasks writing to target queues in parallel and aggregate in the order the tasks are submitted (in order sequence). The DelayQueue implementation seemed to result in CPU-intensive execution loops.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Since the in-order sequence for target queues is not a requirement for Intuit Messaging Platform, we circumvented the above by using a Camel Route property \u2018<\/span><b>streaming<\/b><span style=\"font-weight: 400;\">\u2019 that still executes the tasks in parallel but aggregates in the order they are finished.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Setting the \u2018streaming\u2019 property to true resulted in a complete change of the Camel performance. The CPU usage was well within 20% in all the tests and combined with the other improvements discussed in earlier sections, we were able to support as high as 30 target queues with the CPU usage still within acceptable limits<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-4434 size-large\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure11.png?w=640\" alt=\"\" width=\"640\" height=\"321\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure11.png 932w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure11.png?resize=150,75 150w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure11.png?resize=300,151 300w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure11.png?resize=768,386 768w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure11.png?resize=740,372 740w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure11.png?resize=720,362 720w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">It is also worthy to note that after the above finding and solution, we searched the web for any other reference to similar reported issue and interestingly found an existing JIRA that points to the same issue with use of DelayedQueue in java class <\/span><span style=\"font-weight: 400;\">SubmitOrderedCompletionService (used when streaming is false)<\/span><\/p>\n<p><em><span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (CAMEL-11750) Camel route with multicast (parallel) generate huge CPU load<br \/>\n<\/span><\/em><span style=\"font-weight: 400;\">Please refer to the reference section for a link to this JIRA item<\/span><\/p>\n<h3><b>5. Summary<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">All the efforts spent in understanding and addressing bottlenecks of performance and scalability have yielded impactful results with the messaging platform now handling higher traffic than completely out of AWS and exceeding all the customer SLAs. Below table summarizes the before and after comparison of key metrics.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-4435 size-medium\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.36.01-PM.png?w=300\" alt=\"\" width=\"300\" height=\"246\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.36.01-PM.png 322w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.36.01-PM.png?resize=150,123 150w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.36.01-PM.png?resize=300,246 300w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p><span style=\"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;\">The following table captures the summary of configuration settings that were tuned to achieve the improvements.\u00a0<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4450 size-large alignnone\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.59.00-PM.png?w=295\" alt=\"\" width=\"295\" height=\"401\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.59.00-PM.png 295w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.59.00-PM.png?resize=110,150 110w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.59.00-PM.png?resize=221,300 221w\" sizes=\"auto, (max-width: 295px) 100vw, 295px\" \/><\/p>\n<p>+++++<\/p>\n<p><b>References\/Links<\/b><\/p>\n<ol>\n<li><span style=\"font-weight: 400;\">ActiveMQ Network of Brokers &#8211; Documentation<\/span><br \/>\n<a href=\"https:\/\/activemq.apache.org\/networks-of-brokers\"style=\"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;\"  target=\"_blank\">https:\/\/activemq.apache.org\/networks-of-brokers<\/a><\/li>\n<li><span style=\"font-weight: 400;\">ActiveMQ Virtual Topics &#8211; Documentation<br \/>\n<\/span><a href=\"https:\/\/activemq.apache.org\/virtual-destinations\"style=\"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;\"  target=\"_blank\">https:\/\/activemq.apache.org\/virtual-destinations<\/a><\/li>\n<li><span style=\"font-weight: 400;\">Camel Issue &#8211; JIRA Camel-11750<br \/>\n<\/span><a href=\"http:\/\/mail-archives.apache.org\/mod_mbox\/camel-issues\/201709.mbox\/%3CJIRA.13100094.1504692898000.58959.1504860121067@Atlassian.JIRA%3E\"style=\"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;\"  target=\"_blank\">[jira] [Updated] (CAMEL-11750) Camel route with multicast (parallel) generate huge CPU load<\/a><\/li>\n<\/ol>\n<p>+++++<\/p>\n<h3><b>Appendix A &#8211; Intuit Messaging Platform Architecture on AWS<\/b><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-4439 size-large\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure12.png?w=640\" alt=\"\" width=\"640\" height=\"287\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure12.png 1600w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure12.png?resize=150,67 150w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure12.png?resize=300,134 300w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure12.png?resize=768,344 768w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure12.png?resize=1024,459 1024w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure12.png?resize=1536,688 1536w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure12.png?resize=740,332 740w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure12.png?resize=1440,645 1440w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure12.png?resize=720,323 720w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<h3><b>Appendix B &#8211; Camel Processing Example<\/b><\/h3>\n<p><b><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-4440 size-large\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure13.png?w=640\" alt=\"\" width=\"640\" height=\"381\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure13.png 1600w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure13.png?resize=150,89 150w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure13.png?resize=300,179 300w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure13.png?resize=768,457 768w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure13.png?resize=1024,609 1024w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure13.png?resize=1536,914 1536w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure13.png?resize=740,440 740w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure13.png?resize=1440,857 1440w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure13.png?resize=720,428 720w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/b><\/p>\n<h3><b>Appendix C &#8211; Intuit Messaging Platform Traffic in production<\/b><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-4441 size-large\" src=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure14.png?w=640\" alt=\"\" width=\"640\" height=\"300\" srcset=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure14.png 1600w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure14.png?resize=150,70 150w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure14.png?resize=300,140 300w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure14.png?resize=768,360 768w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure14.png?resize=1024,479 1024w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure14.png?resize=1536,719 1536w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure14.png?resize=740,346 740w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure14.png?resize=1440,674 1440w, https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Figure14.png?resize=720,337 720w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Authors: Madhavan Narayanan, Amit Jere, Jason Webb, Amit Kaushal, Sankara Rao, Sajith Sebastian, Gokul Sarangapani Abstract Asynchronous integration is a key enterprise pattern that enables loosely coupled services.\u00a0 With JMS, loose coupling is enabled by services exchanging messages via a messaging system. Intuit\u2019s Messaging Platform, built on top of RedHat\u2019s ActiveMQ JMS technology, is running<\/p>\n","protected":false},"author":151418277,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rkv_browse_by_id":0,"rkv_cta_id":0,"rkv_optimize_for_pagespeed":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"useModifiedDate":false,"customPublishDate":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[237496403,237496409],"tags":[],"intuit_collection":[],"intuit_series":[],"coauthors":[1399,237496056],"class_list":["post-4399","post","type-post","status-publish","format-standard","hentry","category-innovative-thinking","category-tech-innovation"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Intuit\u2019s Messaging Platform on Public Cloud: Scaling High and Beyond - Intuit Blog<\/title>\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.intuit.com\/blog\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Intuit\u2019s Messaging Platform on Public Cloud: Scaling High and Beyond - Intuit Blog\" \/>\n<meta property=\"og:description\" content=\"Authors: Madhavan Narayanan, Amit Jere, Jason Webb, Amit Kaushal, Sankara Rao, Sajith Sebastian, Gokul Sarangapani Abstract Asynchronous integration is a key enterprise pattern that enables loosely coupled services.\u00a0 With JMS, loose coupling is enabled by services exchanging messages via a messaging system. Intuit\u2019s Messaging Platform, built on top of RedHat\u2019s ActiveMQ JMS technology, is running\" \/>\n<meta property=\"og:url\" content=\"https:\/\/intuitblog.com\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/\" \/>\n<meta property=\"og:site_name\" content=\"Intuit Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-06-24T15:00:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-13T16:24:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.07.44-PM.png?w=313\" \/>\n<meta name=\"author\" content=\"Intuit Blog team, aa251549\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Intuit Blog team, aa251549\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/intuitblog.com\\\/innovative-thinking\\\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/intuitblog.com\\\/innovative-thinking\\\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\\\/\"},\"author\":{\"name\":\"aa251549\",\"@id\":\"https:\\\/\\\/www.intuit.com\\\/blog\\\/#\\\/schema\\\/person\\\/c834e4fcf9f17a7c296e0212786648d4\"},\"headline\":\"Intuit\u2019s Messaging Platform on Public Cloud: Scaling High and Beyond\",\"datePublished\":\"2020-06-24T15:00:08+00:00\",\"dateModified\":\"2024-03-13T16:24:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/intuitblog.com\\\/innovative-thinking\\\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\\\/\"},\"wordCount\":4104,\"image\":{\"@id\":\"https:\\\/\\\/intuitblog.com\\\/innovative-thinking\\\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/intuitblog.com\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/Screen-Shot-2020-06-21-at-9.07.44-PM.png?w=313\",\"articleSection\":[\"Innovative Thinking\",\"Tech Innovation\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/intuitblog.com\\\/innovative-thinking\\\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\\\/\",\"url\":\"https:\\\/\\\/intuitblog.com\\\/innovative-thinking\\\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\\\/\",\"name\":\"Intuit\u2019s Messaging Platform on Public Cloud: Scaling High and Beyond - Intuit Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.intuit.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/intuitblog.com\\\/innovative-thinking\\\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/intuitblog.com\\\/innovative-thinking\\\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/intuitblog.com\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/Screen-Shot-2020-06-21-at-9.07.44-PM.png?w=313\",\"datePublished\":\"2020-06-24T15:00:08+00:00\",\"dateModified\":\"2024-03-13T16:24:10+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.intuit.com\\\/blog\\\/#\\\/schema\\\/person\\\/c834e4fcf9f17a7c296e0212786648d4\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/intuitblog.com\\\/innovative-thinking\\\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/intuitblog.com\\\/innovative-thinking\\\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/intuitblog.com\\\/innovative-thinking\\\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\\\/#primaryimage\",\"url\":\"https:\\\/\\\/intuitblog.com\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/Screen-Shot-2020-06-21-at-9.07.44-PM.png?w=313\",\"contentUrl\":\"https:\\\/\\\/intuitblog.com\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/Screen-Shot-2020-06-21-at-9.07.44-PM.png?w=313\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/intuitblog.com\\\/innovative-thinking\\\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/intuitblog.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Intuit\u2019s Messaging Platform on Public Cloud: Scaling High and Beyond\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.intuit.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.intuit.com\\\/blog\\\/\",\"name\":\"Intuit Blog\",\"description\":\"Powering Financial Prosperity\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.intuit.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.intuit.com\\\/blog\\\/#\\\/schema\\\/person\\\/c834e4fcf9f17a7c296e0212786648d4\",\"name\":\"aa251549\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fc93e85a59284be67bfc6cba4663cf4e7389a3bfcd5160489c9844125b40f982?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fc93e85a59284be67bfc6cba4663cf4e7389a3bfcd5160489c9844125b40f982?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fc93e85a59284be67bfc6cba4663cf4e7389a3bfcd5160489c9844125b40f982?s=96&d=identicon&r=g\",\"caption\":\"aa251549\"},\"url\":\"https:\\\/\\\/www.intuit.com\\\/blog\\\/author\\\/aa251549\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Intuit\u2019s Messaging Platform on Public Cloud: Scaling High and Beyond - Intuit Blog","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.intuit.com\/blog\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/","og_locale":"en_US","og_type":"article","og_title":"Intuit\u2019s Messaging Platform on Public Cloud: Scaling High and Beyond - Intuit Blog","og_description":"Authors: Madhavan Narayanan, Amit Jere, Jason Webb, Amit Kaushal, Sankara Rao, Sajith Sebastian, Gokul Sarangapani Abstract Asynchronous integration is a key enterprise pattern that enables loosely coupled services.\u00a0 With JMS, loose coupling is enabled by services exchanging messages via a messaging system. Intuit\u2019s Messaging Platform, built on top of RedHat\u2019s ActiveMQ JMS technology, is running","og_url":"https:\/\/intuitblog.com\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/","og_site_name":"Intuit Blog","article_published_time":"2020-06-24T15:00:08+00:00","article_modified_time":"2024-03-13T16:24:10+00:00","og_image":[{"url":"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.07.44-PM.png?w=313","type":"","width":"","height":""}],"author":"Intuit Blog team, aa251549","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Intuit Blog team, aa251549","Est. reading time":"22 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/intuitblog.com\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/#article","isPartOf":{"@id":"https:\/\/intuitblog.com\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/"},"author":{"name":"aa251549","@id":"https:\/\/www.intuit.com\/blog\/#\/schema\/person\/c834e4fcf9f17a7c296e0212786648d4"},"headline":"Intuit\u2019s Messaging Platform on Public Cloud: Scaling High and Beyond","datePublished":"2020-06-24T15:00:08+00:00","dateModified":"2024-03-13T16:24:10+00:00","mainEntityOfPage":{"@id":"https:\/\/intuitblog.com\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/"},"wordCount":4104,"image":{"@id":"https:\/\/intuitblog.com\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/#primaryimage"},"thumbnailUrl":"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.07.44-PM.png?w=313","articleSection":["Innovative Thinking","Tech Innovation"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/intuitblog.com\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/","url":"https:\/\/intuitblog.com\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/","name":"Intuit\u2019s Messaging Platform on Public Cloud: Scaling High and Beyond - Intuit Blog","isPartOf":{"@id":"https:\/\/www.intuit.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/intuitblog.com\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/#primaryimage"},"image":{"@id":"https:\/\/intuitblog.com\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/#primaryimage"},"thumbnailUrl":"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.07.44-PM.png?w=313","datePublished":"2020-06-24T15:00:08+00:00","dateModified":"2024-03-13T16:24:10+00:00","author":{"@id":"https:\/\/www.intuit.com\/blog\/#\/schema\/person\/c834e4fcf9f17a7c296e0212786648d4"},"breadcrumb":{"@id":"https:\/\/intuitblog.com\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/intuitblog.com\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/intuitblog.com\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/#primaryimage","url":"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.07.44-PM.png?w=313","contentUrl":"https:\/\/intuitblog.com\/wp-content\/uploads\/2020\/04\/Screen-Shot-2020-06-21-at-9.07.44-PM.png?w=313"},{"@type":"BreadcrumbList","@id":"https:\/\/intuitblog.com\/innovative-thinking\/intuits-messaging-platform-on-public-cloud-scaling-high-and-beyond\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/intuitblog.com\/"},{"@type":"ListItem","position":2,"name":"Intuit\u2019s Messaging Platform on Public Cloud: Scaling High and Beyond"}]},{"@type":"WebSite","@id":"https:\/\/www.intuit.com\/blog\/#website","url":"https:\/\/www.intuit.com\/blog\/","name":"Intuit Blog","description":"Powering Financial Prosperity","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.intuit.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.intuit.com\/blog\/#\/schema\/person\/c834e4fcf9f17a7c296e0212786648d4","name":"aa251549","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/fc93e85a59284be67bfc6cba4663cf4e7389a3bfcd5160489c9844125b40f982?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/fc93e85a59284be67bfc6cba4663cf4e7389a3bfcd5160489c9844125b40f982?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fc93e85a59284be67bfc6cba4663cf4e7389a3bfcd5160489c9844125b40f982?s=96&d=identicon&r=g","caption":"aa251549"},"url":"https:\/\/www.intuit.com\/blog\/author\/aa251549\/"}]}},"header_image":"","jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/paMY30-18X","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.intuit.com\/blog\/wp-json\/wp\/v2\/posts\/4399","targetHints":{"allow":["GET","POST","PUT","PATCH"]}}],"collection":[{"href":"https:\/\/www.intuit.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.intuit.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.intuit.com\/blog\/wp-json\/wp\/v2\/users\/151418277"}],"replies":[{"embeddable":true,"href":"https:\/\/www.intuit.com\/blog\/wp-json\/wp\/v2\/comments?post=4399"}],"version-history":[{"count":28,"href":"https:\/\/www.intuit.com\/blog\/wp-json\/wp\/v2\/posts\/4399\/revisions"}],"predecessor-version":[{"id":11187,"href":"https:\/\/www.intuit.com\/blog\/wp-json\/wp\/v2\/posts\/4399\/revisions\/11187"}],"wp:attachment":[{"href":"https:\/\/www.intuit.com\/blog\/wp-json\/wp\/v2\/media?parent=4399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.intuit.com\/blog\/wp-json\/wp\/v2\/categories?post=4399"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.intuit.com\/blog\/wp-json\/wp\/v2\/tags?post=4399"},{"taxonomy":"intuit_collection","embeddable":true,"href":"https:\/\/www.intuit.com\/blog\/wp-json\/wp\/v2\/intuit_collection?post=4399"},{"taxonomy":"intuit_series","embeddable":true,"href":"https:\/\/www.intuit.com\/blog\/wp-json\/wp\/v2\/intuit_series?post=4399"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.intuit.com\/blog\/wp-json\/wp\/v2\/coauthors?post=4399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}