Field Agent: Bahrul Rozak
Operation Codename: I-Financing V5
Location: PT IMS, Tangerang
Duration: July 2025 - October 2025
Mission Briefing
This report details my covert operation to implement microservices architecture for the I-Financing V5 Base system at PT IMS. The mission required deep technical expertise in Angular, .Net Core, and microservices patterns while collaborating with a cross-functional team under tight deadlines.
Technical Approach
The existing monolithic architecture was showing signs of strain under increased user load and feature complexity. My team was tasked with designing a scalable solution using the following technologies:
- Angular 15 for frontend
- .NET Core 6 for backend services
- Docker for containerization
- Kubernetes for orchestration
- RabbitMQ for message brokering
- MSSQL for data persistence
Architecture Diagram
Key Challenges
1. Service Decomposition
Breaking down the monolith required careful analysis of domain boundaries. We identified these core services:
// Example service definition in .NET Core
public class LoanService : ILoanService
{
private readonly ILoanRepository _loanRepository;
private readonly IMessageBus _messageBus;
public LoanService(ILoanRepository loanRepository, IMessageBus messageBus)
{
_loanRepository = loanRepository;
_messageBus = messageBus;
}
public async Task ProcessApplication(LoanApplication app)
{
// Business logic here
await _loanRepository.AddAsync(app);
await _messageBus.PublishAsync(new LoanApplicationReceived(app.Id));
}
}
2. Cross-Service Communication
We implemented both synchronous (HTTP) and asynchronous (message-based) communication patterns:
Communication Patterns Used
| Scenario | Pattern | Technology |
|---|---|---|
| Immediate data needs | Synchronous | HTTP/REST |
| Event notification | Asynchronous | RabbitMQ |
| Data consistency | Saga Pattern | MassTransit |
3. Distributed Transaction Management
Implementing the Saga pattern was critical for maintaining data consistency across services:
// Example Saga implementation
public class LoanProcessingSaga :
MassTransitStateMachine<LoanProcessingSagaState>
{
public State Submitted { get; private set; }
public State UnderReview { get; private set; }
public State Approved { get; private set; }
public Event<LoanApplicationSubmitted> ApplicationSubmitted { get; private set; }
public LoanProcessingSaga()
{
InstanceState(x => x.CurrentState);
Initially(
When(ApplicationSubmitted)
.Then(context => Log(context))
.TransitionTo(Submitted)
.Publish(context => new BeginUnderReview(context.Saga.CorrelationId))
);
// Additional state transitions...
}
}
Operational Results
The migration to microservices yielded significant improvements:
45%
Reduction in deployment failures
3.2s → 0.8s
Average response time improvement
99.95%
Uptime achieved
Lessons Learned
- Domain analysis is critical: Proper service boundaries prevent costly refactors
- Observability is non-negotiable: Invest in logging, metrics, and tracing from day one
- Team alignment matters: Microservices require cultural shifts in development practices