# Withdrawals Domain Service Extraction - Visual Architecture
This diagram shows the strategic options for extracting the withdrawals domain (owned by team DC) into an isolated microservice with dedicated database and storage.
```mermaid
graph TB
subgraph "CURRENT STATE - Monolith"
subgraph "Team DC - Withdrawals Domain"
WC[Withdrawal Core Logic<br/>🏛️ Regulatory Processing<br/>💰 Payment Orchestration<br/>📊 Compliance Reporting]
end
subgraph "Dependencies (7 Major)"
AC[Customer Account Mgmt<br/>👤 AC Team<br/>🔐 Profile & Auth]
Shield[Bank Details/KYC<br/>🛡️ Shield Team<br/>🔒 Verification]
Epic[Tax Calculations<br/>🧮 Epic Team<br/>📋 HMRC Compliance]
PM[Plan Management<br/>💼 Multi-Team<br/>📈 Valuations]
IM[Investment Mgmt<br/>📊 DC Team<br/>🏦 Asset Liquidation]
SN[Stronger Nudge<br/>🎯 Shared<br/>⚠️ Intervention Logic]
MC[Marketing Content<br/>📧 Marketing Team<br/>📢 Communications]
end
subgraph "Shared Database"
DB[(Monolith Database<br/>Mixed Ownership<br/>Complex Dependencies)]
end
end
subgraph "TARGET STATE OPTIONS"
subgraph "� Option 1: Event-Driven Decoupling"
WS2[Withdrawals Service<br/>⚡ 4-6 months<br/>✅ Low Risk<br/>� Shared DB + Events<br/>🏗️ Modern Architecture Base]
end
subgraph "� Option 2: Gradual Domain Extraction"
WS1[Withdrawals Service<br/>🔄 8-12 months<br/>⚠️ Medium Risk<br/>� Dedicated DB<br/>🏗️ TypeScript Foundation]
end
subgraph "🔴 Option 3: Complete Isolation"
WS3[Withdrawals Service<br/>🎯 12-18 months<br/>🚨 Medium-High Risk<br/>🏛️ Full Independence<br/>🏗️ Enhanced Architecture]
end
end
subgraph "External Integrations"
SF[Salesforce<br/>📋 Heavy Integration]
HMRC[HMRC API<br/>🏛️ Tax Reporting]
Banks[Bank APIs<br/>💳 Payment Processing]
Providers[Pension Providers<br/>🏦 Asset Liquidation]
end
subgraph "Data Storage Options"
subgraph "Option A: Dedicated Database"
WDDB[(Withdrawals DB<br/>PostgreSQL<br/>Full Ownership)]
end
subgraph "Option B: Event Store + DB"
WDDB2[(Primary DB<br/>Current State)]
WDES[(Event Store<br/>Audit Trail)]
end
subgraph "Option C: Replicated Data"
WDDB3[(Withdrawals DB<br/>Own + Replicated)]
SYNC[Event-Driven Sync<br/>Real-time Updates]
end
end
%% Current State Dependencies
WC --> AC
WC --> Shield
WC --> Epic
WC --> PM
WC --> IM
WC --> SN
WC --> MC
WC --> DB
WC --> SF
%% Target State Options
WS1 --> WDDB
WS2 --> WDDB2
WS2 --> WDES
WS3 --> WDDB3
WS3 --> SYNC
%% External Dependencies (all options)
WS1 --> SF
WS1 --> HMRC
WS1 --> Banks
WS1 --> Providers
WS2 --> SF
WS2 --> HMRC
WS2 --> Banks
WS2 --> Providers
WS3 --> SF
WS3 --> HMRC
WS3 --> Banks
WS3 --> Providers
%% API Dependencies (target state)
WS1 -.-> AC
WS1 -.-> Shield
WS1 -.-> Epic
WS2 -.-> AC
WS2 -.-> Shield
WS2 -.-> Epic
WS3 -.-> AC
WS3 -.-> Shield
WS3 -.-> Epic
%% Styling
classDef currentState fill:#f8d7da,stroke:#721c24,stroke-width:2px
classDef optionRecommended fill:#fff3cd,stroke:#856404,stroke-width:3px
classDef optionSafe fill:#d4edda,stroke:#155724,stroke-width:2px
classDef optionRisky fill:#f8d7da,stroke:#721c24,stroke-width:2px
classDef external fill:#e2e3e5,stroke:#495057,stroke-width:1px
classDef database fill:#cce5ff,stroke:#0056b3,stroke-width:1px
class WC,AC,Shield,Epic,PM,IM,SN,MC,DB currentState
class WS1 optionRecommended
class WS2 optionSafe
class WS3 optionRisky
class SF,HMRC,Banks,Providers external
class WDDB,WDDB2,WDES,WDDB3,SYNC database
```
## Extraction Strategy Comparison
```mermaid
quadrantChart
title Withdrawals Domain Extraction Options
x-axis Low Complexity --> High Complexity
y-axis Low Risk --> High Risk
quadrant-1 Ideal
quadrant-2 Challenging
quadrant-3 Manageable
quadrant-4 Avoid
Event-Driven Decoupling: [0.2, 0.15]
Gradual Domain Extraction: [0.5, 0.35]
Complete Service Isolation: [0.8, 0.6]
```
## Implementation Timeline Comparison
```mermaid
gantt
title Withdrawals Domain Extraction Timeline Options
dateFormat YYYY-MM-DD
section Option 1: Event-Driven
Event Setup :active, phase1b, 2025-08-01, 2M
Service Boundaries :phase2b, after phase1b, 2M
Data Ownership :phase3b, after phase2b, 2M
section Option 2: Gradual Extraction
Domain Boundaries :active, phase1a, 2025-08-01, 3M
Event Infrastructure :phase2a, after phase1a, 3M
Service Extraction :phase3a, after phase2a, 3M
section Option 3: Complete Isolation
Service Foundation :active, phase1c, 2025-08-01, 5M
Data Migration :phase2c, after phase1c, 6M
Integration Layer :phase3c, after phase2c, 3M
```
## Data Architecture Options
```mermaid
flowchart TD
subgraph "Current State"
MONO[Monolith Database<br/>🏛️ All teams share tables<br/>❌ Complex dependencies]
end
subgraph "Option A: Complete Separation"
WDB[Withdrawals Database<br/>✅ Full ownership<br/>⚠️ Data replication needed]
API1[API Calls for Reference Data<br/>Real-time customer/bank data]
end
subgraph "Option B: Hybrid Approach"
WDB2[Withdrawals Database<br/>✅ Core withdrawal data]
CACHE[Read-Only Cache<br/>Customer/bank reference data]
EVENTS[Event Stream<br/>Real-time updates]
end
subgraph "Option C: Event Sourcing"
WDB3[Withdrawals Database<br/>Current state queries]
ES[Event Store<br/>Complete audit trail<br/>Regulatory compliance]
RM[Read Models<br/>Optimized for queries]
end
MONO --> WDB
MONO --> WDB2
MONO --> WDB3
WDB --> API1
WDB2 --> CACHE
WDB2 --> EVENTS
WDB3 --> ES
ES --> RM
classDef current fill:#f8d7da,stroke:#721c24
classDef recommended fill:#fff3cd,stroke:#856404
classDef complex fill:#e2e3e5,stroke:#495057
class MONO current
class WDB2,CACHE,EVENTS recommended
class WDB,API1,WDB3,ES,RM complex
```
## Service Integration Patterns
```mermaid
sequenceDiagram
participant C as Customer
participant W as Withdrawals Service
participant A as Customer Service (AC)
participant S as Bank Service (Shield)
participant T as Tax Service (Epic)
participant SF as Salesforce
Note over C,SF: Option 1: Synchronous API Calls
C->>W: Request Withdrawal
W->>A: Validate Customer
A-->>W: Customer Valid
W->>S: Verify Bank Details
S-->>W: Bank Verified
W->>T: Calculate Tax
T-->>W: Tax Calculated
W->>SF: Create Withdrawal Record
W-->>C: Withdrawal Approved
Note over C,SF: Option 2: Event-Driven (Recommended)
C->>W: Request Withdrawal
W->>W: Validate Internal Rules
W->>+EventBus: Publish WithdrawalRequested
EventBus->>A: Customer Validation Needed
EventBus->>S: Bank Verification Needed
EventBus->>T: Tax Calculation Needed
A-->>EventBus: Customer Validated
S-->>EventBus: Bank Verified
T-->>EventBus: Tax Calculated
EventBus-->>-W: All Validations Complete
W->>SF: Create Withdrawal Record
W-->>C: Withdrawal Approved
```
## Risk Assessment Matrix
| Aspect | Event-Driven Decoupling | Gradual Domain Extraction | Complete Service Isolation |
|--------|-------------------------|---------------------------|----------------------------|
| **Implementation Time** | 🟢 4-6 months | 🟡 8-12 months | 🔴 12-18 months |
| **Technical Complexity** | 🟡 Medium | 🟡 Medium-High | 🔴 High |
| **Team Coordination** | 🟢 Moderate | 🟡 High | 🔴 Very High |
| **Database Migration** | 🟢 None Required | 🟡 Gradual Migration | 🔴 Complete Migration |
| **Rollback Difficulty** | 🟢 Easy | 🟡 Moderate | 🔴 Very Difficult |
| **Operational Overhead** | 🟡 Medium | 🟡 Medium-High | 🔴 High |
| **Business Risk** | 🟢 Low | 🟡 Medium | � Medium-High |
| **Learning Value** | 🟡 Medium | 🟢 High | 🟢 Very High |
| **Team Independence** | 🟡 Partial | 🟢 High | 🟢 Complete |
| **Scalability Benefits** | 🟡 Limited | 🟢 Good | 🟢 Excellent |
| **Modern Architecture Leverage** | 🟢 High | 🟢 High | 🟢 Very High |
## Technology Stack Recommendations
### Database Technology
```yaml
PostgreSQL (Recommended):
Advantages:
- Team expertise exists
- ACID compliance for financial data
- JSON support for flexible schemas
- Strong performance
Implementation:
- Dedicated instance for withdrawals
- Read replicas for analytics
- Connection pooling
- Backup and disaster recovery
Event Store Option:
Advantages:
- Perfect audit trail
- Temporal queries
- Regulatory compliance
Disadvantages:
- Learning curve
- Limited query capabilities
- Additional complexity
```
### Messaging Infrastructure
```yaml
Apache Kafka (Recommended):
Advantages:
- High throughput
- Durable event storage
- Multiple consumer support
- Strong ordering guarantees
Implementation:
- Dedicated topics for withdrawal events
- Schema registry for event contracts
- Monitoring and alerting
- Dead letter queues
Alternative: RabbitMQ
Advantages:
- Easier initial setup
- Good management UI
- Flexible routing
Disadvantages:
- Lower throughput than Kafka
- More complex clustering
```
### API Technology
```yaml
REST APIs:
- Standard HTTP patterns
- Easy testing and debugging
- OpenAPI documentation
- Rate limiting and caching
GraphQL (Future consideration):
- Flexible data fetching
- Strong typing
- Single endpoint
- Better mobile performance
gRPC (Internal services):
- High performance
- Strong typing
- HTTP/2 benefits
- Code generation
```
## Success Criteria and Monitoring
### Key Performance Indicators
#### Technical KPIs
```yaml
Service Performance:
- Response time: 95th percentile < 500ms
- Availability: > 99.9% uptime
- Error rate: < 0.1%
- Throughput: Handle 500 requests/minute
Data Quality:
- Zero data inconsistencies
- Event processing success > 99.9%
- Complete audit trail maintained
- Regulatory compliance 100%
```
#### Business KPIs
```yaml
Customer Experience:
- Same or faster withdrawal processing
- Reduced customer support tickets
- Improved error messaging
- Better status visibility
Team Productivity:
- Faster feature delivery
- Reduced cross-team dependencies
- Independent deployment capability
- Improved testing cycles
```
### Monitoring Strategy
```yaml
Application Monitoring:
- Service health checks
- Response time tracking
- Error rate monitoring
- Business metric tracking
Infrastructure Monitoring:
- Database performance
- Message queue health
- Network latency
- Resource utilization
Business Monitoring:
- Withdrawal completion rates
- Processing time trends
- Regulatory compliance metrics
- Customer satisfaction scores
```
## Implementation Checklist
### Pre-Implementation
- [ ] Executive approval and budget allocation
- [ ] Cross-team working group established
- [ ] Technical architecture review completed
- [ ] Risk assessment and mitigation plans approved
- [ ] Customer communication strategy defined
### Phase 1: Foundation
- [ ] Domain boundaries clearly defined
- [ ] Internal APIs implemented within monolith
- [ ] Testing framework established
- [ ] Monitoring and logging enhanced
- [ ] Documentation created and maintained
### Phase 2: Service Extraction
- [ ] Dedicated database schema created
- [ ] Event infrastructure implemented
- [ ] API contracts defined and agreed
- [ ] Service authentication implemented
- [ ] Load testing completed
### Phase 3: Production Deployment
- [ ] Blue-green deployment strategy implemented
- [ ] Gradual traffic migration plan executed
- [ ] Performance monitoring validated
- [ ] Rollback procedures tested
- [ ] Team training completed
## Conclusion and Next Steps
### Recommended Approach: Event-Driven Decoupling (Leveraging Modern Architecture)
**Rationale**:
1. **Lowest Risk**: No database migration required initially
2. **Fastest Time to Value**: 4-6 months vs 8-18 months for other options
3. **Modern Foundation**: Leverages existing TypeScript clean architecture
4. **Learning Opportunity**: Establish patterns for future extractions
5. **Reversible**: Easy to rollback if issues arise
6. **Foundation for Future**: Can evolve to complete isolation later
### Immediate Next Steps (Next 30 Days)
1. **Architecture Assessment**: Audit existing TypeScript contexts and identify enhancement opportunities
2. **Team Formation**: Establish cross-team working group with clear roles
3. **Technical Spike**: Proof-of-concept event infrastructure integrated with existing patterns
4. **Modern Architecture Review**: Detailed technical design review leveraging current clean architecture
5. **Project Planning**: Detailed timeline and resource allocation based on existing foundation
### Success Factors
- **Clear Communication**: Regular updates to all stakeholders
- **Incremental Progress**: Celebrate small wins along the way
- **Customer Focus**: Maintain or improve customer experience
- **Technical Excellence**: Proper testing, monitoring, and documentation
- **Team Collaboration**: Strong coordination between DC, AC, Shield, and Epic teams
The withdrawals domain extraction is a significant undertaking that will establish PensionBee's microservice capabilities and enable future domain extractions across the organization.
## Service Dependencies Flow
```mermaid
flowchart LR
subgraph "Phase 1: Proof of Concept"
direction TB
P1A[Unit Price Scraping<br/>2-3 weeks<br/>🟢 Low Risk]
P1B[Waitlist Management<br/>3-4 weeks<br/>🟡 Medium Risk]
end
subgraph "Phase 2: Scale Services"
direction TB
P2A[RAF Service<br/>4-5 weeks<br/>🟡 Medium Risk]
P2B[Document Generation<br/>6-8 weeks<br/>🟡 High Complexity]
end
subgraph "Phase 3: Complex Domains"
direction TB
P3A[Future Extraction Candidates<br/>Based on learnings]
P3B[Service Mesh<br/>Cross-cutting concerns]
end
P1A --> P1B
P1B --> P2A
P2A --> P2B
P2B --> P3A
P3A --> P3B
classDef phase1 fill:#d4edda,stroke:#155724
classDef phase2 fill:#fff3cd,stroke:#856404
classDef phase3 fill:#e2e3e5,stroke:#495057
class P1A,P1B phase1
class P2A,P2B phase2
class P3A,P3B phase3
```
## Risk Assessment Summary
| Service | Team Ownership | External Deps | SF Coupling | DB Boundaries | Extraction Risk |
|---------|---------------|---------------|-------------|---------------|-----------------|
| Unit Price Scraping | ✅ Single (Web) | ✅ Minimal | ✅ Light | ✅ Dedicated | 🟢 **Low** |
| RAF Service | ✅ Single (Marketing) | ⚠️ Medium | ⚠️ Medium | ✅ Dedicated | 🟡 **Medium** |
| Waitlist Management | ✅ Single (Marketing) | ✅ Minimal | ✅ Light | ✅ Dedicated | 🟡 **Medium** |
| Document Generation | ❌ Multi-Team | ⚠️ Medium | ❌ Heavy | ❌ Shared | 🟡 **High** |
| **Withdrawals** | ❌ **Multi-Team** | ❌ **Heavy** | ❌ **Heavy** | ❌ **Shared** | 🔴 **Very High** |
| Customer Account | ❌ Core Platform | ❌ Heavy | ❌ Heavy | ❌ Shared | 🔴 **Very High** |
| KYC/Bank Details | ❌ Security Critical | ❌ Heavy | ❌ Heavy | ❌ Shared | 🔴 **Very High** |
## Implementation Success Factors
1. **Start Small**: Begin with Unit Price Scraping service for maximum learning
2. **Validate Patterns**: Use early services to establish microservice patterns
3. **Team Independence**: Ensure each extracted service has clear ownership
4. **Monitoring First**: Implement observability before extraction
5. **Rollback Strategy**: Maintain monolith functionality during transition