Tải bản đầy đủ (.docx) (90 trang)

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 (6.37 MB, 90 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


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

 Tp. Hồ Chí Minh, 2023 
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ản
Bảng 1. 1 Thông tin người thực hiện.............................................................................3
Y
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 ản
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


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

Hình 2. 14 Tính năng complete rebuild.......................................................................17
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
Y


ĐỒ ÁN 1

Nguyễn Thái Tuấn – 20522122

Hình 3. 1 Sơ đồ use-case cart-service..........................................................................53
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.1

Thông tin người thực hiện..........................................................................3

1.2

Tổng quan đề tài.........................................................................................3

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

Công cụ sử dụng........................................................................................6

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

2.2

2.3

2.4

Event sourcing............................................................................................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

Tính năng.................................................................................................17
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

Lợi ích và bất lợi......................................................................................21
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

Các thành phần quan trọng khi cài đặt Event Sourcing...........................24


ĐỒ ÁN 1

2.5

Nguyễn Thái Tuấn – 20522122


2.4.1

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

2.4.2

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

2.4.3

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

2.4.4

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

Các thành phần quan trọng khi cài đặt microservice...............................32
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

3.2

3.3

Giới thiệu chung về bài toán....................................................................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

Phân tích...................................................................................................52
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

Thiết kế....................................................................................................59
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.1

Những khó khăn.......................................................................................77

4.2

Kết quả đạt được......................................................................................77

4.3

Hướng phát triển......................................................................................78
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
1.1 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


1.2 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

1.3 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
2.1 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 quá 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



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×