Tải bản đầy đủ (.pdf) (88 trang)

Đồ án tìm hiểu về event sourcing

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (5.45 MB, 88 trang )

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM

BÁO CÁO ĐỒ ÁN 1

Đề tài: Tìm hiểu về Event Sourcing
GVHD: ThS. Nguyễn Công Hoan
Sinh viên thực hiện:
Nguyễn Thái Tuấn – MSSV: 20522122

 Tp. Hồ Chí Minh, 2023 


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................


...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................

……., ngày……...tháng……năm 20…
Người nhận xét
(Ký tên và ghi rõ họ tên)


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

LỜI CẢM ƠN
Trước hết, em xin gửi lời cảm ơn đến Trường Đại học Công nghệ thông tin –
ĐHQGTPHCM và các thầy cô là giảng viên của khoa Công nghệ phần mềm đã tạo điều
kiện để em hoàn thành đồ án 1 – Chủ đề Tìm hiểu về Event Sourcing.
Em xin gửi lời cảm ơn chân thành và sâu sắc đến thầy Nguyễn Công Hoan là giảng viên
hướng dẫn trực tiếp và trang bị cho em có những kiến thức căn bản vững chắc để thực
hiện đồ án này.
Trong khoảng thời gian thực hiện đồ án, em đã học hỏi thêm được nhiều kiến thức, kinh
nghiệm, biết được thêm về nhiều công nghệ mới. Em đã vận dụng những kiến thức nền
tảng đã tích lũy đồng thời kết hợp với việc học hỏi và nghiên cứu những kiến thức mới.
Từ đó, em vận dụng tối đa những gì đã học hỏi được để hồn thành báo cáo đồ án này.

Tuy nhiên, trong quá trình thực hiện, em khơng tránh khỏi những thiếu sót. Chính vì
vậy, em rất mong nhận được góp ý từ phía thầy, cơ nhằm hồn thiện những kiến thức,
kĩ năng và là hành trang để em thực hiện tiếp các đề tài khác trong tương lai.

Em xin chân thành cảm ơn thầy!


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

DANH MỤC CÁC BẢNG
Danh mục các bảng:
Bảng 1. 1 Thông tin người thực hiện ...............................................................................3
Bảng 2. 1 Dữ liệu lưu trữ Entity ....................................................................................12
Bảng 3. 1 Chức năng của cart service ...........................................................................52
Bảng 3. 2 Chức năng của inventory service ..................................................................52
Bảng 3. 3 Đặc tả xem trạng thái giỏ hàng .....................................................................54
Bảng 3. 4 Đặc tả tạo phiên giỏ hàng ..............................................................................55
Bảng 3. 5 Đặc tả Thêm/ điều chỉnh số lượng sản phẩm vào giỏ ...................................55
Bảng 3. 6 Đặc tả Xóa/ điều chỉnh số lượng sản phẩm khỏi giỏ ....................................56
Bảng 3. 7 Đặc tả Xác nhận giỏ hàng .............................................................................57
Bảng 3. 8 Đặc tả Xem tất cả các sản phẩm hiện có trong kho ......................................57
Bảng 3. 9 Đặc tả Thêm sản phẩm vào kho ....................................................................57
Bảng 3. 10 Đặc tả Thêm sản phẩm vào kho ..................................................................58
Bảng 3. 11 Đặc tả Cập nhật số lượng sản phẩm trong kho ...........................................58
Bảng 3. 12 Đặc tả Cập nhật thông tin sản phẩm trong kho ...........................................59
Bảng 3. 13 Thiết kế CSDL cho bảng Inventory của inventory serivice ........................66
Bảng 3. 14 Thiết kế CSDL cho bảng Checkpoint của inventory serivice .....................66
Bảng 3. 15 Thiết kế CSDL cho document ShoppingCartDetails của cart service ........66

Bảng 3. 16 Thiết kế CSDL cho bảng Checkpoint của cart serivice ..............................67
Bảng 3. 17 Thiết kế API ................................................................................................71
Bảng 3. 18 Các stack ứng dụng .....................................................................................73
Danh mục hình ảnh:
Hình 2. 1 Lưu trữ truyền thống với MongoDB ...............................................................7
Hình 2. 2 Lưu trữ kết hợp với Event sourcing ................................................................7
Hình 2. 3 Thơng tin bên trong một Event ........................................................................8
Hình 2. 4 Minh họa về chiến thắng điện biên phủ ..........................................................8
Hình 2. 5 Minh họa về các event .....................................................................................9
Hình 2. 6 Stream trong Event store ...............................................................................10
Hình 2. 7 Ví dụ về thơng tin của một Event ..................................................................11
Hình 2. 8 Lưu trữ thơng tin "shopping-cart-opened" Event ..........................................13
Hình 2. 9 Lưu trữ thơng tin "product-item-added" Event .............................................13
Hình 2. 10 Lưu trữ thơng tin "product-item-added" Event ...........................................14
Hình 2. 11 Lưu trữ thơng tin "product-item-removed" Event .......................................14
Hình 2. 12 Lưu trữ thơng tin "shopping-cart-confirmed" Event ...................................15
Hình 2. 13 Đoạn code minh họa lưu trữ trên Ram ........................................................16
Hình 2. 14 Tính năng complete rebuild .........................................................................17


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

