17 KiB
Tài Liệu Kiến Trúc
Dịch vụ: mkt-whatsapp-service-net
Phiên bản: 1.0
Cập nhật lần cuối: 2026-01-18
Tổng Quan Hệ Thống
MKT WhatsApp Service là một microservice toàn diện được xây dựng trên nguyên tắc Clean Architecture, triển khai các pattern Domain-Driven Design (DDD) và CQRS. Dịch vụ cung cấp ba khả năng cốt lõi:
- Chatbot Tự Động: Luồng hội thoại dựa trên quy tắc
- AI Chatbot: Phản hồi thông minh được hỗ trợ bởi LLM
- Quản Lý Khách Hàng: CRM thống nhất cho tương tác WhatsApp
Kiến Trúc Cấp Cao
graph TB
subgraph External["Bên Ngoài"]
WA[WhatsApp Cloud API]
OPENAI[OpenAI GPT-4]
Customer[Người Dùng Cuối]
end
subgraph "GoodGo Platform"
GATEWAY[Traefik Gateway]
subgraph "mkt-whatsapp-service-net"
API[API Layer]
APP[Application Layer]
DOMAIN[Domain Layer]
INFRA[Infrastructure Layer]
end
PG[(PostgreSQL)]
REDIS[(Redis)]
RABBIT[RabbitMQ]
end
subgraph "Other Services"["Dịch Vụ Khác"]
MERCHANT[merchant-service]
ANALYTICS[analytics-service]
end
Customer -->|Tin nhắn| WA
WA -->|Webhooks| GATEWAY
GATEWAY --> API
API --> APP
APP --> DOMAIN
APP --> INFRA
INFRA --> PG
INFRA --> REDIS
INFRA --> WA
INFRA --> OPENAI
INFRA --> RABBIT
RABBIT --> MERCHANT
RABBIT --> ANALYTICS
style Customer fill:#2C3E50,color:#ECF0F1,stroke:#34495E,stroke-width:3px
style WA fill:#3498DB,color:#ECF0F1,stroke:#2980B9,stroke-width:3px
style OPENAI fill:#3498DB,color:#ECF0F1,stroke:#2980B9,stroke-width:3px
style GATEWAY fill:#3498DB,color:#ECF0F1,stroke:#2980B9,stroke-width:3px
style API fill:#8E44AD,color:#ECF0F1,stroke:#7D3C98,stroke-width:2px
style APP fill:#8E44AD,color:#ECF0F1,stroke:#7D3C98,stroke-width:2px
style DOMAIN fill:#8E44AD,color:#ECF0F1,stroke:#7D3C98,stroke-width:2px
style INFRA fill:#8E44AD,color:#ECF0F1,stroke:#7D3C98,stroke-width:2px
style PG fill:#34495E,color:#ECF0F1,stroke:#2C3E50,stroke-width:2px
style REDIS fill:#34495E,color:#ECF0F1,stroke:#2C3E50,stroke-width:2px
style RABBIT fill:#34495E,color:#ECF0F1,stroke:#2C3E50,stroke-width:2px
style MERCHANT fill:#27AE60,color:#ECF0F1,stroke:#229954,stroke-width:2px
style ANALYTICS fill:#27AE60,color:#ECF0F1,stroke:#229954,stroke-width:2px
Các Tầng Clean Architecture
1. Tầng API (MktWhatsAppService.API)
Trách Nhiệm: Giao diện HTTP, xử lý request/response
Controllers
WebhooksController- Xác minh webhook WhatsApp và sự kiện tin nhắnWhatsAppAccountsController- Quản lý kết nối tài khoảnConversationsController- Endpoints hội thoại và tin nhắnCustomersController- Quản lý hồ sơ khách hàngAutomationFlowsController- CRUD luồng tự độngAIAgentsController- Cấu hình AI agentAnalyticsController- Số liệu và báo cáo
Background Jobs
ConversationExpiryJob- Đóng hội thoại hết hạn 24hMessageStatusSyncJob- Đồng bộ trạng thái gửi/đã đọc từ WhatsAppFlowSchedulerJob- Kích hoạt luồng tự động theo thời gian
2. Tầng Application (MktWhatsAppService.API/Application)
Trách Nhiệm: Use cases, điều phối, CQRS
Commands (Ghi)
Tài Khoản WhatsApp
ConnectWhatsAppAccountCommand- Đăng ký tài khoản mớiUpdateWebhookCommand- Cập nhật cấu hình webhookDisconnectWhatsAppAccountCommand- Vô hiệu hóa tài khoản
Tin Nhắn
ProcessIncomingMessageCommand- Xử lý tin nhắn WhatsApp đếnSendMessageCommand- Gửi tin nhắn điSendTemplateMessageCommand- Gửi template đã phê duyệt
Tự Động
CreateAutomationFlowCommand- Định nghĩa luồng mớiUpdateFlowStepCommand- Sửa logic luồngActivateFlowCommand- Bật tự độngDeactivateFlowCommand- Tắt tự động
AI Agent
CreateAIAgentCommand- Cấu hình chatbot AIUpdateAgentPersonalityCommand- Sửa hành vi AIGenerateAIResponseCommand- Lấy trả lời AI
Khách Hàng
CreateCustomerCommand- Đăng ký khách hàng mớiUpdateCustomerOptInCommand- Quản lý đồng ý opt-inTagCustomerCommand- Thêm/xóa tags
Queries (Đọc)
Hội Thoại
GetConversationQuery- Một hội thoại với tin nhắnGetActiveConversationsQuery- Liệt kê hội thoại đang diễn raSearchConversationsQuery- Tìm kiếm toàn văn bản
Khách Hàng
GetCustomerQuery- Hồ sơ khách hàng theo WaIdGetCustomersQuery- Danh sách khách hàng có phân trangGetCustomerConversationHistoryQuery- Tất cả hội thoại trong quá khứ
Phân Tích
GetMessageStatsQuery- Số liệu lượng tin nhắnGetConversationMetricsQuery- Thời gian phản hồi, tỷ lệ giải quyếtGetAutomationPerformanceQuery- Thống kê thực thi luồng
MediatR Pipeline Behaviors
- Logging Behavior - Ghi log tất cả commands/queries
- Validation Behavior - Tích hợp FluentValidation
- Transaction Behavior - Unit of Work cho commands
3. Tầng Domain (MktWhatsAppService.Domain)
Trách Nhiệm: Logic nghiệp vụ, entities, quy tắc nghiệp vụ
Aggregates
WhatsAppAccount Aggregate
Aggregate Root: WhatsAppAccount
Thuộc Tính:
Id(Guid)ShopId(Guid)PhoneNumberId(string) - ID số điện thoại WhatsAppAccessToken(string, mã hóa)WebhookUrl(string)Status(Active/Suspended)MessageTier(1K/10K/100K/Unlimited)
Phương Thức Nghiệp Vụ:
Activate()- Kích hoạt tài khoảnUpdateWebhook(url)- Thay đổi URL webhookSuspend()- Tạm ngừng tài khoản
Domain Events:
WhatsAppAccountConnectedEventWebhookVerifiedEvent
Conversation Aggregate
Aggregate Root: Conversation
Thuộc Tính:
Id(Guid)ShopId(Guid)CustomerWaId(string)Status(Active/Closed/Expired)AssignedAgentId(Guid, nullable)LastMessageAt(DateTime)Tags(List)
Entities:
MessageId(Guid)WhatsAppMessageId(string)Direction(Inbound/Outbound)Content(MessageContent value object)Status(Sent/Delivered/Read/Failed)Timestamp(DateTime)
Phương Thức Nghiệp Vụ:
AddMessage(content, direction)- Thêm tin nhắn vào hội thoạiAssignToAgent(agentId)- Gán hội thoạiClose()- Đóng hội thoạiCheckExpiry()- Kiểm tra cửa sổ 24h
Domain Events:
ConversationStartedEventMessageReceivedEventMessageSentEventConversationClosedEvent
AutomationFlow Aggregate
Aggregate Root: AutomationFlow
Thuộc Tính:
Id(Guid)ShopId(Guid)FlowName(string)TriggerType(Keyword/Event/Schedule)TriggerConfig(JSON)IsActive(bool)
Entities:
FlowStepOrder(int)Action(SendMessage/TagCustomer/CallWebhook/Delay)ActionConfig(JSON)Conditions(JSON, optional)NextStepId(int, nullable)
Phương Thức Nghiệp Vụ:
AddStep(action, config, conditions)- Thêm bước luồngValidateFlow()- Kiểm tra chu trình, xác thực cấu trúcActivate()- Bật luồngDeactivate()- Tắt luồng
AIAgent Aggregate
Aggregate Root: AIAgent
Thuộc Tính:
Id(Guid)ShopId(Guid)AgentName(string)Personality(AgentPersonality value object)KnowledgeBaseId(Guid, nullable)IsActive(bool)
Value Objects:
AgentPersonalityTone(Friendly/Professional/Casual)Language(Vietnamese/English)Constraints(List)PromptTemplate(string)
Phương Thức Nghiệp Vụ:
UpdatePersonality(personality)- Thay đổi hành vi AIActivate()- Bật phản hồi AIDeactivate()- Tắt AI
Customer Aggregate
Aggregate Root: Customer
Thuộc Tính:
Id(Guid)WaId(string) - ID WhatsApp (số điện thoại)ShopId(Guid)Name(string)ProfilePictureUrl(string, nullable)Consent(OptInConsent value object)Tags(List)CustomFields(Dictionary<string, string>)FirstContactedAt(DateTime)
Value Objects:
OptInConsentStatus(OptedIn/OptedOut/Pending)Timestamp(DateTime)Source(Web/WhatsApp/Manual)
Phương Thức Nghiệp Vụ:
UpdateOptIn(status, source)- Quản lý đồng ýAddTag(tag)- Thêm tag khách hàngRemoveTag(tag)- Xóa tagUpdateCustomField(key, value)- Đặt trường tùy chỉnh
4. Tầng Infrastructure (MktWhatsAppService.Infrastructure)
Trách Nhiệm: Mối quan tâm bên ngoài, lưu trữ, API clients
Truy Cập Dữ Liệu
MktWhatsAppServiceContext- EF Core DbContext- Cấu hình Entity sử dụng Fluent API
- Repositories triển khai interfaces domain
Dịch Vụ Bên Ngoài
WhatsAppCloudApiClient
HTTP client cho WhatsApp Cloud API với chính sách resilience Polly:
Phương Thức:
SendMessageAsync()- Gửi tin nhắn văn bản/media/tương tácSendTemplateMessageAsync()- Gửi templates đã phê duyệtMarkMessageAsReadAsync()- Gửi biên nhận đã đọcGetMediaAsync()- Tải xuống file media
Resilience:
- Retry: 3 lần thử, backoff mũ (500ms, 1.5s, 4.5s)
- Circuit Breaker: Tỷ lệ lỗi 50%, lấy mẫu 30s, ngắt 30s
- Timeout: 10s mỗi request
LlmService
Trừu tượng hóa nhà cung cấp LLM (triển khai OpenAI):
Phương Thức:
GenerateResponseAsync()- Lấy phản hồi AI với ngữ cảnhExtractIntentAsync()- Phân loại ý định người dùngStreamResponseAsync()- Streaming cho phản hồi dài
Tính Năng:
- Theo dõi sử dụng token
- Tính toán chi phí
- Quản lý cửa sổ ngữ cảnh (10 tin nhắn cuối)
- Bộ lọc an toàn
Luồng Xử Lý Tin Nhắn
Luồng Tin Nhắn Đến
sequenceDiagram
participant WA as WhatsApp
participant Webhook as WebhooksController
participant Cmd as ProcessIncomingMessageHandler
participant AutoEngine as AutomationEngine
participant AIEngine as AIEngine
participant DB as Database
WA->>Webhook: POST /webhooks (sự kiện tin nhắn)
Webhook->>Webhook: Xác minh chữ ký
Webhook->>Cmd: ProcessIncomingMessageCommand
Webhook-->>WA: 200 OK (ngay lập tức)
Cmd->>DB: Lấy/Tạo Hội Thoại
Cmd->>DB: Lưu Tin Nhắn
alt Luồng Tự Động Hoạt Động
Cmd->>AutoEngine: Kiểm tra triggers
AutoEngine->>AutoEngine: Khớp từ khóa/điều kiện
AutoEngine->>WA: Gửi phản hồi tự động
else AI Agent Hoạt Động
Cmd->>AIEngine: GenerateAIResponseCommand
AIEngine->>DB: Lấy lịch sử (10 tin nhắn cuối)
AIEngine->>AIEngine: Xây dựng prompt
AIEngine->>OpenAI: Chat completion
OpenAI-->>AIEngine: Phản hồi AI
AIEngine->>WA: Gửi tin nhắn AI
else Phản Hồi Thủ Công
Cmd->>DB: Đánh dấu hội thoại chờ xử lý
Cmd->>RabbitMQ: Phát hành event
end
Luồng Tin Nhắn Đi
sequenceDiagram
participant API as ConversationsController
participant Cmd as SendMessageHandler
participant Domain as Conversation Aggregate
participant WA as WhatsAppCloudApiClient
participant DB as Database
API->>Cmd: SendMessageCommand
Cmd->>DB: Lấy Hội Thoại
Cmd->>Domain: CheckExpiry()
alt Trong Cửa Sổ 24h
Domain-->>Cmd: Cửa sổ hợp lệ
Cmd->>WA: SendMessageAsync()
WA-->>Cmd: ID tin nhắn WhatsApp
Cmd->>Domain: AddMessage()
Cmd->>DB: Lưu
else Ngoài Cửa Sổ 24h
Domain-->>Cmd: Cửa sổ hết hạn
Cmd->>WA: SendTemplateMessageAsync()
WA-->>Cmd: ID tin nhắn (cửa sổ mới)
Cmd->>Domain: AddMessage()
Cmd->>DB: Lưu
end
Mô Hình Dữ Liệu
Database Schema
Xem Tài Liệu Database Schema để biết cấu trúc bảng chi tiết và indexes.
Các bảng chính:
whatsapp_accounts- Kết nối tài khoản doanh nghiệpconversations- Hội thoại khách hàngmessages- Tin nhắn riêng lẻ (thuộc sở hữu của hội thoại)customers- Hồ sơ khách hàngautomation_flows- Định nghĩa luồng tự độngflow_steps- Cấu hình bước luồngai_agents- Cấu hình AI agent
Indexes Quan Trọng
-- Truy vấn lưu lượng cao
CREATE INDEX idx_conversations_shop_status ON conversations(shop_id, status);
CREATE INDEX idx_messages_conversation_timestamp ON messages(conversation_id, timestamp DESC);
CREATE INDEX idx_customers_shop_waid ON customers(shop_id, wa_id);
-- Tra cứu tự động
CREATE INDEX idx_flows_shop_active ON automation_flows(shop_id, is_active);
Integration Events
Dịch vụ phát hành events đến RabbitMQ để các dịch vụ khác tiêu thụ:
Published Events
WhatsAppMessageReceivedEvent
- Phát ra khi: Khách hàng gửi tin nhắn đến shop
- Người tiêu thụ: analytics-service (số liệu), merchant-service (thông báo)
ConversationClosedEvent
- Phát ra khi: Hội thoại được đóng hoặc hết hạn
- Người tiêu thụ: analytics-service (thời lượng hội thoại), merchant-service
AITokenUsageEvent
- Phát ra khi: AI agent tạo phản hồi
- Người tiêu thụ: wallet-service (thanh toán), analytics-service (theo dõi chi phí)
CustomerOptInChangedEvent
- Phát ra khi: Trạng thái opt-in khách hàng thay đổi
- Người tiêu thụ: dịch vụ marketing (cập nhật quyền)
Cân Nhắc Bảo Mật
Xác Minh Chữ Ký Webhook
Tất cả webhooks đến từ WhatsApp được xác minh sử dụng HMAC-SHA256:
var signature = Request.Headers["X-Hub-Signature-256"];
var payload = await ReadBodyAsStringAsync();
var computedSignature = ComputeHmacSha256(payload, _appSecret);
if (!SecureCompare(signature, computedSignature))
return Unauthorized();
Mã Hóa Access Token
WhatsApp access tokens được mã hóa khi lưu trữ sử dụng AES-256-GCM:
// Lưu trong database dưới dạng bytes đã mã hóa
public string AccessToken
{
get => _encryption.Decrypt(_encryptedToken);
private set => _encryptedToken = _encryption.Encrypt(value);
}
Rate Limiting
Bộ rate limiter phân tán dựa trên Redis:
- 60 requests/phút mỗi shop
- 1000 requests/phút mỗi service instance
Tuân Thủ GDPR
- Dữ liệu khách hàng có thể được xuất qua API
- Quyền bị lãng quên: xóa mềm với ẩn danh hóa dữ liệu
- Theo dõi đồng ý opt-in với timestamps
- Áp dụng chính sách lưu giữ dữ liệu
Tối Ưu Hóa Hiệu Suất
Chiến Lược Caching
Sử Dụng Redis Cache:
- Ngữ Cảnh Hội Thoại - 10 tin nhắn cuối (TTL: 1 giờ)
- Hồ Sơ Khách Hàng - Khách hàng được truy cập thường xuyên (TTL: 30 phút)
- Luồng Hoạt Động - Luồng tự động (TTL: 5 phút)
- Bộ Đếm Rate Limit - Số lượng request mỗi shop (TTL: 1 phút)
Tối Ưu Hóa Truy Vấn
- Sử dụng Dapper cho truy vấn đọc nhiều (bỏ qua EF Core)
- Triển khai phân trang cho tất cả list endpoints
- Index trên foreign keys và cột được lọc thường xuyên
- Không có truy vấn N+1 (sử dụng
Include()hoặc projections)
Xử Lý Nền
- Xử lý webhook trả về 200 ngay lập tức
- Gửi tin nhắn được xếp hàng đến background job
- Thực thi luồng chạy không đồng bộ
Monitoring & Observability
Health Checks
builder.Services.AddHealthChecks()
.AddNpgSql(connectionString, name: "postgres")
.AddRedis(redisConnection, name: "redis")
.AddRabbitMQ(rabbitConnection, name: "rabbitmq")
.AddCheck<WhatsAppApiHealthCheck>("whatsapp-api")
.AddCheck<OpenAIHealthCheck>("openai-api");
Metrics (Prometheus)
whatsapp_messages_received_total- Counterwhatsapp_messages_sent_total- Counterwhatsapp_conversation_duration_seconds- Histogramwhatsapp_ai_tokens_used_total- Counterwhatsapp_webhook_processing_duration_ms- Histogram
Logging (Loki)
Structured logging với Serilog:
- Correlation IDs Request/response
- Làm giàu với
ShopId,ConversationId - Dữ liệu nhạy cảm (tokens, messages) được che giấu
Kiến Trúc Triển Khai
Xem Hướng Dẫn Triển Khai để biết Kubernetes manifests và chiến lược scaling.
Triggers Scaling:
- CPU > 70% → Scale up pods
- Webhook queue > 1000 messages → Scale up
- Memory > 80% → Điều tra + scale
Giới Hạn Tài Nguyên:
- Requests: 256Mi memory, 250m CPU
- Limits: 512Mi memory, 500m CPU