# Partner DLQ System Architecture Diagrams
## System Overview
```mermaid
graph TB
subgraph Users
Web[Web Dashboard]
API[API Client]
CLI[CLI Tool]
end
Web -->|HTTP/REST| Router
API -->|HTTP/REST| Router
CLI -->|HTTP/REST| Router
Router[Express Router
/api/dlq/*]
Router --> Auth[Authentication
authAllowAdmin]
Auth --> Controller[Partner DLQ Controller
partner_dlq.js]
Controller --> RabbitMQ[RabbitMQ DLQ Queue]
Controller --> MongoDB[MongoDB Tracker Status]
subgraph Background Services
Worker[DLQ Handler Worker
partner_dlq_handler.js
- Monitors DLQ
- Auto-processes messages
- Categorizes errors]
end
Worker -.-> RabbitMQ
Worker -.-> MongoDB
```
## Message Flow
```mermaid
flowchart TD
Polling[Polling Worker
Downloads] -->|Enqueue Task| Queue[Partner Tasks Queue
partner_tasks]
Queue -->|Consume| Sync[Sync Worker
Process]
Sync -->|Success| Processed[Status: PROCESSED]
Sync -->|Retry < Max| Requeue[Back to Main Queue]
Sync -->|Max Retries| DLQ[DLQ - Failed
partner_tasks_failed]
DLQ -->|DLQ Handler| Handler{Error Analysis}
Handler -->|Transient
Age < 2h| Retry[RETRY
Requeue]
Handler -->|Validation
Non-recoverable| Archive1[ARCHIVE
Record]
Handler -->|Other
Age > 24h| Archive2[ARCHIVE
Record]
```
## Error Categorization
```mermaid
flowchart TD
Failed[Failed Message in DLQ] --> Analyze[Analyze Error Message]
Analyze --> Keyword[Keyword Matching]
Analyze --> Pattern[Pattern Recognition]
Analyze --> Context[Context Analysis]
Keyword --> Category[Error Category]
Pattern --> Category
Context --> Category
Category --> Transient[TRANSIENT
• timeout
• network
• connref]
Category --> Validation[VALIDATION
• invalid
• missing
• format]
Category --> Processing[PROCESSING
• parse
• calc err
• data]
Category --> Infrastructure[INFRASTRUCTURE
• database
• fs error
• disk]
Category --> PartnerAPI[PARTNER API
• auth
• rate limit]
Category --> Unknown[UNKNOWN
• ???]
Transient -->|Age < 2h| Retry1[RETRY]
Validation --> Archive1[ARCHIVE]
Processing --> Keep1[KEEP]
Infrastructure -->|Retry w/ backoff| Retry2[RETRY]
PartnerAPI -->|Retry w/ delay| Retry3[RETRY]
Unknown -->|Manual Review| Keep2[KEEP]
```
## API Endpoint Structure
```mermaid
graph TD
Root[/api/dlq/]
Root --> Stats[GET /stats]
Root --> Messages[GET /messages?limit=50]
Root --> Process[POST /process]
Root --> RetryAll[POST /:queueName/retryAll]
Root --> RetryPos[POST /:queueName/retryByPosition]
Root --> RetryHeader[POST /:queueName/retryByHeader]
Root --> Purge[DELETE /purge]
Stats --> RMQ1[RabbitMQ.checkQueue
messageCount, consumerCount]
Stats --> Mongo1[MongoDB.aggregate
status counts]
Stats --> Mongo2[MongoDB.find
recent failures]
Messages --> RMQ2[RabbitMQ.get noAck=false
Peek & requeue messages]
Process --> RMQ3[RabbitMQ.get in loop
Parse message]
Process --> Mongo3[MongoDB.findOne
Get error details]
Process --> Cat[categorizeError
Determine category]
Cat --> Decision{Decision Logic}
Decision -->|RETRY| Update1[Update tracker + requeue]
Decision -->|ARCHIVE| Update2[Update tracker + ack]
Decision -->|KEEP| Requeue[Requeue unchanged]
Retry --> Mongo4[MongoDB.findById
Validate tracker]
Retry --> Mongo5[MongoDB.updateOne
Reset status to downloaded]
Retry --> RMQ4[RabbitMQ.sendToQueue
Enqueue with retry headers]
Archive --> Mongo6[MongoDB.updateOne
Set status=archived + metadata]
Purge --> Validate[Validate confirm=true]
Validate --> RMQ5[RabbitMQ.purgeQueue
Clear all DLQ messages]
```
## Web Dashboard Architecture
```mermaid
graph TD
Dashboard[dlq-monitor.html]
subgraph HTML Structure
Stats[Statistics Grid
6 cards:
DLQ Messages, Failed Tasks
Processing, Downloaded
Processed, Archived]
Actions[Actions Section
Refresh, Process DLQ
Dry Run, Purge]
Failures[Failures List
Recent 20 failures
Error details, Category badge
Retry/Archive buttons]
end
%% subgraph CSS Styling
%% Gradient[Gradient background]
%% Cards[Card layouts Grid]
%% Colors[Color coding:
Red=danger, Green=success
Yellow=warning, Blue=info]
%% Responsive[Responsive design]
%% end
subgraph JavaScript Logic
Refresh[refreshStats
fetch /api/dlq/partner_tasks/stats]
ProcessDLQ[processDLQ dryRun
fetch /api/dlq/partner_tasks/process]
RetryAll[retryAll queueName
fetch /api/dlq/:queueName/retryAll]
RetryByPos[retryByPosition
fetch /api/dlq/:queueName/retryByPosition]
RetryByHeader[retryByHeader
fetch /api/dlq/:queueName/retryByHeader]
PurgeDLQ[purgeDLQ
fetch /api/dlq/partner_tasks/purge]
Categorize[categorizeError
Pattern matching client-side]
AutoRefresh[Auto-refresh 30s
setInterval refreshStats 30000]
end
Dashboard --> Stats
Dashboard --> Actions
Dashboard --> Failures
Dashboard --> Gradient
Dashboard --> Cards
Dashboard --> Colors
Dashboard --> Responsive
Dashboard --> Refresh
Dashboard --> ProcessDLQ
Dashboard --> RetryTask
Dashboard --> ArchiveTask
Dashboard --> PurgeDLQ
Dashboard --> Categorize
Dashboard --> AutoRefresh
Refresh -->|Updates| Stats
Refresh -->|Populates| Failures
```
## Data Models
```mermaid
erDiagram
PartnerLogTracker ||--o{ Partner : "partnerId"
PartnerLogTracker ||--o{ Customer : "customerId"
PartnerLogTracker {
ObjectId _id
String logFileName
ObjectId partnerId
ObjectId customerId
String status
String errorMessage
Number retryCount
Date processingStartedAt
Date updatedAt
Date archivedAt
String archivedReason
String archivedBy
}
Partner {
String name
String code
}
Customer {
String name
String email
}
DLQMessage {
Buffer content
Object properties
Object fields
}
DLQMessage ||--|| Properties : has
DLQMessage ||--|| Fields : has
Properties {
Date timestamp
Object headers
String deliveryTag
}
Fields {
String routingKey
Boolean redelivered
}
```
**Status Values:**
- `downloaded` → Initial state
- `processing` → Currently being processed
- `processed` → Successfully completed
- `failed` → Triggers DLQ
- `archived` → Manually archived from DLQ
**DLQ Message Headers:**
- `x-retry-count` - Number of retry attempts
- `x-death` - Death information from RabbitMQ
- `x-retry-from-dlq` - Flag indicating manual retry
## Security Flow
```mermaid
flowchart TD
Request[HTTP Request
Header: Authorization Bearer token]
Request --> Router[Express Router]
Router --> Auth[authAllowAdmin Middleware]
Auth --> Verify{Verify JWT token}
Verify -->|Invalid| Unauth[401 Unauthorized]
Verify -->|Valid| Role{Check Role}
Role -->|Admin| Allow[req.user = decoded
Allow access]
Role -->|User| Forbid1[403 Forbidden]
Role -->|Other| Forbid2[403 Forbidden]
Allow --> Controller[Partner DLQ Controller
Authorized Access]
```
---
These diagrams provide a comprehensive visual understanding of the Partner DLQ system architecture, data flow, and component interactions.