Hình 2. 15 Tính năng Temporal query ..........................................................................17
Hình 2. 16 Minh họa về Event replay............................................................................18
Hình 2. 17 Tối ưu với snapshot (trước) .........................................................................19
Hình 2. 18 Tối ưu với snapshot (sau) ............................................................................20
Hình 2. 19 Ví dụ về Git minh họa tính năng Audit .......................................................21
Hình 2. 20 Sau khi gõ "Git log" trong Git .....................................................................21

Hình 2. 21 Tính năng Parallel processing .....................................................................22
Hình 2. 22 Ví dụ tính năng Parallel processing ............................................................22
Hình 2. 23 Về Eventual consistency.............................................................................23
Hình 2. 24 Về Eventual consistency sau khi không ghi một thời gian ........................24
Hình 2. 25 Tổng quan về projection .............................................................................25
Hình 2. 26 Projection trong read model .......................................................................25
Hình 2. 27 Projection trong write model ......................................................................26
Hình 2. 28 Minh họa về two phase commit .................................................................28
Hình 2. 29 Workflow trong subscription ......................................................................29
Hình 2. 30 Dữ liệu lưu trữ (trường revision) ................................................................30
Hình 2. 31 Etag .............................................................................................................31
Hình 2. 32 Kiến trúc Monolithic ..................................................................................32
Hình 2. 33 Trong một transaction của Monolithic .......................................................33
Hình 2. 34 MSA.............................................................................................................34
Hình 2. 35 Transaction trong MS .................................................................................35
Hình 2. 36 Hai cách cài đặt saga trong MSA ...............................................................35
Hình 2. 37 Cách cài đặt "Orchestration" ......................................................................36
Hình 2. 38 Ccách cài đặt "Choreography" ....................................................................36
Hình 2. 39 Các thành phần trong EDA.........................................................................37
Hình 2. 40 Sự phụ thuộc giữa các service khi khơng có EDA .....................................38
Hình 2. 41 Sự phụ thuộc giữa các service khi có EDA ...............................................38
Hình 2. 42 Tính mở rộng trong EDA ...........................................................................39
Hình 2. 43 Event persistence trong EDA ......................................................................40
Hình 2. 44 "Single point of failure" ..............................................................................40
Hình 2. 45 Minh họa về hiệu suất.................................................................................41
Hình 2. 46 Minh họa về Eventual Consistency ............................................................42
Hình 2. 47 Minh họa về complexity .............................................................................42
Hình 2. 48 Diagram pub/sub pattern ............................................................................44
Hình 2. 49 Minh họa về giao tiếp giữa các MS ............................................................44
Hình 2. 50 Minh họa các thành phần trong API gateway ............................................45

Hình 2. 51 Về các tính năng cần có của API Gateway ................................................46
Hình 2. 52 Minh họa giải quyết vấn đề của Service discovery ....................................47
Hình 2. 53 Cách cài đặt client-side discovery ..............................................................48
Hình 2. 54 Cách cài đặt server-side discovery .............................................................48
Hình 2. 55 Cách cài đặt seft-registration ......................................................................49
Hình 2. 56 Cách cài đặt third-party-registration...........................................................49

Hình 3. 1 Sơ đồ use-case cart-service............................................................................53


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

Hình 3. 2 Sơ đồ use-case inventory-service .................................................................54
Hình 3. 3 Tổng quan về kiến trúc .................................................................................59
Hình 3. 4 Kiến trúc bên trong một service ...................................................................60
Hình 3. 5 Một góc nhìn khác về kiến trúc ....................................................................62
Hình 3. 6 Mơ tả dữ liệu về "shopping-cart-opened" Event ..........................................67
Hình 3. 7 Mơ tả dữ liệu về "product-item-added" Event .............................................67
Hình 3. 8 Mơ tả dữ liệu về "product-item-removed" Event .........................................68
Hình 3. 9 Mơ tả dữ liệu về "shopping-cart-confirmed" Event ....................................68
Hình 3. 10 Mơ tả dữ liệu về "product-created" Event ..................................................69
Hình 3. 11 Mơ tả dữ liệu về "product-deleted" Event ..................................................69
Hình 3. 12 Mơ tả dữ liệu về "product-quantity-added" Event .....................................70
Hình 3. 13 Mơ tả dữ liệu về "product-quantity-deducted" Event.................................70
Hình 3. 14 Mơ tả dữ liệu về "product-info-updated" Event .........................................70
Hình 3. 15 Trực quan các docker container sau ghi đóng gói với Docker ...................74
Hình 3. 16 Giao diện trực quan EventStoreDB ............................................................74
Hình 3. 17 Console của RabbitMQ ..............................................................................75

