<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pravin Durai &#8211; Sandhata</title>
	<atom:link href="https://resources.sandhata.com/author/pravin-durai/feed/" rel="self" type="application/rss+xml" />
	<link>https://resources.sandhata.com</link>
	<description>Transform the Business of IT</description>
	<lastBuildDate>Thu, 29 Oct 2026 06:40:14 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.26</generator>
	<item>
		<title>The Microservice Hangover</title>
		<link>https://resources.sandhata.com/the-microservice-hangover/</link>
		<pubDate>Wed, 22 Apr 2026 07:03:42 +0000</pubDate>
		<dc:creator><![CDATA[Pravin Durai]]></dc:creator>
				<category><![CDATA[API Management]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[API management]]></category>
		<category><![CDATA[APIs]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[Integration]]></category>
		<category><![CDATA[Sandhata]]></category>
		<category><![CDATA[Service Virtualization]]></category>

		<guid isPermaLink="false">https://resources.sandhata.com/?p=5884</guid>
		<description><![CDATA[<p>The microservices gold rush is over. Teams that chased the pattern through 2019 and 2022 are now managing systems that take three engineers to debug a single failed transaction, require five teams to coordinate a two-line configuration change, and go down in four places when one database has a bad morning. The original promise was [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://resources.sandhata.com/the-microservice-hangover/">The Microservice Hangover</a> appeared first on <a rel="nofollow" href="https://resources.sandhata.com">Sandhata</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>The microservices gold rush is over.</p>
<p>Teams that chased the pattern through 2019 and 2022 are now managing systems that take three engineers to debug a single failed transaction, require five teams to coordinate a two-line configuration change, and go down in four places when one database has a bad morning.</p>
<p>The original promise was real: split your application into independent services so each piece can be built, deployed, and scaled without touching anything else. When it works, it is genuinely powerful. When the boundaries are wrong, you do not get the benefits of microservices. You get all of the cost.</p>
<p>In 2026, the most important architectural question in Java shops is no longer “how many services should we build?” It is “do these boundaries actually make sense?”</p>
<p>&nbsp;</p>
<table width="624">
<tbody>
<tr>
<td width="624"><em>“The right architecture is the one that matches the actual structure of your organization and your problem. Everything else is decoration.”</em></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h2>The Myth That Started Most of the Trouble</h2>
<p>The assumption underneath most over-engineered microservice systems is this: smaller services scale better.</p>
<p>On the surface, the logic sounds reasonable. Less code, fewer responsibilities, simpler deployments. In practice, splitting a system into many small pieces does not make each piece faster. It adds a cost every time those pieces need to communicate. And in any real application, the pieces communicate constantly.</p>
<p>Here is what that looks like in a Java e-commerce system.</p>
<p>A user searches for running shoes. Fifty results come back from the Catalogue service. Each result needs a current price check from the Discount service. The Catalogue service, using Spring Cloud OpenFeign, makes 50 individual HTTP calls, one per product, before it can return the page.</p>
<p>Underneath this, Kubernetes is running, Docker containers are optimized, auto-scaling is configured. The page is still slow. The bottleneck is not computing power. It is the time spent on 50 separate “please respond to me” round-trips across a network. Each one is fast in isolation, 5 to 10 milliseconds. Fifty of them in sequence adds up to a visible delay on every single page load.</p>
<p>&nbsp;</p>
<table width="624">
<tbody>
<tr>
<td width="624"><strong>Plain English: What is a network round-trip?</strong></td>
</tr>
<tr>
<td width="624">Every time one service asks another for information, it sends a request and waits for a reply. That waiting time is called a round-trip. On a local network it might be 2ms. Multiply that by 50 calls and you have added 100ms to every page load before any business logic runs. Users feel this.</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h2>The Distributed Monolith: The Worst of Both Worlds</h2>
<p>The e-commerce example above has a name: a Distributed Monolith. The services are physically separated, running in different containers on different infrastructure. But they cannot function independently. The Catalogue service is useless without the Discount service. If Discount goes down, the product page breaks. The system behaves like a single application, but with all the operational overhead of a distributed one.</p>
<p>This is the failure mode that is not discussed enough, because it does not look like a failure from the outside. The architecture diagram has all the right boxes and arrows. The Kubernetes cluster is running. Teams feel like they did the modern thing.</p>
<p>The tell is this: if two services must be updated together every time a feature changes, they are not two services. They are one service distributed across two repositories.</p>
<p>&nbsp;</p>
<table width="624">
<tbody>
<tr>
<td width="624"><em>“The question is not how small can this be. The question is: if this service went down for four hours, what else would break?”</em></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>If the answer is “everything,” the boundary is wrong. Real service independence means a service can go down, recover, and catch up without any other part of the system losing data or failing its users.</p>
<p>&nbsp;</p>
<h2>Three Ways Java Teams Are Breaking Their Own Systems</h2>
<h3>1. Everything talks synchronously</h3>
<p>Synchronous communication means Service A sends a request to Service B and waits for a reply before doing anything else.</p>
<p>When everything is healthy, this works fine. When Service B is slow or briefly unavailable, Service A is stuck waiting. Every new request to Service A backs up behind the previous one. If Service C also depends on Service B, it backs up too. The failure moves outward until the whole system is unresponsive.</p>
<p>This is how a slow email verification service takes down an order confirmation flow. The Order Service waits for a 200 OK from the Email Service before confirming the order. The Email Service is under load. Orders queue up. Users see errors. Nobody touched the Order Service.</p>
<p>&nbsp;</p>
<table width="624">
<tbody>
<tr>
<td width="624"><strong>Plain English: What is synchronous vs. asynchronous?</strong></td>
</tr>
<tr>
<td width="624">Synchronous is like a phone call. You wait on the line until the other person answers and responds before you do anything else. Asynchronous is like sending a text. You send the message and continue with your day. The reply comes when it comes. In software, asynchronous communication between services means neither side has to wait on the other to keep working.</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>The fix is to shift operations that do not need an immediate response to asynchronous messaging. Apache Kafka is the standard tool for this in Java ecosystems. Instead of Service A waiting for Service B, Service A drops a message into a Kafka topic and moves on. Service B picks up the message when it is ready.</p>
<p>There is a specific pattern that makes this reliable called the Transactional Outbox.</p>
<p>&nbsp;</p>
<table width="624">
<tbody>
<tr>
<td width="624"><strong>Plain English: The Transactional Outbox Pattern</strong></td>
</tr>
<tr>
<td width="624">When your Order Service saves an order to the database, it also writes a small note to a special &#8216;outbox&#8217; table in the same save operation. A background process reads that outbox table and publishes the message to Kafka. Because the order and the note are saved together in a single database transaction, if the application crashes mid-process, the note survives. The message still gets sent. No orders fall silently into a gap between &#8216;saved to database&#8217; and &#8216;sent to Kafka.&#8217;</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h3>2. The database is doing work nobody is watching</h3>
<p>Spring Data JPA is the most widely used database tool in the Java ecosystem. It generates SQL queries from your code automatically, which saves enormous amounts of development time. It also generates queries you did not intend, at volumes you did not anticipate, if you stop paying attention to what it produces.</p>
<p>The most common problem is the N+1 query.</p>
<p>&nbsp;</p>
<table width="624">
<tbody>
<tr>
<td width="624"><strong>Plain English: What is an N+1 query?</strong></td>
</tr>
<tr>
<td width="624">Imagine you ask a library assistant for a list of 100 books. That is 1 request. Then, for each book, you walk back to the desk and ask separately who the author is. That is 100 more requests. Total: 101 trips to the desk instead of 1.  In software, this happens when JPA loads a list of records (say, 100 orders), then makes a separate database call for each record to load the related data (the customer details for each order). One request to your application produces 101 database queries. At low traffic, this is invisible. At scale, it saturates the database connection pool and slows everything that touches the database.</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>The fix is to tell JPA to load related data in the same query using a JOIN, or to use batch loading. Both are straightforward once you know the problem exists. The challenge is that the problem is invisible unless you are watching the queries.</p>
<p>The rule is simple: every significant query your application runs in production should be reviewed. Enable SQL logging during development. Use tools like P6Spy or Hibernate’s built-in logging to see the actual SQL being sent to the database. If you see repeated queries with a pattern, you have an N+1 problem. Fix it before it reaches production.</p>
<p>&nbsp;</p>
<h3>3. When something breaks, nobody knows where</h3>
<p>A request to a single-application system touches one codebase. When it fails, you look at one log file.</p>
<p>A request to a distributed system might touch eight services before something goes wrong. Which service failed? At what point in the chain? Was it slow, or did it return an error? Which downstream service caused the problem?</p>
<p>Without the right tooling, the answers to these questions require manually correlating timestamps across eight separate log files. This takes hours. In a production incident, hours are expensive.</p>
<p>&nbsp;</p>
<table width="624">
<tbody>
<tr>
<td width="624"><strong>Plain English: What is distributed tracing?</strong></td>
</tr>
<tr>
<td width="624">Every request that enters the system gets a unique tracking number (called a Trace ID) that travels with it through every service it visits. When something fails, you look up that Trace ID and see the complete picture: every service the request touched, how long each step took, and exactly where it broke. It works like a package tracking number, except for your API calls.</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>The standard for implementing this in 2026 is OpenTelemetry. It is vendor-neutral, widely supported in the Java ecosystem, and integrates with Jaeger, Grafana, Datadog, and most observability platforms.</p>
<p>The non-negotiable rule: if you cannot trace a request through your entire system on your local machine before you deploy, you cannot operate it in production. Observability is an engineering requirement. It should be built before the first service ships, not retrofitted six months later when something breaks in a way nobody understands.</p>
<p>&nbsp;</p>
<h2>The Decision Framework: When a Separate Service Is Justified</h2>
<p>Before splitting anything into its own service, answer these four questions honestly.</p>
<p>&nbsp;</p>
<table width="624">
<tbody>
<tr>
<td width="624"><strong>Service Boundary Checklist</strong></td>
</tr>
<tr>
<td width="624">•       Can this component be deployed without coordinating with any other team or codebase?</p>
<p>•       Can this component fail completely without taking anything else with it?</p>
<p>•       Does this component have a genuinely different scaling requirement than the rest of the system?</p>
<p>•       Does a separate team own this, with no shared development dependencies?</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>If three or four answers are yes, a separate service is appropriate. If two or more answers are no, the service boundary is premature. Build a well-isolated module within your existing codebase instead, and revisit the question when the conditions change.</p>
<p>&nbsp;</p>
<h2>The Modular Monolith: The Most Underrated Architecture in Java</h2>
<p>The industry spent five years treating “monolith” as an insult. In 2026, the teams shipping fastest are building Modular Monoliths, and they are outpacing their microservice-heavy counterparts on delivery speed and system stability.</p>
<p>&nbsp;</p>
<table width="624">
<tbody>
<tr>
<td width="624"><strong>Plain English: What is a Modular Monolith?</strong></td>
</tr>
<tr>
<td width="624">A single application, but with strict internal walls between business domains. The billing code cannot reach directly into inventory code. The order management module cannot call the user management module through a back door. Each module owns its own data, its own logic, and its own interface with the outside world. The boundaries are enforced in code. It deploys as one unit, so there are no network calls between modules, no distributed transaction problems, and no distributed tracing needed just to understand what a single user action did.</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>When a module grows to the point where it genuinely needs to scale independently or be owned by a fully autonomous team, extracting it into a real service is straightforward, because the boundary was already clean and well-defined.</p>
<p>A Modular Monolith is not a compromise or a step backward. It is the responsible default for any system that has not yet proven it needs the operational complexity of distributed services. The operational complexity of microservices is a cost you should pay only when the benefit justifies it.</p>
<p>&nbsp;</p>
<table width="624">
<tbody>
<tr>
<td width="624"><em>“A well-structured Modular Monolith will beat a poorly partitioned microservice system in delivery speed, incident response time, and developer experience. Almost every time.”</em></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h2>Building Resilience Into What You Already Have</h2>
<p>Distributed systems have failures. Services go down. Networks slow. Third-party APIs miss their response time commitments. The goal is not to eliminate failures. It is to make sure individual failures do not become system-wide outages.</p>
<p>Resilience4j is the standard Java library for this. It gives you three core tools.</p>
<h3>Circuit Breaker</h3>
<p>When a downstream service starts failing repeatedly, the circuit breaker stops sending it requests for a set period. Instead of continuously hammering a struggling service and making the failure worse, the system gives it time to recover. Requests during the recovery window get a fallback response.</p>
<p>&nbsp;</p>
<table width="624">
<tbody>
<tr>
<td width="624"><strong>Plain English: Circuit Breaker</strong></td>
</tr>
<tr>
<td width="624">Like a fuse box in your house. When a circuit is overloaded, the fuse trips and cuts the power to that circuit before the wiring catches fire. You fix the problem, reset the fuse, power comes back on. A circuit breaker in software works the same way. When a service is failing, you stop sending it traffic temporarily, let it recover, then gradually let traffic flow again.</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h3>Retry with Backoff</h3>
<p>Many failures are transient. A service might briefly be unreachable and recover within two seconds. A retry mechanism automatically re-attempts the request a defined number of times, with a pause between each attempt. This handles momentary blips without surfacing an error to the user. The pause between retries (called exponential backoff) prevents the retrying system from overwhelming the recovering service with requests.</p>
<p>&nbsp;</p>
<h3>Fallback</h3>
<p>A fallback defines what the system does when a service is genuinely unavailable. In a user registration flow, if the email verification service is down, a fallback might be: complete the registration in the database, queue the verification email in Kafka for when the service recovers, and return a success response to the user. The user is not blocked. The email goes when the system is healthy again.</p>
<p>These three patterns together represent the minimum viable safety net for any distributed system. None of them are optional once services depend on each other.</p>
<p>&nbsp;</p>
<h2>The Architecture Audit: Six Questions for Your Next Design Review</h2>
<p>&nbsp;</p>
<table width="624">
<tbody>
<tr>
<td width="624"><strong>Run this before your next technical design session</strong></td>
</tr>
<tr>
<td width="624">•       Are service boundaries drawn at domain lines, or at &#8216;it felt too big&#8217; lines?</p>
<p>•       Are services communicating synchronously for operations that do not need an immediate response?</p>
<p>•       Are you monitoring the actual SQL that JPA generates in production?</p>
<p>•       Can you trace a single user request across every service it touches, in under two minutes?</p>
<p>•       Do you have circuit breakers on every external service dependency?</p>
<p>•       Could your system be reorganized into a well-structured Modular Monolith without losing any meaningful technical capability?</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>If more than two answers are uncomfortable, the architecture review is overdue. These are not edge-case concerns. Each one represents a category of production incident that is entirely preventable with the right design decision made earlier.</p>
<p>&nbsp;</p>
<h2>The Principle That Settles Most Architecture Debates</h2>
<p>Microservices are a solution to organizational and scaling problems that have already materialized. They are a destination, not a starting point.</p>
<p>The right size for a service is the smallest unit that can be genuinely deployed, owned, and operated independently by a team, for a clear purpose, without negotiating with anyone else. If that definition does not describe what you are building, the service is too small.</p>
<p>Every architectural decision has a carrying cost: the operational complexity you take on and maintain indefinitely. That cost is only worth paying when the capability you gain cannot be achieved any other way.</p>
<p>Build for the actual problem in front of you. The architecture should serve the business, not validate a technical preference.</p>
<p>&nbsp;</p>
<table width="624">
<tbody>
<tr>
<td width="624"><strong>Is Your Architecture Ready for What’s Next?</strong></p>
<p><em>We help engineering teams audit their service boundaries, identify operational risk, and build the right foundation for scale.</em></p>
<p><a href="https://sandhata.com/contact"><strong>→ Request an Architecture Review</strong></a></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://resources.sandhata.com/the-microservice-hangover/">The Microservice Hangover</a> appeared first on <a rel="nofollow" href="https://resources.sandhata.com">Sandhata</a>.</p>
]]></content:encoded>
			</item>
		<item>
		<title>Generic Message Buffering &#124; Camunda 7</title>
		<link>https://resources.sandhata.com/generic-message-buffering-camunda-7/</link>
		<pubDate>Tue, 11 Jul 2023 13:49:08 +0000</pubDate>
		<dc:creator><![CDATA[Pravin Durai]]></dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[APIs]]></category>
		<category><![CDATA[Cammunda Message buffering]]></category>
		<category><![CDATA[camunda]]></category>
		<category><![CDATA[Camunda 7]]></category>
		<category><![CDATA[camunda engine]]></category>
		<category><![CDATA[camunda-bpm-platform]]></category>
		<category><![CDATA[Compliance]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DevOps Innovation Platform]]></category>
		<category><![CDATA[Generic Message Buffering]]></category>
		<category><![CDATA[Integration]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java 8]]></category>
		<category><![CDATA[message-buffer]]></category>
		<category><![CDATA[Sandhata]]></category>
		<category><![CDATA[Service Virtualization]]></category>
		<category><![CDATA[spring-boot]]></category>
		<category><![CDATA[Transformation]]></category>

		<guid isPermaLink="false">https://resources.sandhata.com/?p=5497</guid>
		<description><![CDATA[<p>Imagine multiple messages waiting in a message catch event.   When a single throw event is triggered, the data is processed without any issues. However, if multiple message events are thrown simultaneously, only the first one is successfully processed, while the others fail.   This is because the message catch event is busy handling the first message [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://resources.sandhata.com/generic-message-buffering-camunda-7/">Generic Message Buffering | Camunda 7</a> appeared first on <a rel="nofollow" href="https://resources.sandhata.com">Sandhata</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p><span data-contrast="auto">Imagine multiple messages waiting in a message catch event. </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<p><span data-contrast="auto">When a single throw event is triggered, the data is processed without any issues. However, if multiple message events are thrown simultaneously, only the first one is successfully processed, while the others fail. </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<p><span data-contrast="auto">This is because the message catch event is busy handling the first message event.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<p><span data-contrast="auto">We recently spotted this issue with Camunda 7’s message catch event.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<h2><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}">U</span><b><span data-contrast="auto">nlocking The Solution To This Challenge</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></h2>
<p><span data-contrast="auto">Our team of experts fabricated a groundbreaking &#8220;Generic Message Buffering&#8221; logic, with which we’ve revolutionised the way messages are processed asynchronously, effectively resolving any scenario you may encounter. </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<p><span data-contrast="auto">Fig. 1.1 unveils the powerful list of message catch events eagerly awaiting the trigger.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<p><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<div id="attachment_5503" style="width: 310px" class="wp-caption aligncenter"><a href="https://resources.sandhata.com/wp-content/uploads/2023/07/Fig1.1-1.png"><img class="size-medium wp-image-5503" src="https://resources.sandhata.com/wp-content/uploads/2023/07/Fig1.1-1-300x117.png" alt="" width="300" height="117" srcset="https://resources.sandhata.com/wp-content/uploads/2023/07/Fig1.1-1-300x117.png 300w, https://resources.sandhata.com/wp-content/uploads/2023/07/Fig1.1-1.png 602w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">Fig1.1</p></div>
<p><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span><span data-contrast="auto">In Figure 2.1, we present the logic for Generic Message Buffering. By sending a POST request, we can activate the BPM process described below. Additionally, we have the ability to specify the retry count and retry delay as request parameters. Once the request is triggered, we conduct a basic validation to ensure all necessary information, such as message name, payload, process instance id, and business key, is present. </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<p><span data-contrast="auto">If all the required data is available, we proceed to send the message to its destination within the &#8220;Message Send Task&#8221; depicted in Figure 2.1. </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<p><span data-contrast="auto">If the message is successfully picked up and processed by the message catch event, we encounter no issues.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<div id="attachment_5500" style="width: 310px" class="wp-caption aligncenter"><a href="https://resources.sandhata.com/wp-content/uploads/2023/07/Fig2.1.png"><img class="size-medium wp-image-5500" src="https://resources.sandhata.com/wp-content/uploads/2023/07/Fig2.1-300x125.png" alt="" width="300" height="125" srcset="https://resources.sandhata.com/wp-content/uploads/2023/07/Fig2.1-300x125.png 300w, https://resources.sandhata.com/wp-content/uploads/2023/07/Fig2.1.png 602w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">Fig2.1</p></div>
<p><span data-contrast="auto">In a situation where the message catch event is already occupied processing another message, throwing our own message will result in failure. This is a common occurrence in real-time scenarios, and it is up to the developers to determine how the flow should be handled in such cases.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<p><span data-contrast="auto">In our specific case, the failed message will be caught by the boundary event. The error message will then be examined in detail within the &#8220;Read Error Message&#8221; process (Fig 2.1).</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<p><span data-contrast="auto">In the event of an error, we can:</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<ul>
<li data-leveltext="●" data-font="Calibri" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;●&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Distinguish between errors that require retry logic. </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559685&quot;:720,&quot;335559740&quot;:276,&quot;335559991&quot;:360}"> </span></li>
<li data-leveltext="●" data-font="Calibri" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;●&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Determine if it is a business error or a technical error. </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559685&quot;:720,&quot;335559740&quot;:276,&quot;335559991&quot;:360}"> </span></li>
<li data-leveltext="●" data-font="Calibri" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;●&quot;}" aria-setsize="-1" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Necessitate the involvement of technical experts, if it happens to be a business error</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559685&quot;:720,&quot;335559740&quot;:276,&quot;335559991&quot;:360}"> </span></li>
</ul>
<p><span data-contrast="auto">When encountering a retriable error, we make an attempt to retry the operation. The number of retries and the delay between retries is determined by the input request.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<h2>Potential Scenarios In Re-try</h2>
<p><span data-contrast="auto">In the context of re-try logic, there are two potential scenarios to consider:</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<ul>
<li data-leveltext="●" data-font="Calibri" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;●&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">In one of the re-try attempts, the message can be successfully delivered to the end system.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559685&quot;:720,&quot;335559740&quot;:276,&quot;335559991&quot;:360}"> </span></li>
</ul>
<div id="attachment_5506" style="width: 310px" class="wp-caption aligncenter"><a href="https://resources.sandhata.com/wp-content/uploads/2023/07/MicrosoftTeams-image-12.jpg"><img class="size-medium wp-image-5506" src="https://resources.sandhata.com/wp-content/uploads/2023/07/MicrosoftTeams-image-12-300x140.jpg" alt="" width="300" height="140" srcset="https://resources.sandhata.com/wp-content/uploads/2023/07/MicrosoftTeams-image-12-300x140.jpg 300w, https://resources.sandhata.com/wp-content/uploads/2023/07/MicrosoftTeams-image-12-768x358.jpg 768w, https://resources.sandhata.com/wp-content/uploads/2023/07/MicrosoftTeams-image-12-1024x478.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">Fig 3.1</p></div>
<ul>
<li data-leveltext="●" data-font="Calibri" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;●&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Alternatively, if the maximum number of re-try attempts is reached without success, the message will be marked as an error.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559685&quot;:720,&quot;335559740&quot;:276,&quot;335559991&quot;:360}"> </span></li>
</ul>
<p><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559685&quot;:720,&quot;335559731&quot;:0,&quot;335559740&quot;:276}"> </span><span data-contrast="auto">If the maximum re-try attempts have been exceeded and the message still hasn&#8217;t been delivered successfully, it will require manual re-processing (see Fig 3.2).</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<div id="attachment_5502" style="width: 310px" class="wp-caption aligncenter"><a href="https://resources.sandhata.com/wp-content/uploads/2023/07/Fig3.2.png"><img class="wp-image-5502 size-medium" src="https://resources.sandhata.com/wp-content/uploads/2023/07/Fig3.2-300x123.png" alt="" width="300" height="123" srcset="https://resources.sandhata.com/wp-content/uploads/2023/07/Fig3.2-300x123.png 300w, https://resources.sandhata.com/wp-content/uploads/2023/07/Fig3.2.png 602w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">Fig 3.2</p></div>
<p><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<p>&nbsp;</p>
<h2><span data-contrast="none"> </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:2,&quot;335551620&quot;:2,&quot;335559740&quot;:276}"> </span><b><span data-contrast="auto">Key Advantages</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></h2>
<ul>
<li data-leveltext="●" data-font="Calibri" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;●&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Streamlined Error Handling: </span></b><span data-contrast="auto">By effectively managing busy message catch events, we can significantly mitigate potential errors during data processing.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559685&quot;:720,&quot;335559740&quot;:276,&quot;335559991&quot;:360}"> </span></li>
</ul>
<ul>
<li data-leveltext="●" data-font="Calibri" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;●&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Efficient Data Re-processing: </span></b><span data-contrast="auto">Our approach allows for a substantial reduction in the amount of data that needs to undergo re-processing.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559685&quot;:720,&quot;335559740&quot;:276,&quot;335559991&quot;:360}"> </span></li>
</ul>
<ul>
<li data-leveltext="●" data-font="Calibri" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;●&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Versatile Solution:</span></b><span data-contrast="auto"> Utilizing the same bpmn models, we can easily adapt and apply them to various similar use cases simply by modifying the message name.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559685&quot;:720,&quot;335559740&quot;:276,&quot;335559991&quot;:360}"> </span></li>
</ul>
<h2><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span><b><span data-contrast="auto">Optimizing Efficiency</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></h2>
<p><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span><span data-contrast="auto">In order to optimize efficiency, it is vital that both the target BPM and the message buffering BPM are connected to a centralized database. This will allow for seamless integration and streamlined performance. Maintaining a unified database instance is key to achieving optimal results.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<p><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559740&quot;:276}"> </span></p>
<p>The post <a rel="nofollow" href="https://resources.sandhata.com/generic-message-buffering-camunda-7/">Generic Message Buffering | Camunda 7</a> appeared first on <a rel="nofollow" href="https://resources.sandhata.com">Sandhata</a>.</p>
]]></content:encoded>
			</item>
		<item>
		<title>We are Sandhata: Meet Pravin</title>
		<link>https://resources.sandhata.com/we-are-sandhata-meet-pravin/</link>
		<pubDate>Thu, 02 Dec 2021 15:34:37 +0000</pubDate>
		<dc:creator><![CDATA[Pravin Durai]]></dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Career]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[People]]></category>

		<guid isPermaLink="false">https://resources.sandhata.com/?p=4395</guid>
		<description><![CDATA[<p>Based in the UK, Pravin Durai is a consultant with Sandhata. Pravin shares the story of his career journey, his experience as an intern and his thoughts on the future. &#160; How did you get started working in IT? I have been working in IT for 5 years now, and have been with Sandhata Technologies for [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://resources.sandhata.com/we-are-sandhata-meet-pravin/">We are Sandhata: Meet Pravin</a> appeared first on <a rel="nofollow" href="https://resources.sandhata.com">Sandhata</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Based in the UK, Pravin Durai is a consultant with Sandhata. Pravin shares the story of his career journey, his experience as an intern and his thoughts on the future.</p>
<p>&nbsp;</p>
<h4>How did you get started working in IT?</h4>
<p>I have been working in IT for 5 years now, and have been with Sandhata Technologies for the past 1.5 years. My career as a software engineer started with Accenture (in Bangalore, India) in 2016 as a Performance Engineer and then I moved to a Developer role.<span id="more-4395"></span></p>
<p>In these past 5 years I have worked on various project as a performance engineer and developer. Working in many different roles has given me exposure and helped me to understand the complete SDLC.</p>
<p>Recently I have completed a Masters in Computer Science with Industrial Placement.</p>
<p>&nbsp;</p>
<h4>Why did you decide to pursue a Masters?</h4>
<p>I have always wanted to do a post grad degree, and I was inspired by my cousin who did his Masters in the US. But after my graduation, my parents wanted me to work so I started my career as a software engineer. However, I never gave up on my dream of pursuing a Masters. After working for around 3 years I started preparing for the Masters exams at the Queen Mary University of London.</p>
<p>&nbsp;</p>
<h4>Why did you choose to do a Masters course with an industrial placement year?</h4>
<p><strong><img class="size-medium wp-image-4400 alignright" src="https://resources.sandhata.com/wp-content/uploads/2021/12/PravinDurai_mini-233x300.png" alt="" width="233" height="300" srcset="https://resources.sandhata.com/wp-content/uploads/2021/12/PravinDurai_mini-233x300.png 233w, https://resources.sandhata.com/wp-content/uploads/2021/12/PravinDurai_mini.png 418w" sizes="(max-width: 233px) 100vw, 233px" /></strong></p>
<p>The primary objective of doing a Masters is to get an opportunity to learn and to work on some niche and cutting edge skills. I thought the addition of an Industrial Experience year would be a perfect opportunity to test my knowledge gained during my Masters. Also, I was certain that this would increase the odds of me getting a job offer in the UK.</p>
<p>&nbsp;</p>
<h4>What was the most useful or interesting thing you learnt in your Masters?</h4>
<p>During my Masters we were given assignments for each module. Back in India during my undergrad almost all my assignments were theoretical. But on this Masters course it’s the complete opposite and I really liked that. Concrete, real-life projects helped me to understand things in a much better way.</p>
<p>&nbsp;</p>
<h4>How did you hear about Sandhata?</h4>
<p>My Masters dissertation was on the subject of “Cloud Computing”. During my Masters, my professor wanted me to showcase my project to an actual IT company and get feedback. I had been following Sandhata Technologies on LinkedIn for a while and thought they would be a good choice to help me out with this since they have expertise and experience in delivering cloud migration projects for clients. So I approached Sandhata via LinkedIn and they were quite happy to support me.</p>
<p>&nbsp;</p>
<h4>How did you find your intern role at Sandhata?</h4>
<p>I was interacting with Kumar [one of the Sandhata management team] to get feedback on my dissertation and he mentioned about an interesting project where they have an application in .Net and they were looking for someone to convert that into a Java based application. Since I had already worked on similar technology in my previous role, without a second thought I asked if I could work on this project. This is where my journey with Sandhata began.</p>
<blockquote><p>&#8220;I am lucky that I have got the opportunity to work on many different technologies in a short period of time which has broadened my knowledge and experience.&#8221;</p></blockquote>
<h4>Please share a bit about what you did on your internship.</h4>
<p>During my internship, I worked on a couple of projects: one for one of our clients, Vodafone UK, and the other one was an inhouse project. I particularly enjoyed my first project as I was lucky to work with some very bright people within Sandhata, from whom I learnt a lot.</p>
<p>&nbsp;</p>
<h4>How did you find joining Sandhata during the COVID pandemic?</h4>
<p>Although I started my graduate role during COVID pandemic, the onboarding process was quite smooth. I received my laptop and new joiners kit much quicker than I expected and was supported the whole way. People within Sandhata are very friendly and helped me a lot to setup everything, guiding me whenever I got stuck with any issues.</p>
<p>&nbsp;</p>
<h4>Now you have moved from an intern role to a permanent role. How are you finding it?</h4>
<p>Since I have joined Sandhata, I have always kept my eyes open, looking for any new opportunity. When I moved to a permanent role, one opportunity that I got is to work on the GCAT application. This was a great project for me as there was a big learning curve on new skills and I gave lots of demos to the client, quickly becoming confident and managing to answer their questions thoroughly. The project was delivered on time and the client was very happy with it, which has helped me to prove that I am a strong resource in the team.</p>
<p>&nbsp;</p>
<h4>What is next for you, Pravin?</h4>
<p>I see there are lots of interesting areas e.g. DevOps, Pega, Salesforce within Sandhata which I haven’t worked on so far. I would like to work in these areas to broaden my experience and grow my skillset.</p>
<p>My journey with Sandhata Technologies is just getting started…</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Learn More</h2>
<p>If you are interested in joining Sandhata, <a href="https://resources.sandhata.com/careers/">check out our careers page</a> for the latest job openings and how to contact us.</p>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://resources.sandhata.com/we-are-sandhata-meet-pravin/">We are Sandhata: Meet Pravin</a> appeared first on <a rel="nofollow" href="https://resources.sandhata.com">Sandhata</a>.</p>
]]></content:encoded>
			</item>
	</channel>
</rss>
