Belitsoft > .NET Case Studies Examples > JPMorganChase' .NET Product Engineering

Inside JPMorganChase' Fintech .NET Product Engineering

In 2026, .NET (C#, .NET Core) strengthens its position as one of the primary platforms for enterprise product engineering in the US market. In addition to Citi, which uses .NET for automating internal banking workflows, JPMorganChase is another example of an enterprise financial institution that relies on .NET to build secure, stable, scalable, market-leading financial technology products. When JPMorganChase, a global leader in banking for corporations, governments, and institutions in more than 100 countries, widely relies on this Microsoft technology, it's a sign that .NET is one of the best platforms for enterprise software product development today

Contents

Why .NET Is JPMorganChase's Choice for Enterprise Product Engineering 

JPMorganChase is one of the oldest American financial institutions, with more than 200 years of history.

In 2026, senior .NET developers help JPMorganChase's Commercial & Investment Bank teams in Irvine (CA), Plano (TX) and Chicago (IL) design and deliver software products for healthcare payments (electronic payment processing through InstaMed platform), securities services (custody and fund administration for institutional clients), and electronic trading (multi-broker trading through Neovest platform).

Modern .NET fits JPMorganChase's product engineering strategy because as a cloud-native strategy it requires containerization, orchestration, resilience, security, observability, and CI/CD — every one of which .NET supports natively. 

.NET Supports Cloud-Native Containerization

JPMorganChase has built one of the largest container-based infrastructures in banking. The bank packages its software into standardized containers or portable units that include the software and everything it needs to run, ready to deploy anywhere from the bank's own data centers to public clouds. JPMorganChase uses .NET inside this container-based infrastructure for healthcare payments, securities custody, fund administration, and electronic trading. 

Cloud-native containerization is important to JPMorganChase because the bank's size (tens of thousands of engineers building thousands of services) requires portability across the bank's hybrid infrastructure, standard packaging across different development teams, and efficient use of server capacity. Without containerization, it would be significantly harder for a bank of this size to deploy across multiple clouds, keep development teams working the same way, and control server costs at this scale. 

  • Containers let the bank run the same applications on AWS, Azure, Google Cloud, or its own data centers without dependency on one cloud vendor. 
  • They give every development team the same way to package software. 
  • And by allowing more services to run on each server, containerization can reduce the costs of hosting them.

.NET Capabilities for Cloud-Native Containerization

Built-in Container Packaging

If each team at banks or other large organizations writes its own instructions (Dockerfiles) for packaging software into containers, different instructions will produce inconsistent results and security gaps. .NET packages software into containers, using Microsoft's official building blocks by default, without requiring a separate Dockerfile. So the bank's software delivery processes have one less tool to maintain and one less place where security mistakes can happen. 

Official Microsoft Container Images

.NET fits the supply-chain documentation aspect of containerization. Container images are software components. When banks use them, they come under the same third-party software risk management scrutiny as everything else the bank uses: what is in them, who maintains them, how quickly security flaws get fixed. Microsoft provides official .NET base images that banks use as the foundation for their production application images, signed and patched as Microsoft products. So the bank can show Microsoft's documentation instead of writing its own. 

Stripped-down Container Packages (Chiseled Images)

The bank runs hundreds of services in containers, and every piece of software inside every container is a potential security vulnerability the security team has to track and fix. Microsoft provides a special version of their Linux-based container packages for .NET that includes only what the software needs to run and nothing else. So the bank's .NET services run on the smallest possible foundation, with the smallest target for attackers and the shortest list of security fixes the security team has to apply. 

AOT Compilation

The orchestrator inside cloud-native containerization infrastructure scales software up and down based on demand, but a container that takes too long to start cannot scale up fast enough to handle traffic spikes. Moreover, large software packages cost more to store and distribute across the bank's servers. .NET has a way to prepare software in advance, before it runs, producing containers 80-90% smaller than before and starting in milliseconds. This reduces the bank's infrastructure cost for every service it operates.

Container-Aware Runtime

Cloud-native containerization gives each piece of containerized software a strict budget for how much computer memory and processing power it can use. If the software uses more than its budget, the system shuts it down and starts a fresh copy, which causes banking transactions in progress to fail. Container-aware runtime lets .NET software automatically adjust to the resource budget (memory, processing power) it has been given inside a container. So .NET-built software does not exceed its limits, does not get shut down, and the bank does not lose transactions.

.NET Fits Cloud-Native Orchestration 

JPMorganChase manages its containerized software through Kubernetes, the platform that keeps the bank's services running by starting new copies when load increases, replacing failed copies automatically, and sending customer requests only to working services. A dedicated engineering team at the bank builds and operates Kubernetes across the bank's hybrid infrastructure, including Amazon's EKS on AWS plus Kubernetes on Azure, Google Cloud, and the bank's own data centers. JPMorganChase's .NET workloads in healthcare payments, securities custody, fund administration, and electronic trading all operate under this Kubernetes management.

Cloud-native orchestration is important to JPMorganChase because the bank's services run 24/7 across global business lines and cannot wait for an engineer to restart them when they fail. Without orchestration, it would be significantly harder for a bank of this size to keep services running through failures, traffic spikes, and software updates. 

  • The orchestrator automatically restarts failing services and routes customer requests away from them. 
  • It scales services up and down as banking workloads change throughout the day. 
  • And it lets the bank deploy software updates without taking services offline. 

.NET Capabilities for Cloud-Native Orchestration 

Built-in Health Check Endpoints

Kubernetes needs to know which copies of a service are healthy enough to receive customer requests and which need to be restarted. Without feedback from each service, Kubernetes does not know which copies are available and which are down. It keeps sending customer requests to all copies, including broken ones, and customers see errors. .NET has built-in health check endpoints for Kubernetes. So Kubernetes restarts failing .NET services automatically and sends customer requests only to .NET services that are working.

Built-in Key Management for Scaling

When traffic increases, Kubernetes starts more copies of a service to share the load. But running multiple copies of the same service creates a problem: how do customer logins, encrypted cookies, and security tokens work across copies? .NET has built-in key management for multi-copy situations, sharing the necessary security keys across all running copies of a service automatically. So the bank's .NET services scale up without logging customers out or breaking their security tokens when Kubernetes starts new copies.

Graceful Shutdown

If Kubernetes is going to shut down a copy of a service due to a software update, scaling down, or server maintenance, it tells the service to finish its current work and then shut down. If the service does not understand this request and keeps working, Kubernetes stops it forcibly, which may interrupt the banking transactions the service was processing and cause them to fail. .NET understands the request from Kubernetes and finishes the transactions it is currently processing before shutting down. So when JPMorgan Chase updates its .NET services or scales them down, customers in the middle of paying a bill, placing a trade, or accessing their accounts can complete their actions instead of seeing errors.

.NET Has All Tools Required to Implement Cloud-Native Resilience Patterns

If orchestration is about managing failures at the infrastructure level by restarting failed copies of a service and redirecting customer requests away from broken ones, resilience covers failures inside the bank's software itself, when one piece of it needs an answer from another one but the answer is slow or never comes. JPMorganChase requires application resiliency from the code in the bank's software to keep it working, even when other systems it needs answers from, like an account service, a fraud check, or a customer database, slow down or fail. JPMorganChase's senior .NET engineers apply these resiliency practices when building software for healthcare payments, securities custody, fund administration, and electronic trading.

Cloud-native resilience is important to JPMorganChase because the bank's software needs answers from many other systems to process a single customer transaction, and a slow or failing system would otherwise stop the transaction from completing. Without resilience patterns, it would be significantly harder for a bank of this size to keep customer transactions moving through temporary problems, avoid leaving customers waiting forever when a problem cannot be solved, and keep the rest of the bank's software working when one part fails.

  • When a request doesn't go through because of a short outage, the retry pattern forces the code to wait a moment and try again, up to a set number of attempts. For example, when a patient's insurance payer briefly doesn't respond to an eligibility check from a doctor's office, JPMorganChase's InstaMed payment technology, working under this pattern, can keep retrying ahead of the visit until the payer starts responding, so the patient checks in and the visit goes ahead without the staff or the patient noticing anything went wrong.
  • However, if the response from a service is taking too long, the timeout pattern forces the code to stop waiting. Any wait that takes too long often makes software unresponsive, causing irritation. So, for example, when one broker is slow to acknowledge an order on JPMorganChase's Neovest platform, the timeout cuts off the wait, and the trader can route the order to a different broker instead.
  • Without isolation, a slow part of a system can make other parts of it also slow, so another pattern, the bulkhead pattern, forces the code to isolate the work with this slow part from other parts. So, for example, when JPMorganChase's fraud-monitoring system slows down, customers can still log in to the Chase Mobile app, see their balances, and view their recent transactions.

.NET Capabilities for Cloud-Native Resilience

Microsoft actively promotes cloud-native reliability. Its Azure Well-Architected Framework documents 31 design patterns that support reliable software, and many of them are, in essence, resilience patterns. Microsoft also develops its own products with these patterns in mind, so .NET 10 is no exception. For cloud-native systems where one piece of software depends on many others, like JPMorganChase's banking software, five core resilience patterns - retry, timeout, circuit breaker, bulkhead, and fallback - have high priority and are strong requirements for any .NET engineer working in a bank. .NET 10 has built-in tools to implement all of these core patterns.

Built-in Outbound Resilience Pipeline

Modern banking software platforms often use microservices: separate services for business capabilities such as accounts, payments, customer data, pricing, or ledger functions. Banking microservices exchange requests, responses, events, and data via HTTP/REST as a major synchronous method.

No one can guarantee that when one banking microservice asks a second microservice for information (for example, to service a bank client's request), the answer comes back right away. So the question is what a microservice should do when it doesn't get a response. Senior architects use a special configuration mechanism that manages microservice behavior in these situations. A good development platform has to include such a configuration mechanism, otherwise there is no uniformity in how different microservices work, and every microservice team will configure microservice behavior its own way. Enterprise doesn't tolerate that kind of architectural mistake, especially in banking.

Microsoft accounts for this modern requirement and offers a solution in its .NET platform: the Microsoft.Extensions.Http.Resilience component. It is responsible for the logic of how a microservice works when it doesn't get a response from another microservice: retry, circuit breaker, and timeout. For example, it determines whether the problem was temporary, and if so, whether it resolves after a short period of time. If it resolves quickly, work continues so the bank client doesn't even notice. If it doesn't resolve quickly, the bank client doesn't wait forever for a solution and instead gets an answer that the service is currently down. And at the internal level, the unresolved request isn't allowed to pull all the cloud resources onto itself, which would otherwise hang the whole system.

Built-in Graceful Degradation with Cached Data

If a bank app customer is trying to do some operation, do not show an error right away, even if technically there is one. Resilience engineers insist on that.

One elegant technical solution used in the industry is to show data from cache when fresh data is temporarily unavailable. The cached data may already be stale. But stale data with a timestamp is often better than no data and a dead screen.

For example, instead of showing "balance data unavailable because the service did not respond", the app can show "balance as of 9:22". Even if it is already 12 PM, and the balance may have changed, the customer still sees something useful.

Any resilience strategy needs to be centralized for the reasons already discussed, and pulling data from cache is no exception. The Microsoft.Extensions.Http.Resilience component mentioned earlier lets you implement this kind of fallback from one place too.

The bank avoids empty screens and unnecessary "service unavailable" responses when slightly stale data is still useful.

Never miss a post! Share it!

Written by
Chief Innovation Officer / Partner
I've been leading a department specializing in custom software development for 20 years.
5.0
1 review

Rate this article

Leave a comment
Your email address will not be published.

Recommended posts

Belitsoft Blog for Entrepreneurs

Our Clients' Feedback

zensai
technicolor
crismon
berkeley
hathway
howcast
fraunhofer
apollomatrix
key2know
regenmed
moblers
showcast
ticken
Next slide
Let's Talk Business
Do you have a software development project to implement? We have people to work on it. We will be glad to answer all your questions as well as estimate any project of yours. Use the form below to describe the project and we will get in touch with you within 1 business day.
Contact form
We will process your personal data as described in the privacy notice
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply
Contact us

USA +1 (917) 410-57-57
700 N Fairfax St Ste 614, Alexandria, VA, 22314 - 2040, United States

UK +44 (20) 3318-18-53
26/28 Hammersmith Grove, London W6 7HA

Poland +48 222 922 436
Warsaw, Poland, st. Elektoralna 13/103

Email us

[email protected]

to top