Hình 3. 18 Cơng cụ tương tác, trực quan MongoExpress ............................................75
Hình 3. 19 Công cụ tương tác, trực quan pgAdmin4 ...................................................76


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

MỤC LỤC
LỜI CẢM ƠN ...................................................................................................... 3
DANH MỤC CÁC BẢNG .................................................................................. 4
DANH MỤC TỪ VIẾT TẮT.............................................................................. 9
TÓM TẮT ĐỒ ÁN .............................................................................................. 1
Chương 1: GIỚI THIỆU TỔNG QUAN ........................................................ 3

1.2.1

Giới thiệu đề tài ....................................................................................... 3

1.2.2

Lý do chọn đề tài ..................................................................................... 4

1.2.3

Phạm vi nghiên cứu ................................................................................. 4

1.2.4

Đối tượng nghiên cứu .............................................................................. 4


1.2.5

Kết quả hướng tới .................................................................................... 5

Chương 2: KIẾN THỨC NỀN TẢNG............................................................ 7
2.1.1

Event sourcing là gì? ............................................................................... 7

2.1.2

Event ........................................................................................................ 8

2.1.3

Stream ...................................................................................................... 9

2.1.4

Thông tin đại diện một Event (Event representation)............................ 11

2.1.5

Lấy trạng thái hiện tại tổng hợp từ những Event ................................... 12

2.1.6

Nơi lưu trữ Event (Event store) ............................................................. 16


2.2.1

Chịu lỗi và phục hồi hệ thống (Complete rebuild) ................................ 17

2.2.2

Quay lại quá khứ và xem những gì xảy ra (Temporal query) ............... 17

2.2.3

Lặp lại và phân tích (Event replay)........................................................ 18

2.2.4

Tối ưu với snapshot ............................................................................... 19

2.3.1

Kiểm kê (Audit) ..................................................................................... 21

2.3.2

Xử lí đồng thời (Parallel processing) ..................................................... 21

2.3.3

Nhất quán ở một thời điểm nhất định (Eventual consistency) .............. 23

2.4.1


Projections ............................................................................................. 24


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

2.4.2

Subscription ........................................................................................... 26

2.4.3

Revision ................................................................................................. 30

2.4.4

Etag ........................................................................................................ 31

2.5.1

Mẫu thiết kế Saga (Saga pattern) ........................................................... 32

2.5.2

Kiến trúc hướng sự kiện (Event Driven Architecture) .......................... 37

2.5.3

Mẫu thiết kế Pub/sub (Pub/sub pattern)................................................. 43


2.5.4

Message broker (message queue) .......................................................... 44

2.5.5

API gateway ........................................................................................... 45

2.5.6

Service discovery ................................................................................... 47

Chương 3: XÂY DỰNG HỆ THỐNG .......................................................... 50
3.1.1

Phát biểu bài toán ................................................................................... 50

3.1.2

Hướng giải quyết ................................................................................... 51

3.1.3

Công cụ, công nghệ sử dụng.................................................................. 51

3.1.4

Mã nguồn ............................................................................................... 51


3.2.1

Danh sách các yêu cầu ........................................................................... 52

3.2.2

Sơ đồ use case ........................................................................................ 53

3.2.3

Đặc tả ..................................................................................................... 54

3.3.1

Thiết kế kiến trúc ................................................................................... 59

3.3.2

Thiết kế dữ liệu ...................................................................................... 63

3.3.3

Thiết kế API ........................................................................................... 71

3.3.4

Triển khai ............................................................................................... 72

Chương 4: KẾT LUẬN .................................................................................. 77


4.3.1

Chủ đề Event sourcing ........................................................................... 78

4.3.2

Mở rộng đề tài microservice .................................................................. 78

TÀI LIỆU THAM KHẢO ................................................................................ 79


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

DANH MỤC TỪ VIẾT TẮT

#
1

Từ viết tắt
API

2
3
4

CSDL
MSA
MS


5

EDA

Từ đầy đủ
Application Programing
Interface
Cơ sở dữ liệu
Microservice Architecture
Microservice
Event Driven
Architecture

