Event không chỉ là:
bắn event rồi xử lý
Nó là nền tảng để:
- Decouple system
- Scale hệ thống
- Xây dựng distributed system
#1. Problem (Production thật)
Scenario: Khi user đặt hàng
$order = Order::create([...]);
// Sau đó
sendEmail();
updateInventory();
pushNotification();
#❌ Vấn đề
- Code bị coupled
- Khó mở rộng
- Khó test
- Fail 1 bước → ảnh hưởng toàn bộ flow
#2. Giải pháp: Event-Driven
OrderCreated::dispatch($order);
Listeners:
- SendEmail
- UpdateInventory
- PushNotification
#Insight
Producer không cần biết consumer
#3. Sync vs Async Event (cực quan trọng)
#3.1 Sync Event
event(new OrderCreated($order));
Chạy ngay trong request
#Ưu điểm
- Đơn giản
- Debug dễ
#Nhược điểm
- Block request
- Chậm
#3.2 Async Event
class SendEmail implements ShouldQueue {}
Chạy qua queue
#Ưu điểm
- Không block
- Scale tốt
#Nhược điểm
- Eventual consistency
- Khó debug
#🎯 Rule
- Critical logic → sync
- Side effect → async
#4. Event Chaining (Deep)
#Scenario
OrderCreated → PaymentProcessed → OrderCompleted
#Flow
OrderCreated
→ ProcessPayment
→ PaymentProcessed
→ CompleteOrder
#⚠️ Vấn đề
- Hard to trace
- Debug khó
#Fix
- Logging
- Correlation ID
#5. Event Storming (Design Level)
#Khái niệm
Mapping business → events
#Ví dụ
Domain: E-commerce
Events:
- UserRegistered
- OrderCreated
- PaymentProcessed
- OrderShipped
#Lợi ích
- Hiểu domain
- Thiết kế system rõ ràng
#6. Decoupling System
#❌ Coupled
$orderService->sendEmail();
$orderService->updateInventory();
#✅ Decoupled
OrderCreated::dispatch($order);
#Insight
- Thêm feature mới → chỉ cần thêm listener
#7. Real-world Flow (Production)
#Scenario: Order System
User → OrderCreated
OrderCreated →
→ Payment Service
→ Inventory Service
→ Notification Service
#Code
OrderCreated::dispatch($order);
Listener:
class ProcessPayment implements ShouldQueue
#Result
- System scalable
- Independent services
#8. Failure Case (rất quan trọng)
#❌ Case: Event fail
- Payment fail
- Nhưng email đã gửi
Inconsistent data
#Fix
- Retry strategy
- Compensating action
#Example
if ($payment_failed) {
cancelOrder();
}
#9. Eventual Consistency
#Khái niệm
Data không đồng bộ ngay lập tức
#Ví dụ
- Order created
- Inventory update sau vài giây
#Insight
- Phải chấp nhận delay
#10. Anti-pattern
#❌ Event quá nhiều
Khó quản lý
#❌ Business logic trong listener
Khó debug
#❌ Event chain quá sâu
Debug nightmare
#11. Tips & Tricks
- Dùng naming rõ ràng
- Log event
- Dùng correlation ID
- Giữ event đơn giản
#12. Mindset Senior
Junior:
“Event để tách code”
Senior:
“Event là cách thiết kế system”
#13. Interview Questions
1. Event-driven architecture là gì?
System dựa trên event để giao tiếp
2. Sync vs async event?
Sync chạy ngay, async qua queue
3. Eventual consistency là gì?
Data không đồng bộ ngay
4. Event chaining có vấn đề gì?
Khó debug, khó trace
5. Làm sao thiết kế event tốt?
Theo domain (event storming)
#Kết luận
Event-driven giúp bạn:
- Scale system
- Decouple logic
- Build distributed system
Nhưng đi kèm complexity rất lớn