LARAVEL TUTORIALS
10 thủ thuật Lavavel giúp bạn code nhanh hơn! Routing trong Laravel, cách tạo Route và sử dung AZ Tạo Middleware trong Laravel đơn giản trong 5 phút Xử lý Authentication và Authorization trong Laravel Event và listener trong Laravel, cách tạo và quản lý cơ bản nhất Tạo broadcast event trong Laravel dễ dàng trong 10 phút Xử lý Form Validation trong Laravel từ A - Z Cách tạo Session và cookie trong Laravel dễ dàng như ăn cháo Top 10 Package Lavavel thường dùng trong dự án Laravel Sử dụng Task trong Laravel đơn giản trong 10 phút. Cách tạo API trong Laravel đơn giản chỉ trong 5 phút Cách tạo job trong Laravel sao cho hiệu quả? Queues trong Laravel, dùng để xử lý các tác vụ mất nhiều thời gian Cache trong Laravel, các loại Cache thường dùng trong Laravel Redis trong Laravel, biết cách sử dung Redis Laravel trong 5 phút Sử dụng Memcache trong Laravel tăng tốc độ truy cập website Unit Test trong Laravel, thực hành tạo testing Laravel A-Z 10 thủ thuật tối ưu quá trình Testing trong Laravel Top 7 thư viện Testing Laravel được dùng nhiều nhất Testbench và Orchestra Testbench trong Laravel, kiểm thử Laravel dễ dàng Cách dùng Browser Testing (Laravel Dusk) trong Laravel Cách tạo test case cho Controller trong Laravel Cách tạo test case cho Model trong Laravel Cách tạo Database Testing trong Laravel Real-time web applications là gì ? Tầm quan trọng trong Laravel Laravel WebSockets, các bước tạo WebSockets trong Laravel Cách dùng Socket.io trong Laravel để tạo ứng dụng realtime Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime Cách dùng Long polling trong Laravel để cải thiện trải nghiệm Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel Cách dùng Queue trong laravel để tạo tác vụ bất đồng bộ Cách dùng Event Sourcing trong Laravel Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản Sử dụng Service Container trong Laravel dễ dàng Cách xử lý đa ngôn ngữ trong Laravel dễ dàng Tìm hiểu và sử dụng Service Provider trong Laravel Facades là gì? Cách dùng Facades trong Laravel Cách sử dụng Email Verification trong Laravel Cách dùng URL Generation trong Larevel Cách sử dụng Error Handling trong Laravel Cách dùng Encryption và decryption trong Laravel Cách sử dụng Relationships trong Laravel Bài 01: Laravel là gì? Hướng dẫn cài đặt laravel trên windows Sử dụng Event trong Laravel Một cách quản lý filter trong Laravel
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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ì?

2020 06 21 why event sourcing jpg

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 OrderCreatedOrderCancelled. 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

Cùng chuyên mục:

Cách sử dụng Relationships trong Laravel

Cách sử dụng Relationships trong Laravel

Cách dùng Encryption và decryption trong Laravel

Cách dùng Encryption và decryption trong Laravel

Cách sử dụng Error Handling trong Laravel

Cách sử dụng Error Handling trong Laravel

Cách dùng URL Generation trong Larevel

Cách dùng URL Generation trong Larevel

Cách sử dụng Email Verification trong Laravel

Cách sử dụng Email Verification trong Laravel

Facades là gì? Cách dùng Facades trong Laravel

Facades là gì? Cách dùng Facades trong Laravel

Tìm hiểu và sử dụng Service Provider trong Laravel

Tìm hiểu và sử dụng Service Provider trong Laravel

Sử dụng Service Container trong Laravel dễ dàng

Sử dụng Service Container trong Laravel dễ dàng

Cách xử lý đa ngôn ngữ trong Laravel dễ dàng

Cách xử lý đa ngôn ngữ trong Laravel dễ dàng

Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản

Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản

Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel

Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel

Cách dùng Queue trong laravel để tạo tác vụ bất đồng bộ

Cách dùng Queue trong laravel để tạo tác vụ bất đồng bộ

Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản

Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản

Cách dùng Long polling trong Laravel để cải thiện trải nghiệm

Cách dùng Long polling trong Laravel để cải thiện trải nghiệm

Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime

Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime

Cách dùng Socket.io trong Laravel để tạo ứng dụng realtime

Cách dùng Socket.io trong Laravel để tạo ứng dụng realtime

Laravel WebSockets, các bước tạo WebSockets trong Laravel

Laravel WebSockets, các bước tạo WebSockets trong Laravel

Real-time web applications là gì ? Tầm quan trọng  trong Laravel

Real-time web applications là gì ? Tầm quan trọng trong Laravel

Cách tạo Database Testing trong Laravel

Cách tạo Database Testing trong Laravel

Cách dùng Browser Testing (Laravel Dusk) trong Laravel

Cách dùng Browser Testing (Laravel Dusk) trong Laravel

Top