Ý nghĩa
Một nơi để các ứng dụng giao tiếp
với nhau
CSDL cho ứng dụng
Kiến trúc microservice
Một service trong MSA hoặc cách
nói gọn của MSA
Kiểu kiến trúc hướng sự kiện


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

TÓM TẮT ĐỒ ÁN
Đồ án "Tìm hiểu Event Sourcing" tập trung nghiên cứu kỹ thuật Event Sourcing có trong

các hệ thống lớn hiện nay. Hiểu được thực trạng các vấn đề mà các hệ thống lớn đang
gặp phải và Event Sourcing đã giải quyết nó như thế nào? Kỹ thuật này ra đời có nhiều
mặt ý nghĩa trong đó có về kỹ thuật lẫn về vấn đề kinh doanh trong doanh nghiệp. Để
hiện thực đề tài này, em đã xây dựng một hệ thống microservice đơn giản về chủ đề
EShopping Cart với công nghệ phía Backend là NodeJS và cơng cụ Postman như là một
Frontend đơn giản nhằm tập trung vào xây dựng đề tài Event Sourcing phía Backend.
Đề tài được bắt đầu từ việc tìm hiểu thực trạng, đưa ra các vấn đề cần giải quyết. Xác
định được phạm vi bài toán, mục tiêu đề tài. Từ đó xác định được các thành phần chính,
thành phần liên quan, độ khó có thể kể đến như: các mẫu thiết kế, các kỹ thuật xây dựng
ràng buộc trong một ứng dụng hướng sự kiện (Http Etag, Revision, Location header,
Checkpoint, ...), các vấn đề xảy ra khi kết nối với một microservice khác,...
Đề tài Event Sourcing tập trung xây dựng hệ thống bên phía Backend, và cá nhân em nó
có độ khó rất cao về cả về kỹ thuật lẫn triển khai (chưa có đủ hạ tầng). Chính vì thế việc
tối ưu chi phí về phía phía Front end sẽ giảm đi tối thiểu, cơng cụ Postman chính là giải
pháp thay thế được em dùng như một Front end trong tình huống này. Bài tốn
EShopping cart được em lựa chọn để áp dụng vì nó có đủ các tình huống để giải quyết
cũng như là rất gần gũi với kỷ nguyên thương mại điện tử ngày nay. Bài toán được chia
thành hai service bao gồm Cart service và Inventory service, được thiết kế với mỗi
service là một database khác nhau. Ở đây em đã sử dụng MongoDB và Postgre. Giải
pháp triển khai tất cả các tầng ứng dụng như: RabbitMQ (Message broker), Postgres,
Pgadmin4, MongoDB, MongoDB-Express, EventStore (CSDL chuyên dùng cho việc
lưu trữ Event), và 2 service (Cart và Inventory) được em triển khai bằng docker compose
với cơng cụ Docker.
Phần cuối cùng của đồ án là trình bày kết quả đã thực hiện lên cuốn báo cáo, đưa ra kết
luận và hướng phát triển cho ứng dụng trong tương lai.

Trang 1


ĐỒ ÁN 1


Nguyễn Thái Tuấn – 20522122

Nội dung đồ án được trình bày trong các chương như sau:
• Chương 01 - Giới thiệu tổng quan: Xác định mục tiêu, nội dung nghiên cứu, phạm
vi đề tài và thông tin người thực hiện.
• Chương 02 - Event Sourcing: Giới thiệu về Event sourcing, ý nghĩa, cách thức hoạt
động, các thành phần, các mẫu thiết kế được áp dụng, ưu điểm và khuyết điểm.
• Chương 03 - Xây dựng ứng dụng minh họa “EShoppingCart”
o Giới thiệu ứng dụng:
▪ Bài toán đặt ra
▪ Hướng giải quyết
▪ Tổng quan công nghệ sử dụng trong đồ án
o Phân tích u cầu: mơ hình hóa bài toán thành các sơ đồ và đặc tả
o Thiết kế: đưa ra bản thiết kế kiến trúc ứng dụng, thiết kế database.
o Triển khai: Công cụ, công nghệ sử dụng trong đề tài, đóng gói ứng dụng.

• Chương 04 - Kết luận: Những kết quả đã đạt được sau khi kết thúc đồ án, khó khăn,
hạn chế và định hướng phát triển trong tương lai.

Trang 2


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

Chương 1:

GIỚI THIỆU TỔNG QUAN


Thông tin người thực hiện
MSSV
20522122

Họ tên
Nguyễn Thái Tuấn

Email


Bảng 1. 1 Thông tin người thực hiện

