Cách dùng Event Sourcing trong Laravel
Trong bài Event Sourcing Laravel sẽ giúp bạn hiểu rõ hơn về cách triển khai mô hình Event Sourcing trong Laravel, từ cài đặt và định nghĩa sự kiện đến lưu trữ sự kiện và khôi phục trạng thái ứng dụng.
Bài viết này sẽ giúp bạn hiểu rõ hơn về khái niệm, ý nghĩa và cách triển khai Event Sourcing trong Laravel, cùng với các ứng dụng thực tế của nó.
Event Sourcing là gì?
Event Sourcing
Event Sourcing là một mô hình thiết kế phần mềm trong đó trạng thái của hệ thống được lưu trữ dưới dạng các sự kiện (events) thay vì lưu trực tiếp trạng thái hiện tại. Với Event Sourcing, mỗi sự kiện được lưu trữ là một bản ghi về hành động đã xảy ra trên hệ thống, ví dụ như việc tạo mới một đối tượng hoặc thay đổi trạng thái của một đối tượng đã tồn tại.
Nhờ đó, ta có thể khôi phục lại trạng thái của hệ thống vào bất kỳ thời điểm nào trong quá khứ bằng cách sử dụng các sự kiện đã lưu trữ. Sử dụng Event Sourcing giúp tăng tính khả dụng, tin cậy và khả năng mở rộng của hệ thống, cũng như cho phép ta thu thập thông tin chi tiết về lịch sử của các hoạt động trên hệ thống.
Bài viết này được đăng tại [free tuts .net]
Cách hoạt động của Event Sourcing
Cách hoạt động của Event Sourcing được chia thành hai giai đoạn: ghi lại sự kiện và tái tạo trạng thái.
Ghi lại sự kiện (Event Recording):
- Khi một hành động được thực hiện trong hệ thống, nó không thay đổi trạng thái hiện tại của hệ thống, mà sẽ tạo ra một sự kiện (event) để mô tả hành động đó. Các sự kiện này sẽ được lưu trữ vào một event store, thường được lưu trữ theo thứ tự thời gian để đảm bảo tính đúng đắn của dữ liệu.
Tái tạo trạng thái (Event Replay):
- Để tái tạo lại trạng thái của hệ thống, ta chỉ cần đọc các sự kiện trong event store và áp dụng chúng theo thứ tự thời gian để tái tạo lại trạng thái của hệ thống. Theo cách này, ta có thể xây dựng lại trạng thái của hệ thống tại bất kỳ thời điểm nào trong quá khứ và tìm hiểu được tình trạng của hệ thống trong thời điểm đó.
Việc sử dụng Event Sourcing giúp cho hệ thống trở nên linh hoạt hơn trong việc quản lý trạng thái và phục hồi dữ liệu. Ngoài ra, việc lưu trữ các sự kiện cũng giúp cho việc xử lý lỗi trở nên dễ dàng hơn và giảm thiểu các tác động không mong muốn đến hệ thống. Tuy nhiên, việc triển khai Event Sourcing cũng đòi hỏi một số kỹ năng và kiến thức đặc biệt, do đó cần cân nhắc kỹ trước khi áp dụng phương pháp này vào các dự án phần mềm.
Tại sao nên sử dụng Event Sourcing?
Có nhiều lý do mà ta nên sử dụng Event Sourcing trong phát triển ứng dụng, bao gồm:
- Khả năng khôi phục lại trạng thái của hệ thống: Với Event Sourcing, ta có thể khôi phục lại trạng thái của hệ thống vào bất kỳ thời điểm nào trong quá khứ bằng cách sử dụng các sự kiện đã lưu trữ. Điều này giúp ta phục hồi được các trạng thái của hệ thống bị lỗi hoặc xảy ra sự cố một cách nhanh chóng và dễ dàng.
- Dễ dàng mở rộng và thay đổi hệ thống: Với Event Sourcing, ta không cần phải lo lắng về việc thay đổi cấu trúc cơ sở dữ liệu hay đối tượng trên hệ thống. Bất kỳ thay đổi nào được thực hiện trên hệ thống sẽ được lưu trữ dưới dạng các sự kiện, cho phép ta dễ dàng thêm hoặc xóa các tính năng của hệ thống mà không ảnh hưởng đến các sự kiện đã lưu trữ trước đó.
- Độ tin cậy cao: Việc lưu trữ các sự kiện giúp ta có thể kiểm tra và theo dõi được mọi thay đổi trên hệ thống. Nếu có lỗi xảy ra, ta có thể dễ dàng xác định nguyên nhân và sửa chữa sự cố nhanh chóng.
- Thu thập thông tin chi tiết về lịch sử của hệ thống: Với Event Sourcing, ta có thể thu thập được thông tin chi tiết về lịch sử của các hoạt động trên hệ thống, từ đó giúp ta có thể phân tích, đánh giá và tối ưu hóa các tính năng của hệ thống một cách hiệu quả hơn.
Vì những lý do trên, Event Sourcing đã trở thành một phương pháp phổ biến trong phát triển các hệ thống phức tạp và được tích hợp sẵn trong các framework web như Laravel.
Cách sử dụng Event Sourcing trong Laravel
Trong Laravel, bạn có thể triển khai Event Sourcing bằng cách thực hiện các bước sau:
Bước 1: Cài đặt Laravel Event Sourcing
Trước tiên, bạn cần cài đặt Laravel. Bạn có thể làm điều này bằng cách chạy lệnh sau trên terminal:
composer require spatie/laravel-event-projector composer require spatie/laravel-event-sourcing
Bước 2: Cấu hình Event Sourcing
Tiếp theo, bạn cần cấu hình Laravel để sử dụng Event Sourcing. Trong tệp .env của bạn, hãy cấu hình các thông số sau:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=event-sourcing DB_USERNAME=root DB_PASSWORD=
Bước 3: Tạo các sự kiện (events)
Để ghi lại các thay đổi trong hệ thống của bạn. Ví dụ:
use Spatie\EventProjector\ShouldBeStored; class OrderCreated implements ShouldBeStored { public function __construct(public int $orderId) {} } class OrderCancelled implements ShouldBeStored { public function __construct(public int $orderId) {} }
Bước 4: Tạo các trình xử lý sự kiện (event handlers)
Để xử lý các sự kiện đã được ghi lại. Trình xử lý sự kiện sẽ cập nhật trạng thái của hệ thống của bạn dựa trên các sự kiện đã được ghi lại. Ví dụ:
use Spatie\EventProjector\Projectors\Projector; use Spatie\EventProjector\Projectors\ProjectsEvents; use App\Events\OrderCreated; use App\Events\OrderCancelled; use App\Models\Order; class OrderProjector implements Projector { use ProjectsEvents; public function __construct(private Order $orderModel) {} public function onOrderCreated(OrderCreated $event) { $this->orderModel->create(['id' => $event->orderId]); } public function onOrderCancelled(OrderCancelled $event) { $order = $this->orderModel->findOrFail($event->orderId); $order->status = 'cancelled'; $order->save(); } public function resetState() { $this->orderModel->truncate(); } }
Trong ví dụ này, OrderProjector
là một trình xử lý sự kiện đơn giản cho phép ghi lại các sự kiện OrderCreated
và OrderCancelled
. Khi có sự kiện OrderCreated, trình xử lý sự kiện sẽ tạo một đơn hàng mới trong cơ sở dữ liệu của bạn. Khi có sự kiện OrderCancelled, trình xử lý sự kiện sẽ cập nhật trạng thái của đơn hàng trong cơ sở dữ liệu của bạn.
Bước 5: Đăng ký trình xử lý sự kiện trong ServiceProvider của ứng dụng Laravel
use Illuminate\Support\ServiceProvider; use Spatie\EventProjector\Facades\Projectionist; use App\Projectors\OrderProjector; use App\Listeners\OrderCreatedHandler; use App\Listeners\OrderCancelledHandler; class AppServiceProvider extends ServiceProvider { public function boot() { Projectionist::addProjector(OrderProjector::class); Projectionist::addEventHandler(OrderCreatedHandler::class); Projectionist::addEventHandler(OrderCancelledHandler::class); } }
Bước 6: Tạo các sự kiện và ghi lại chúng trong hệ thống của bạn
Ví dụ:
use App\Events\OrderCreated; use App\Events\OrderCancelled; use Spatie\EventProjector\Facades\Projectionist; class OrderController { public function create() { $order = new Order(); $order->save event(new OrderCreated($order->id)); // ... } public function cancel($orderId) { // ... event(new OrderCancelled($orderId)); // ... } }
Trong ví dụ này, khi bạn tạo một đơn hàng mới, bạn ghi lại sự kiện `OrderCreated` với thông tin của đơn hàng mới. Khi bạn hủy một đơn hàng, bạn ghi lại sự kiện `OrderCancelled` với ID của đơn hàng bị hủy.
Bước 7: Đọc dữ liệu trạng thái
Từ bảng `projector_states` và cập nhật trạng thái của ứng dụng của bạn.
Ví dụ:
use Spatie\EventProjector\Facades\Projectionist; class OrderController { public function index() { $orders = Order::all(); $projectorState = Projectionist::getState(OrderProjector::class); return view('orders.index', compact('orders', 'projectorState')); } }
Trong ví dụ này, khi bạn muốn hiển thị trang danh sách các đơn hàng, bạn lấy tất cả các đơn hàng từ cơ sở dữ liệu và trạng thái của trình xử lý sự kiện OrderProjector từ bảng projector_states. Bạn có thể sử dụng trạng thái này để hiển thị thông tin về trạng thái của các đơn hàng.
Tóm lại, sử dụng Event Sourcing trong Laravel cung cấp một cách tiếp cận linh hoạt để ghi lại các sự kiện và cập nhật trạng thái của ứng dụng của bạn. Với Laravel Event Projector và Laravel Event Sourcing, bạn có thể triển khai Event Sourcing một cách dễ dàng và tiết kiệm thời gian.
Các ưu điểm và nhược điểm của Event Sourcing
Ưu điểm:
- Lịch sử của hệ thống được quản lý dễ dàng: Event Sourcing cho phép quản lý toàn bộ lịch sử sự thay đổi của hệ thống, giúp cho việc theo dõi và phân tích sự thay đổi trở nên dễ dàng.
- Tăng tính nhất quán và độ tin cậy của hệ thống: Với Event Sourcing, dữ liệu của hệ thống được cập nhật thông qua các sự kiện, đảm bảo tính nhất quán và độ tin cậy của hệ thống.
- Dễ dàng mở rộng và thay đổi kiến trúc: Với Event Sourcing, kiến trúc của hệ thống được chia thành các thành phần độc lập với nhau, cho phép dễ dàng mở rộng và thay đổi kiến trúc mà không ảnh hưởng đến các thành phần khác.
Nhược điểm:
- Tốn nhiều tài nguyên để lưu trữ và truy vấn dữ liệu: Vì Event Sourcing lưu trữ toàn bộ lịch sử sự thay đổi của hệ thống, nên yêu cầu lưu trữ và truy vấn dữ liệu lớn hơn so với các phương pháp lưu trữ dữ liệu truyền thống.
- Yêu cầu kỹ năng và kinh nghiệm về xử lý dữ liệu: Vì Event Sourcing đòi hỏi xử lý các sự kiện để khôi phục trạng thái của hệ thống, nên yêu cầu kỹ năng và kinh nghiệm về xử lý dữ liệu để hiểu rõ cách thức hoạt động của hệ thống.
Kết bài viết
Trong bài viết này, chúng ta đã tìm hiểu về Event Sourcing - một kiến trúc lưu trữ dữ liệu mới trong Laravel. Chúng ta đã bắt đầu bằng cách tìm hiểu về khái niệm cơ bản của Event Sourcing và lợi ích của nó so với các phương pháp lưu trữ truyền thống.
Chúng ta đã tìm hiểu cách triển khai Event Sourcing trong Laravel và cách nó cho phép lưu trữ toàn bộ lịch sử của ứng dụng, cung cấp cho các nhà phát triển một cách tiếp cận mới để phát triển ứng dụng web.
Chúng ta cũng đã tìm hiểu về các khái niệm quan trọng như Event, Event Stream và Snapshot, và cách chúng được lưu trữ trong cơ sở dữ liệu để tái tạo lại lịch sử của ứng dụng.
Cuối cùng, chúng ta đã khám phá một số thư viện hữu ích trong Laravel để triển khai Event Sourcing như EventSauce và Laravel-EventSauce.
Event Sourcing là một kiến trúc lưu trữ dữ liệu đáng tin cậy và cung cấp cho các nhà phát triển một cách tiếp cận mới để xây dựng ứng dụng web. Với các công cụ như EventSauce và Laravel-EventSauce, việc triển khai Event Sourcing cũng trở nên dễ dàng hơn bao giờ hết. Nếu bạn muốn nắm bắt trào lưu mới trong lĩnh vực lưu trữ dữ liệu, Event Sourcing là một sự lựa chọn tuyệt vời cho bạn.
Top bài tham khảo về Event Sourcing trong Laravel
- Event trong laravel :https://freetuts.net/su-dung-event-trong-laravel-364.html
- Event và listener trong Laravel :https://freetuts.net/event-va-listener-trong-laravel-5647.html