A production-style event-driven microservices system that automatically classifies support tickets using AI and updates the UI in real time.
Support teams often handle large volumes of tickets manually, leading to:
- Slow response times
- Incorrect routing of issues
- Poor user experience
This system automates ticket classification and processing using AI, improving efficiency and enabling real-time visibility.
This project simulates how modern SaaS platforms (like Zendesk, Freshdesk) handle support workflows:
- Users create support tickets
- AI classifies them asynchronously
- System updates status in real-time
- Multiple services consume the same event stream
Designed to demonstrate scalable backend architecture, not just CRUD functionality.
- β‘ Event-driven architecture (RabbitMQ)
- π€ AI-powered ticket classification (Groq LLM)
- π Retry + Dead Letter Queue (DLQ) handling
- π Real-time UI updates via WebSockets
- ποΈ Persistent state with PostgreSQL (Neon)
- π§© Microservices-based design
- π Eventual consistency with DB as source of truth
- Frontend: https://ai-support-platform-seven.vercel.app
- Ticket API: https://ticket-service-nx7h.onrender.com
Frontend (React)
β
βΌ
Ticket Service (NestJS + Prisma)
β
βΌ
RabbitMQ (Event Bus)
β
ββββββββββββββββΊ AI Service (Python - Groq)
β β
β βΌ
β ticket.ai_processed
β
ββββββββββββββββΊ Audit Service (Event Store)
β
ββββββββββββββββΊ Notification Service
β
ββββββββββββββββΊ WebSocket Service
β
βΌ
Real-time UI updates
βΌ
Ticket Service (consumes AI result β updates DB)
- Handles ticket creation
- Stores data in PostgreSQL (Neon)
- Publishes
ticket.created - Consumes AI results to update DB (source of truth)
-
Consumes
ticket.created -
Classifies using Groq LLM
-
Publishes:
ticket.ai_processedticket.ai_failed
-
Implements retry + DLQ handling
- Subscribes to event stream
- Emits real-time updates to frontend
- Logs all system events
- Enables traceability and debugging
- Acts as event store
- Subscribes to critical events
- Designed for alerts, emails, escalation workflows
- User creates ticket
- Stored in DB with
PROCESSINGstatus - Event published β
ticket.created
-
AI service consumes event
-
Classifies ticket
-
Publishes:
ticket.ai_processedβticket.ai_failedβ
-
Ticket service consumes AI result
-
Updates DB:
CLASSIFIED+ category + confidence- or
FAILED
- WebSocket service emits update
- Frontend updates instantly
{
"event_type": "ticket.created",
"aggregate_id": "ticket_id",
"payload": {
"status": "PROCESSING",
"subject": "...",
"priority": "..."
}
}{
"event_type": "ticket.ai_processed",
"aggregate_id": "ticket_id",
"payload": {
"status": "CLASSIFIED",
"category": "technical",
"confidence": 0.95
}
}{
"event_type": "ticket.ai_failed",
"aggregate_id": "ticket_id"
}- React (Vite)
- Socket.IO client
- Tailwind CSS
- NestJS
- Prisma ORM
- PostgreSQL (Neon)
- RabbitMQ
- Python
- Groq API
- RabbitMQ
- Node.js
- Socket.IO
- RabbitMQ
- Docker
- Neon (serverless Postgres)
- Render (backend deployment)
- Vercel (frontend deployment)
- Used RabbitMQ to decouple services and enable scalability
- Maintained Ticket Service as single source of truth
- Used WebSocket for real-time updates instead of polling
- Implemented retry + DLQ to handle failures safely
- Designed system for multiple independent consumers
- Missing fields caused UI inconsistencies
- Fixed by enforcing structured payloads
-
Debugged across:
- Vercel (frontend)
- Render (backend)
- Neon (DB)
- RabbitMQ
- Ensured DB reflects final state
- UI reflects real-time updates
- Prevented infinite retries
- Used DLQ for safe failure management
docker-compose upcd ticket-service
npm install
npm run start:devcd ai-orchestrator
pip install -r requirements.txt
python main.pycd websocket-service
npm install
node index.jscd support-ui
npm install
npm run devRABBITMQ_URL=amqp://user:pass@localhost:5672
DATABASE_URL=postgresql://...
FRONTEND_URL=http://localhost:5173
EXCHANGE=support.events- π Authentication & multi-tenant support
- π Analytics dashboard
- π© Email / Slack notifications
- π§Ύ Ticket history timeline
- π€ Improved AI models
Rishika Reddy
- Backend & MERN Developer
- Exploring AI + System Design
- Building production-style systems
This project demonstrates how real-world systems are built using:
- Event-driven architecture
- Microservices
- Asynchronous processing
- Real-time communication