Tổng quan đề tài
1.2.1 Giới thiệu đề tài
Trong các hệ thống lớn hiện nay, đặc biệt đối với các kiến trúc microservice khi mà các
service đã được chia rất nhỏ để dễ dàng mở rộng, khôi phục, kiểm kê, tương tác với các
service của hệ thống khác … Như vậy làm sao để làm được điều đó. Kỹ thuật Event
Sourcing ra đời để đáp ứng về mặt kỹ thuật cũng như là về mặt kinh doanh trong các
doanh nghiệp. Có thể kể đến các ý nghĩa về cả 2 khía cạnh này như sau:
Về mặt kỹ thuật:
Lịch sử dữ liệu: Event Sourcing cho phép lưu trữ toàn bộ lịch sử của các sự kiện trong
hệ thống. Điều này giúp giải quyết các vấn đề liên quan đến ghi lại, theo dõi, và kiểm
tra lại các thay đổi trong dữ liệu. Bằng cách phát lại chuỗi sự kiện, ta có thể tái tạo lại
trạng thái của ứng dụng tại bất kỳ điểm thời gian nào, giúp tạo ra khả năng phục hồi dữ
liệu và giải quyết vấn đề ghi lại lịch sử của hệ thống.
Cung cấp audit trail: Với Event Sourcing, ta có khả năng theo dõi và kiểm tra lại mọi
hành động và thay đổi trong hệ thống. Điều này có lợi cho việc theo dõi và kiểm sốt
quy trình kinh doanh, tn thủ pháp lệnh và quy định, cũng như giải quyết các vấn đề
liên quan đến sự phân tán và ghi lại lịch sử.

Khả năng mở rộng: Event Sourcing cung cấp khả năng mở rộng cho hệ thống phân tán.
Bằng cách phân tách dữ liệu thành các sự kiện và áp dụng cơ chế xử lý sự kiện, ta có
thể mở rộng hệ thống theo chiều ngang (horizontal scaling) một cách hiệu quả.
Về mặt kinh doanh:
Lịch sử và phân tích dữ liệu: Event Sourcing cung cấp khả năng theo dõi lịch sử hoạt
động của hệ thống và phân tích dữ liệu thời gian thực. Điều này giúp tăng cường khả

Trang 3


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

năng phân tích, đưa ra quyết định dựa trên dữ liệu lịch sử, và phát hiện xu hướng và mẫu
thông qua các sự kiện.
Sự nhất quán và phục hồi: Event Sourcing đảm bảo tính nhất quán của dữ liệu và khả
năng phục hồi sau các sự cố. Bằng cách lưu trữ các sự kiện, ta có thể phục hồi dữ liệu
và trạng thái của hệ thống trong trường hợp xảy ra sự cố, lỗi hoặc thất bại.
Hợp tác và tích hợp: Event Sourcing cung cấp khả năng chia sẻ sự kiện giữa các ứng
dụng và hệ thống khác nhau. Điều này tạo điều kiện cho tích hợp linh hoạt và giao tiếp
giữa các thành phần trong một hệ thống phân tán và kết nối với các ứng dụng bên ngồi.
Tóm lại, nhờ vào kỹ thuật EventSourcing các dữ liệu về doanh nghiệp sẽ không bị mất
đi. Mỗi hành động, thao tác trên dữ liệu đều được lưu lại trong CSDL. Điều này cho
phép kiểm tra và dự đoán (cả về mặt kỹ thuật và kinh doanh)
1.2.2 Lý do chọn đề tài
Với mong muốn tìm hiểu về một hệ thống được xây dựng trên kiến trúc microservice sẽ
bao gồm các thành phần nào, các design pattern nào có thể được sử dụng để có thể xây
dựng hệ thống, tại sao lại có hệ thống microservice, và nó ra đời để giải quyết vấn đề
gì?

Event Sourcing là một từ khóa trong microservice. Thật may mắn, Event Sourcing là
một đề tài có trong đồ án 1 của mơn học. Chính vì thế em đã quyết định chọn Event
Sourcing làm đề tài đồ án 1 để có thể nghiên cứu.
1.2.3 Phạm vi nghiên cứu
Trong đồ án lần này, em sẽ tâm trung nghiên cứu về các thành phần có trong Event
Sourcing, tìm hiểu các khái niệm liên quan, và áp dụng những nghiên cứu vào một ứng
dụng thực tế để có thể hiểu sâu hơn các kiến thức đã tìm hiểu.
1.2.4 Đối tượng nghiên cứu
Em sẽ tiến hành nghiên cứu các thành phần có trong Event Sourcing, ưu khuyết điểm,
cách hoạt động, tính năng mang lại, cài đặt với kỹ thuật Event sourcing, cài đặt với các
microservice tương tác với nhau thông qua message broker.

Trang 4


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

1.2.5 Kết quả hướng tới
Ở vai trò cá nhân, em mong muốn mở rộng kiến thức trong lĩnh vực xây dựng hệ thống
trong việc áp dụng kỹ thuật EventSourcing đặc biệt là các hệ thống hướng sự kiện. Có
được một góc nhìn trong tổng thể bức tranh của các hệ thống với kiến trúc microservice
ngày nay. Cá nhân em đã tự thu thập cho mình những kỹ năng liên quan trong quá trình
thực hiện đồ án bao gồm: các phương pháp tiếp cận, công nghệ xây dựng kỹ thuật
EventSourcing, quản lí thời gian, thực hiện các khâu trong hệ thống với nhiều công cụ
và thư viện.
Đối với các bạn khác sử dụng tài liệu này như một tài liệu tham khảo; em tin chắc rằng
tài liệu này là một bước đệm tốt để có thể dễ dạng định hướng cho việc tìm hiểu sâu
thêm.


Trang 5


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

Công cụ sử dụng
Trong quá trình xây dựng hệ thống, em đã sử dụng phần mềm và cơng cụ sau:
• Visual Studio Code: IDE hỗ trợ xây dựng ứng dụng
• Postman: Hỗ trợ kiểm thử các API và xem Postman như là một người dùng cuối.
• Pgadmin4: là một cơng cụ quản lý CSDL mã nguồn mở được phát triển để quản
lý và tương tác với CSDL PostgreSQL. pgAdmin 4 cung cấp một giao diện đồ
họa dễ sử dụng để quản lý các CSDL PostgreSQL.
• MongoDB Compass, MongoExpress:
o Là một cơng cụ quản lý và trực quan hóa CSDL MongoDB, cung cấp giao
diện đồ họa dễ sử dụng để khám phá, truy vấn và tương tác với CSDL
MongoDB.
o MongoDB Compass (DesktopApp) được em sử dụng trong q trình phát
triển, cịn MongoExpress (WebApp) được sử dụng sau khi đã đóng gói
ứng dụng với Docker.
• Docker: Cơng cụ đóng gói các stack của ứng dụng.
• EventStore UI:
o EventStore là một event database được thiết và lưu trữ quản lí các sự kiện.
Được xây dựng trên mơ hình Event Sourcing và CQRS (Command Query
Responsibility Segregation), cho phép lưu trữ dưới dạng chuỗi sự kiện
(event stream) thay vì chỉ lưu trữ trạng thái hiện tại của dữ liệu như các
database thông thường khác.
o EventStore cung cấp một giao diện người dùng cho việc theo dõi các sự

kiện diễn ra trong hệ thơng, hỗ trợ truy vấn, …
• RabbitMQ UI:
o RabbitMQ là một hệ thống phần mềm mã nguồn mở dựa trên mơ hình
hàng đợi tin nhắn (message queue hay còn gọi là message broker) để quản
lý và chuyển giao thông tin giữa các ứng dụng và dịch vụ khác nhau. Nó
cung cấp một giải pháp cho việc truyền thông bất đồng bộ và phân tán
giữa các thành phần của một hệ thống phân tán.
o RabbitMQ cung cấp giao diện người dùng quản lí các kết nối, kênh
(channel), các hàng đợi tin nhắn, …

Trang 6


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

Chương 2:

KIẾN THỨC NỀN TẢNG

Event sourcing
2.1.1 Event sourcing là gì?
Event sourcing là một mẫu thiết kế khi mà tất cả các thao tác nghiệp vụ trên dữ liệu
đều được lưu trữ dưới dạng một chuỗi các Event.
Nó được xem là một cách lưu trữ dữ liệu. Trái ngược so với cách lưu trữ trước đây, chỉ
lưu trạng thái mới nhất của một dòng dữ liệu, thay vào đó Event sourcing lưu trữ trạng
thái khi một dịng dữ liệu có sự thay đổi, và mỗi lần thay đổi tương ứng với một Event,
một dòng dữ liệu sẽ tương ứng với một chuỗi các Event.


Hình 2. 1 Lưu trữ truyền thống với MongoDB

Hình 2. 2 Lưu trữ kết hợp với Event sourcing

Trang 7


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

Hình 2. 3 Thơng tin bên trong một Event

Nhờ vào kỹ thuật này, dữ liệu về nghiệp vụ sẽ không bao giờ bị mất đi. Mỗi tác vụ thay
đổi dữ liệu đều được đính kèm trong mỗi Event được lưu trữ trong CSDL. Điều này cho
phép chúng ta xem lại lịch sử dữ liệu thay đổi và dự đoán, là một yếu tố tốt cho cả về
vấn đề về kỹ thuật và kinh doanh trong doanh nghiệp.
2.1.2 Event
Event được định nghĩa là một sự thật trong quá khứ. Chúng mang một thông tin nào đó
được xem đã hồn thành và dữ liệu được mang theo khơng bao giờ có thể thay đổi. Có
thể lấy một ví dụ về Event như “Chiến dịch Điện Biên Phủ năm 1954” được quân dân
Việt Nam dành chiến thắng. Đây là một sử kiện lịch sử mang thông tin “Việt Nam dành
chiến thắng” và sự kiện này không bao giờ có thể thay đổi được. Bởi vì những gì xảy ra
ở q khứ nó ln đúng.

Hình 2. 4 Minh họa về chiến thắng điện biên phủ

Tên của Event nên đặt như là đã hồn thành ở trong q. Ví dụ: “user added”, “order
confirmed”. Các sự kiện này khơng có trực tiếp người nhận, chúng kiểu được phát đi.
Giống như các bảng quảng cáo ở khắp nơi, là những thông tin sự kiện, ai muốn quan


Trang 8


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

tâm thì nhìn và khơng quan tâm thì thơi. Event trong các hệ thống cũng vậy, được phát
đi, các service nào quan tâm đến Event này thì có lắng nghe và phản hồi nếu cần thiết.

Hình 2. 5 Minh họa về các event

Tóm lại, các tính chất của Event:
• Bất biến (khơng thể thay đổi một q khứ đã diễn ra)
• Có thể hiểu theo nhiều cách khác nhau. Ví dụ: Chiến thắng 2-1 của đội tuyển nữ
Đức trước đội tuyển nữ Việt Nam ở lượt trận giao hữu đêm ngày 24/06/2023 có
thể diễn giải với người hâm mộ ở Đức như là “đây là một chiến thắng bình thường
vì chúng ta ở TOP 5”, nhưng đối với người hâm mộ Việt Nam thì xem đây như
là một kỳ tích vì “có bàn thắng” trước các đội tuyển hàng đầu thế giới. Event
được phát đi trong hệ thống các service khác nhau có thể tiêu thụ Event theo một
cách khác nhau.
Đây là một khái niệm đơn giản, nhưng có tầm quan trọng rất lớn đối các hệ thống lớn
hiện nay.
2.1.3 Stream
Stream là một nhóm các Event có cùng logic, liên quan với nhau. Trong Event sourcing,
stream được đại diện những thực thể (Entity) hoặc cứ hiểu đơn giản Entity như là một
dòng dữ liệu trong một bảng. Với mỗi Entity thì có một stream, được lưu với một chuỗi
các Event. Một Entity có thể được lấy ra bằng cách đọc hết tất cả Event trong một stream,
và đọc theo thứ tự xuất hiện của các Event.

Một stream nên có một id duy nhất đại diện. Mỗi Event sở hữu thuộc tính vị trí trong
một stream. Giá trị của thuộc tính vị trí này có thể là một số, một giá trị tăng dần. Con
số này được định nghĩa thứ tự xuất hiện của một Event trong lúc lấy trạng thái hiện tại
của nó. Và nó cịn dùng để kiểm tra tính đồng thời.

Trang 9


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

Hình 2. 6 Stream trong Event store

Event Store hay cịn có thể gọi là Event Log được xây dựng để lưu trữ một lượng lớn
Event. Chúng ta không cần sợ rằng việc phải tạo quá nhiều stream, tuy nhiên, chúng ta
nên xem xét trong một stream có bao nhiêu Event. Việc stream có vịng đời ngắn và ít
Event có thể giúp theo dõi và bảo trì hơn.

Trang 10


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

2.1.4 Thông tin đại diện một Event (Event representation)
Về mặt kỹ thuật có thể coi Event như là một message.
Thơng tin Event có thể được mô tả trong các định dạng như JSON, Binary, XML. Các
định dạng này thường mô tả thông tin như sau:



id: một id duy nhất đại diện cho một event.



type: tên của Event, ví dụ: "invoice issued".



stream id: Một object id, nơi event thuộc về nhóm logic event nào.



stream position: số thứ tự được sử dụng để quyết định vị trí của của Event trong
một stream.



timestamp: đại diện thời gian tại thời điểm Event xảy ra.



những metadata như: correlation id, causation id,….

Một ví dụ về thơng tin đại diện một Event bởi định dạng JSON.

Hình 2. 7 Ví dụ về thông tin của một Event

Trang 11



ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

2.1.5 Lấy trạng thái hiện tại tổng hợp từ những Event
Trong Event Sourcing, trạng thái dữ liệu thay đổi được lưu trữ trong những Event. Event
có liên quan đến nhau thì nhóm lại thành một stream. Stream được đại diện như một
Entity hay có thể hiểu nó là một dịng dữ liệu trong các hệ quản trị CSDL (Relational
hoặc document database), mỗi Entity được lưu trữ một chuỗi các Event.
Id

ClientI

Product items

d
d024d9d4-

tuannt02

[

abb8-416a-

{

87651a8e278403


productId: 'a0367d3e-f8b4-

Opened

Confirmed

at

At

2023-06-

2023-06-

25T08:14:

25T08:16:41.

21.791Z

183Z

498b-a5c5-772f6fc109f8',

0b

quantity: 2
},
{
productId: 'feaf6b2f-6738-488d-bacc83029c690a55',

quantity: 1
}
]
Bảng 2. 1 Dữ liệu lưu trữ Entity

Trong ví dụ này, Entity được lưu trữ dưới dạng một chuỗi các Event xảy ra. Tương ứng
với bản trên sẽ là: ShoppingCartOpened, ProductItemAdded, ProductItemAdded,
ProductItemRemoved, ShoppingCartConfirmed.
Một chuỗi Event có thể được mơ tả như bên hình dưới:

Trang 12


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

Hình 2. 8 Lưu trữ thơng tin "shopping-cart-opened" Event

Hình 2. 9 Lưu trữ thơng tin "product-item-added" Event

Trang 13


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

Hình 2. 10 Lưu trữ thơng tin "product-item-added" Event


Hình 2. 11 Lưu trữ thơng tin "product-item-removed" Event

Trang 14


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

Hình 2. 12 Lưu trữ thơng tin "shopping-cart-confirmed" Event

Vì tất cả thao tác trên đều có liên quan đến thao tác trên cart, cùng một user, tại một
khoảng thời điểm. Nên tất cả các Event đều có cùng stream: "streamId":
"CART/2023/06/25" , và chúng có “streamPosition” tăng dần.
Để có được Entity như bảng trên chúng ta cần phải tính tốn tổng hợp lại từ các Event
đã có. Mỗi Event đều có thứ tự xuất hiện dựa trên “streamPosition”.
Để có thể được trạng thái hiện tại của một Entity chúng ta cần thực hiện các bước “stream
aggregation”. Dựa trên “stream aggregation” này chúng chúng ta tổng hợp các Event
thành một Entity duy nhất. Các bước như sau:
• Đọc tất cả Event từ một stream cụ thể.
• Sắp xếp chúng tăng dần theo thứ tự xuất hiện (dựa trên stream position).
• Duyệt qua từng Event theo thứ tự và tính tốn tăng dần.
Các bước này được gọi là “stream aggregation” hoặc “state rehydration”. Trong mục
2.4 chúng ta sẽ đi chi tiết cài đặt với mẫu aggregation.

Trang 15


ĐỒ ÁN 1


Nguyễn Thái Tuấn – 20522122

2.1.6 Nơi lưu trữ Event (Event store)
Nơi lưu trữ Event không cố định bất kỳ trên CSDL nào, miễn là nó đáp ứng được các
giả định cơ bản như ban đầu đặt ra. Nơi lưu trữ có thể là một CSDL quan hệ (SQL) hoặc
CSDL dạng Document (NoSQL như MongoDB), hoặc có thể lưu nó vào một file, …
Cách đơn giản nhất là lưu trữ trên ram (in-memory) Event Store có thể được định nghĩa
như sau:

Hình 2. 13 Đoạn code minh họa lưu trữ trên Ram

Đây cũng là một cách lưu trữ nhưng trong các ứng dụng thực tế sẽ không làm như vậy.
Bởi vì một Entity có rất nhiều dữ liệu Event, như vậy sau một khoảng thời gian ngắn,
service của chúng ta sẽ bị chết do khơng cịn đủ ram, ngồi ra một lý do nữa để từ chối
lưu trên ram đó chính là Event được coi là một “Source of truth”, nơi ghi lại những sự
kiện sự thật, đây là một tính chất dùng để tái tạo lại hệ thống nếu như hệ thống đó bị
chết. Nên có thể nói là “Cái gì có thể mất nhưng nơi lưu trữ Event phải ln sống”. Vì
vậy khi đi qua phần cài đặt chúng ràng buộc rất chặt chẽ về tính thứ tự xuất hiện của các
Event trong mỗi request gửi đi đến phía server.
Trong các CSDL để lưu trữ Event có rất nhiều CSDL được thiết kế chỉ để lưu Event.
Một trong số đó có thể kể đến EventStoreDB, được hỗ trợ trong mơi trường gRPC và
có thể cài đặt được với NodeJS.

Trang 16


×