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

đồ án 2 xây dựng hệ thống nhắn tin thời gian thực tối ưu cho tải trọng dữ liệu

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 (3.45 MB, 92 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TINKHOA CÔNG NGHỆ PHẦN MỀM</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>LỜI CẢM ƠN</b>

Chúng em muốn bày tỏ sự cảm ơn sâu sắc đến Cơ Đỗ Thị Thanh Tuyền vì sự dẫn dắt

<i><b>tận tình trong q trình nhóm em thực hiện đồ án về Tối ưu cho tải trọng dữ liệu chohệ thống nhắn tin. Sự kiên nhẫn và sự chỉ bảo từ Cô không chỉ giúp chúng em nắm</b></i>

vững kiến thức mà còn mở ra sự hiểu biết sâu rộng cho chúng em trong lĩnh vực này.Hi vọng với sự chỉ bảo và góp ý từ Cơ, nhóm đề tài có thể tiếp tục phát triển để ứngdụng vào trong thực tế và ngày càng được mở rộng để hỗ trợ cải thiện hiệu năng dànhcho người dùng. Với những ý kiến, đóng góp từ Thầy Cơ và các bạn sẽ giúp cho nhómchúng em ngày càng cải thiện được độ hiệu quả lên mức cao hơn nhằm đóng góp, cảithiện cho trải nghiệm người dùng ngày càng tốt hơn.

Chúng em xin trân trọng gửi lời cảm ơn đến Cô Đỗ Thị Thanh Tuyền đã hỗ trợ chonhóm thực hiện đề tài trên, và những góp ý của cơ chúng em sẽ ghi nhận đồng thời sẽcải thiện thêm trong tương lai để giúp đề tài ngày càng phát triển hơn nữa.

<b>Sinh viên thực hiệnNguyễn KhánhNguyễn Hoàng Ngọc Hải</b>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

3.1.1. Tổng quan thị trường...18

3.1.2. Hiện trạng của các nền tảng giao tiếp tin nhắn phổ biến...19

3.1.3. Ưu điểm của các nền tảng hiện tại...19

3.1.3.1. Khả năng tiếp cận dễ dàng...19

3.1.3.2. Đa dạng chức năng & công cụ hỗ trợ...20

3.1.3.3. Hỗ trợ lưu lượng người dùng lớn & độ trễ thấp...20

3.1.4. Nhược điểm của các nền tảng hiện tại...20

3.1.4.1. Bảo mật và quyền riêng tư...20

3.1.4.2. Sự minh bạch về dữ liệu người dùng...20

3.1.4.3. Khả năng tự vận hành & quản lý...21

3.1.5. Phương hướng giải quyết...21

3.1.5.1. Các vấn đề đồ án nhắm tới...21

3.1.5.2. Các nền tảng tương tự...21

3.2. Phân tích yêu cầu hệ thống...22

3.2.1. Yêu cầu tổng quan...22

3.2.1.1. Yêu cầu ứng dụng...22

3.2.1.2. Đối tượng sử dụng...22

3.2.1.3. Yêu cầu công nghệ & mục tiêu phát triển...22

3.2.1.4. Yêu cầu chức năng...23

3.2.1.5. Quản lý tin nhắn và trao đổi thông tin...24

3.2.1.6. Quản lý thông báo...24

3.2.1.7. Tìm kiếm...24

3.2.1.8. Quản lý bảo mật thơng tin & bảo mật chức năng...24

3.2.1.9. Quản lý vai trò trong ứng dụng...24

3.2.2. Yêu cầu phi chức năng...25

3.2.2.1. Hiệu suất hệ thống (Performance)...25

3.2.2.2. Độ tin cậy & độ khả dụng của hệ thống (Reliability & Availability)...25

3.2.2.3. Khả năng vận hành (Usability)...26

3.2.2.4. Khả năng mở rộng (Scalability)...26

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

3.2.2.6. Tuân thủ dữ liệu, sao lưu và khôi phục (Data Compliance, Backup &

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<b>CHƯƠNG 4: THỰC NGHIỆM HỆ THỐNG & ĐÁNH GIÁ...77</b>

4.1. Backend & vận hành máy chủ...77

4.2. Thông số kiểm thử thu được...80

<b>KẾT LUẬN & HƯỚNG PHÁT TRIỂN...88</b>

Kết luận...88

Hướng phát triển...88

<b>TÀI LIỆU THAM KHẢO & PHỤ LỤC...89</b>

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b>MỤC LỤC HÌNH ẢNH</b>

Hình 2.1. Biểu đồ số lượng người dùng khả dụng trong tháng đối với các ứng dụng social

network (tháng 10 năm 2023), Statista <small>[1]</small>...18

Hình 2.2. Biểu đồ số lượng tin nhắn được ứng dụng WhatsApp xử lý hằng ngày, xét theo từngquý của năm 2023, Statista <small>[2]</small>...19

Hình 2.3. Logo ứng dụng Signal, Element và Let’s Chat theo thứ tự...21

Hình 3.1. Software Architecture Diagram tổng quan...29

Hình 3.2. Benchmark FastAPI so với các framework phổ biến khác<small>[4]</small>...30

Hình 3.3. Bộ cơng cụ HTTP Gorilla Toolkit...31

Hình 3.4. Sử dụng Redis trong việc thiết kế bộ nhớ đệm...32

Hình 3.5. Cấu trúc ScyllaDB với 5 node, RF=3 và CL=1...33

Hình 3.6. Biểu đồ Venn của CAP Theorem...34

Hình 3.7. Phương thức Round Robin của load balancer...35

Hình 3.8. Software Architecture Diagram – phần API Backend...36

Hình 3.9. Software Architecture Diagram – phần Websocket backend...37

Hình 3.10. Entity Relationship Diagram...40

Hình 3.11. Application Workflow Diagram...45

Hình 3.12. Giao diện màn hình đăng nhập...60

Hình 3.13. Giao diện màn hình đăng ký...61

Hình 3.14. Màn hình chính...62

Hình 3.15. Thơng tin người dùng...63

Hình 3.16. Cấu trúc của dữ liệu sau khi được băm bằng BCrypt...64

Hình 3.17. Ví dụ một cặp token trả về...65

Hình 3.18. Ví dụ một file mơi trường của hệ thống...66

Hình 3.19. So sánh giữa cấu trúc máy ảo và container của Docker...67

Hình 3.20. Mối quan hệ giữa Prometheus và Grafana...68

Hình 3.21. Một output mẫu sau khi K6 hồn thành test...70

Hình 3.22. Trực quan các phương pháp kiểm thử hiệu năng<small>[5]</small>...72

Hình 3.23. Chu trình thực hiện của testcase http-read.js...72

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

Hình 3.24. Chu trình thực hiện của testcase ws-read-write.js...73

Hình 3.25. Chu trình thực hiện của testcase http-ws-read-write.js...74

Hình 3.26. Chu trình thực hiện của testcase signin.js...75

Hình 3.27. Chu trình thực hiện của testcase ws-connect.js...75

Hình 4.1. Backend service và Websocket service được tự động chạy trên Jenkins...77

Hình 4.2. Các container vận hành trên server được theo dõi qua Portainer...77

Hình 4.3. Grafana Dashboard cho RabbitMQ service trên hệ thống...78

Hình 4.4. Grafana Dashboard cho API Backend và WS Backend trên hệ thống...78

Hình 4.5. API Backend documentation cho các HTTP endpoint...79

Hình 4.6. Kết quả Breakpoint Test của testcase signin.js...80

Hình 4.7. Kết quả Breakpoint Test của testcase ws-connect.js...80

Hình 4.8. Kết quả Breakpoint Test của testcase http-read.js...81

Hình 4.9. Kết quả Load Test của testcase http-read.js...82

Hình 4.10. Kết quả Breakpoint Test của testcase ws-read-write.js...83

Hình 4.11. Kết quả Load Test của testcase ws-read-write.js...84

Hình 4.12. Kết quả Breakpoint Test của testcase http-ws-read-write.js...85

Hình 4.13. Kết quả Load Test của testcase http-ws-read-write.js...86

Hình 4.14. Lock và Unlock connection map trong quá trình đọc/ghi (WS Backend)...87

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

Bảng 3.14. Bảng danh sách các Use case...45

Bảng 3.15. UC01 – Tạo tài khoản...46

Bảng 3.16. UC02 – Đăng nhập...48

Bảng 3.17. UC03 – Chỉnh sửa tài khoản...49

Bảng 3.18. UC04 – Tạo nhóm mới...50

Bảng 3.19. UC05 – Tham gia nhóm cơng khai...51

Bảng 3.20. UC06 – Xác nhận lời mời nhóm riêng tư...52

Bảng 3.21. UC07 – Gửi tin nhắn vào nhóm...53

Bảng 3.22. UC08 - Gửi tập tin vào nhóm...54

Bảng 3.23. UC09 – Rời nhóm...55

Bảng 3.24. UC10 – Xố nhóm...56

Bảng 3.25. UC11 – Quản lý quyền Admin nhóm...57

Bảng 3.26. UC12 – Chỉnh sửa thơng tin nhóm...58

Bảng 3.27. UC13 – Chỉnh sửa người tham gia nhóm...59

Bảng 3.28. Các thành phần của màn hình Đăng nhập...61

Bảng 3.29. Các thành phần của màn hình Đăng ký...61

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

Bảng 3.30. Các thành phần của màn hình chính...62

Bảng 3.31. Các thành phần của màn hình Thơng tin người dùng...63

Bảng 3.32. Bảng thơng số cấu hình hệ thống thực nghiệm...68

Bảng 3.33. Bảng phân loại các phương pháp kiểm thử hiệu năng...71

Bảng 3.34. Bảng thông số hiệu suất đề ra...76

Hình 4.1. Bảng thơng số tổng hợp thu được...87

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b>CHƯƠNG 1: TỔNG QUAN ĐỀ TÀI</b>

<b>1.1. Tên đề tài </b>

 <i><b>Tên đề tài: Xây dựng hệ thống nhắn tin thời gian thực tối ưu cho tải trọng dữ liệu</b></i>

 <i><b>Tên sản phẩm: EchoChat</b></i>

<b>1.2. Lý do chọn đề tài</b>

Ngày nay, cùng với sự phát triển của xã hội, nhu cầu giao tiếp nhanh chóng trên mơitrường mạng đang ngày càng có một vai trị quan trọng hơn, từ đấy nhu cầu thiết kế cáchệ thống cho việc giao tiếp hiệu quả được tăng lên đáng kể, cùng với đó là các yêu cầuchặt chẽ về an toàn dữ liệu cho các đối tượng người dùng cụ thể cũng đang và được đềcao.

Với sự gia tăng vượt bậc về giao tiếp trực tuyến và tốc độ Internet ngày càng tức thời,các hệ thống tin nhắn thời gian thực có tải trọng tốt và độ bảo mật cao sẽ đáp ứng nhucầu giao tiếp tiện lợi và an toàn của người dùng, đồng thời hỗ trợ trong nhiều lĩnh vựcnhư trị chuyện cá nhân, làm việc nhóm, hỗ trợ khách hàng cũng như nhiều tệp kháchhàng & hội nhóm với nhu cầu đa dạng.

Chọn đề tài xây dựng một ứng dụng nhắn tin trên môi trường mạng không chỉ là việcđáp ứng nhu cầu ngày càng cao về giao tiếp trực tuyến mà còn là sự hướng dẫn choviệc nghiên cứu và áp dụng các công nghệ mới nhất trong lĩnh vực phần mềm. Trongthời đại số hóa mạnh mẽ, việc tạo ra một ứng dụng nhắn tin trên web đặt ra nhiều tháchthức kỹ thuật, từ việc xây dựng giao diện người dùng thân thiện đến việc tối ưu hóahiệu suất và đảm bảo an tồn thơng tin.

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

Việc lựa chọn đề tài này xuất phát từ mong muốn trong việc nắm vững, áp dụng cáckiến trúc nhằm đảm bảo tính liên tục và hiệu quả của các hệ thống giao tiếp trong môitrường mạng thời nay, cũng như đảm bảo độ an toàn, bảo mật của dữ liệu người dùng.

<b>1.3. Mục tiêu của đồ án</b>

Mục tiêu chính của đồ án là thiết kế và triển khai một hệ thống nhắn tin đa người dùngmạnh mẽ và linh hoạt, hỗ trợ đầy đủ các tính năng cần thiết để đáp ứng nhu cầu ngàycàng cao về giao tiếp trực tuyến. Đặc biệt, chúng ta sẽ tập trung vào ba mục tiêu cụ thểquan trọng để đảm bảo sự thành cơng và sự chấp nhận từ phía người dùng:

<b>1.3.1.Hiệu năng và khả năng mở rộng</b>

Một trong những mục tiêu hàng đầu của dự án là thiết kế hệ thống với hiệu suấtcao và khả năng mở rộng linh hoạt. Hệ thống cần được tối ưu hóa cấu trúc để đápứng được cả yêu cầu của các hạ tầng vừa và nhỏ, đồng thời tích hợp cấu trúc phântán để dễ dàng mở rộng khi nhu cầu tăng lên. Việc này giúp đảm bảo rằng hệ thốngcó thể linh hoạt thích ứng với số lượng người dùng đồng thời và đảm bảo trảinghiệm người dùng mượt mà.

<b>1.3.2.Bảo mật dữ liệu</b>

Một yếu tố quan trọng không thể phớt lờ là đảm bảo an toàn và bảo mật của dữ liệungười dùng. Hệ thống sẽ tích hợp các biện pháp bảo mật mạnh mẽ như mã hóa vàcấp quyền để đảm bảo sự bảo vệ các tính năng. Ngồi ra, hệ thống sẽ có tuỳ chọntự vận hành và sử dụng cho các tổ chức, cá nhân có nhu cầu chặt chẽ tối đa.

<b>1.3.3.Khả năng vận hành & quản lý</b>

Một mục tiêu quan trọng khác là thiết kế hệ thống đảm bảo khả năng tự triển khaivà vận hành dễ dàng. Hệ thống cần được đóng gói thành một bộ cài đặt đơn giản

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

cách nhanh chóng mà khơng địi hỏi kiến thức chun sâu về cơng nghệ. Điều nàycũng sẽ tăng khả năng sử dụng hệ thống cho những tổ chức hoặc nhóm nhỏ cóNgyuen vọng tự quản lý và duy trì hệ thống của mình.

<b>1.4. Phạm vi phát triển đề tài</b>

 <i><b>Phạm vi phát triển & vận hành: hệ thống vận hành trên máy chủ tự quản lý hoặc</b></i>

trên các nền tảng đám mây, được áp dụng các kĩ thuật để bảo đảm hiệu năng ứngdụng

 <i><b>Phạm vi truy cập: qua trình duyệt web ở các nền tảng hỗ trợ (máy tính,</b></i>

smartphone, tablet, …)

 <i><b>Phạm vi tính năng: ứng dụng cung cấp các tính năng quản lý người dùng, tạo các</b></i>

hội nhóm trị chuyện, gửi tin nhắn văn bản và tập tin đa phương tiện, cùng với cáctính năng phụ trợ (quản lý nhóm, thơng báo, bảo mật dữ liệu, …)

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

<b>CHƯƠNG 2: CƠ SỞ LÝ THUYẾT</b>

<b>2.1. Framework</b>

ReactJS là một thư viện JavaScript được sử dụng rộng rãi để xây dựng giao diệnngười dùng, đặc biệt là trong các ứng dụng có nội dung động. Được phát triển vàduy trì bởi Facebook, ReactJS tuân theo kiến trúc dựa trên thành phần, giúp tăngkhả năng tái sử dụng và dễ bảo trì. Virtual DOM của nó cập nhật hiệu quả chỉnhững phần thay đổi trong DOM thực tế, giúp cải thiện hiệu suất. ReactJS cũng hỗtrợ khái niệm luồng dữ liệu một chiều, giúp quản lý trạng thái và điều khiển dữ liệutrong ứng dụng một cách dễ dàng.

FastAPI là một web framework hiện đại, nhanh chóng (hiệu suất cao) được sửdụng để xây dựng API với Python 3.7+ dựa trên gợi ý kiểu dữ liệu tiêu chuẩn củaPython. Nó được thiết kế để sử dụng dễ dàng, đồng thời cũng mạnh mẽ và chắcchắn. FastAPI tận dụng sức mạnh của lập trình khơng đồng bộ, làm cho nó phù hợpcho việc xử lý một lượng lớn các yêu cầu đồng thời. Với khả năng tự động tạoOpenAPI và JSON Schema, FastAPI đơn giản hóa việc thiết lập documentation vàkiểm tra API.

<b>2.1.3.Gorilla Websocket</b>

Gorilla Websocket là một thư viện WebSocket cho ngôn ngữ lập trình Golang,được sử dụng để xây dựng các ứng dụng thời gian thực và truyền tải dữ liệu mộtcách hiệu quả. Với Gorilla Websocket, việc thiết lập và duy trì kết nối WebSockettrở nên đơn giản, giúp ứng dụng tương tác và giao tiếp trực tiếp với server.

<b>2.2. Database</b>

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

PostgreSQL là hệ quản trị cơ sở dữ liệu mạnh mẽ và có khả năng mở rộng. Đượcưa chuộng trong các dự án có u cầu về tính nhất quán, bảo mật, và độ tin cậycao, PostgreSQL hỗ trợ nhiều loại dữ liệu và cung cấp các tính năng như giao dịch,phân quyền, và truy vấn phức tạp, làm cho nó trở thành lựa chọn lý tưởng cho việclưu trữ dữ liệu trong các ứng dụng phức tạp.

Redis là hệ thống cơ sở dữ liệu lưu trữ key-value có hiệu suất cao, được sử dụngchủ yếu để lưu trữ dữ liệu tạm thời và cache. Với khả năng xử lý dữ liệu nhanhchóng và hỗ trợ nhiều kiểu dữ liệu, Redis là một công cụ linh hoạt và mạnh mẽ choviệc quản lý và truy cập dữ liệu trong ứng dụng.

ScyllaDB là một hệ cơ sở dữ liệu NoSQL, sử dụng kiến trúc Apache Cassandra đểcung cấp hiệu suất cao và khả năng mở rộng tốt. Với thiết kế phân tán và khả năngđồng bộ, ScyllaDB thích hợp cho các ứng dụng đòi hỏi xử lý dữ liệu lớn và đồngthời đảm bảo sự đồng nhất và tin cậy.

<b>2.3. Công cụ hỗ trợ2.3.1.RabbitMQ</b>

RabbitMQ là một dịch vụ message queue giúp các thành phần trong hệ thống giaotiếp và truyền thông tin một cách linh hoạt. Với RabbitMQ, việc xử lý hàng đợi vàtruyền tải thông điệp giữa các ứng dụng trở nên dễ dàng, tăng tính ổn định và mởrộng của hệ thống.

<b>2.3.2.Prometheus</b>

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

Prometheus là một hệ thống giám sát và cảnh báo mã nguồn mở, được thiết kế đểtheo dõi các thành phần trong hệ thống. Prometheus tự động thu thập thông tin vàcung cấp giao diện để theo dõi hiệu suất, giúp quản trị viên hệ thống giữ cho ứngdụng luôn hoạt động mượt mà.

<b>2.3.3.Grafana k6</b>

Grafana k6 là một công cụ giám sát hiệu suất cho phép kiểm tra và đánh giá độ ổnđịnh của hệ thống. Kết hợp giữa Grafana và k6, nó cung cấp thơng tin chi tiết vềhiệu suất và khả năng chịu tải của ứng dụng, giúp nhận diện và khắc phục vấn đềnhanh chóng.

<b>2.4. Vận hành & quản lý2.4.1.Ubuntu Server</b>

Ubuntu Server là một hệ điều hành Linux phổ biến được sử dụng cho việc triểnkhai ứng dụng và quản lý máy chủ. Với sự ổn định và hỗ trợ cộng đồng lớn,Ubuntu Server là một lựa chọn phổ biến cho việc vận hành hệ thống và triển khaiứng dụng.

Docker là một nền tảng ảo hóa dựa trên container, giúp đóng gói ứng dụng và tất cảcác phụ thuộc của chúng vào một container duy nhất. Điều này tạo ra môi trườngđồng nhất và di động, giúp triển khai ứng dụng dễ dàng và hiệu quả.

Jenkins là một cơng cụ tự động hóa CI/CD (continuous integration/continuousdelivery) giúp quản lý và triển khai mã nguồn một cách liên tục. Với Jenkins, quytrình phát triển và triển khai ứng dụng trở nên tự động và có thể lặp đi lặp lại, giúp

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

Grafana là một cơng cụ giám sát và trực quan hóa dữ liệu, thường được sử dụng đểhiển thị và phân tích thơng tin từ các nguồn khác nhau. Grafana cung cấp giao diệnđồ họa mạnh mẽ và linh hoạt, giúp quản trị viên hệ thống theo dõi hiệu suất và đưara quyết định thông minh.

NGINX là một máy chủ web và reverse proxy rất phổ biến, được sử dụng để xử lývà chuyển hướng các yêu cầu HTTP. Với khả năng xử lý tải cao và cấu hình linhhoạt, NGINX là một phần quan trọng trong việc triển khai ứng dụng web và cungcấp các dịch vụ proxy đáng tin cậy.

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

<b>CHƯƠNG 3: PHÂN TÍCH THIẾT KẾ HỆ THỐNG</b>

<b>3.1. Phân tích thực tế</b>

<b>3.1.1.Tổng quan thị trường</b>

Ngày nay, thị trường giao tiếp tin nhắn trực tuyến đang cực kỳ đa dạng với nhiềusản phẩm có quy mơ lớn đi kèm với số lượng người dùng đơng đảo. Có thể kể đếnnhiều nền tảng phổ biến như WhatsApp, Facebook Messenger, WeChat, Telegram,Discord, Zalo (tại Việt Nam), …, các ứng dụng này thu hút hàng tỷ người dùngtrên toàn thế giới, tạo ra sự cạnh tranh khốc liệt trong việc cung cấp trải nghiệmngười dùng tốt nhất và đáp ứng nhu cầu đa dạng của họ

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<b>3.1.2.Hiện trạng của các nền tảng giao tiếp tin nhắn phổ biến</b>

Các nền tảng lớn hiện nay đã và đang tối ưu hệ thống của họ nhằm xử lý hàng tỷtin nhắn mỗi ngày từ người dùng theo thời gian thực, cùng với đó vẫn liên tục pháttriển các tính năng mới nhằm thu hút người dùng sử dụng.

<i>Hình 2.2. Biểu đồ số lượng tin nhắn được ứng dụng WhatsApp xử lý hằng ngày, xéttheo từng quý của năm 2023, Statista <small>[2]</small></i>

Như ở hình trên, ứng dụng WhatsApp là một trong những ứng dụng tin nhắn có sốlượng người dùng lớn nhất trong các nền tảng social media hiện tại, và cũng vì thếsố lượng dữ liệu phải xử lý đằng sau hệ thống cũng là một con số khổng lồ, kể cảkhi xét trên vài năm về trước.

Tuy nhiên, việc sử dụng các nền tảng lớn kể trên hiện nay đều có những điểmmạnh và điểm yếu rõ ràng mà ta cần phân tích trước khi áp dụng.

<b>3.1.3.Ưu điểm của các nền tảng hiện tại</b>

<i>3.1.3.1.Khả năng tiếp cận dễ dàng</i>

Trong thực tế, các nền tảng như WhatsApp, Facebook Messenger và Telegramđều nổi bật với khả năng tiếp cận dễ dàng. Các ứng dụng này đều có sẵn trênnhiều nền tảng, bao gồm cả điện thoại di động và máy tính, giúp người dùngkết nối mọi lúc, mọi nơi. Ngoài ra, việc đăng nhập thông qua các tài khoảnmạng xã hội cũng giúp việc tiếp cận trở nên thuận tiện và nhanh chóng.

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

<i>3.1.3.2.Đa dạng chức năng & công cụ hỗ trợ</i>

Các nền tảng giao tiếp tin nhắn hiện tại đều hỗ trợ một loạt các chức năng vàcông cụ giúp người dùng trải nghiệm đa dạng. Từ gửi tin nhắn văn bản, hìnhảnh, gắn thẻ người dùng đến cuộc gọi video và tạo nhóm, các ứng dụng nàyđáp ứng đầy đủ nhu cầu giao tiếp của người dùng hiện đại.

Và cùng với đó các chức năng mới vẫn đang được phát triển liên tục, ví dụnhư tính năng nhắn tin ẩn và trị chơi hội nhóm tích hợp bên trong phòng chat.

<i>3.1.3.3.Hỗ trợ lưu lượng người dùng lớn & độ trễ thấp</i>

Với số lượng người dùng khổng lồ, các nền tảng như WhatsApp, FacebookMessenger và WeChat đã chứng minh khả năng hỗ trợ lưu lượng người dùngkhổng lồ mà vẫn giữ được độ trễ tối thiểu trong đường truyền của tin nhắnbằng sự đầu tư mạnh mẽ vào cơ sở hạ tầng và thiết kế của hệ thống. Điều nàyđặc biệt quan trọng trong việc duy trì trải nghiệm người dùng mượt mà, hiệuquả và khơng gây khó chịu, từ đó giữ người dùng sử dụng nền tảng.

<b>3.1.4.Nhược điểm của các nền tảng hiện tại</b>

<i>3.1.4.1.Bảo mật và quyền riêng tư</i>

Mặc dù các nền tảng giao tiếp tin nhắn đã đưa ra nhiều biện pháp bảo mật,nhưng vẫn tồn tại những điểm yếu đối với quyền riêng tư và bảo mật dữ liệungười dùng. Đặc biệt, những vấn đề như lỗ hổng trong chính sách chia sẻ dữliệu có thể tạo nên nguy cơ đối với sự riêng tư của dữ liệu người dùng.

<i>3.1.4.2.Sự minh bạch về dữ liệu người dùng</i>

Đi kèm với các chính sách ngầm phức tạp, mức độ minh bạch về việc thu thậpvà sử dụng dữ liệu người dùng cũng là một vấn đề gặp nhiều tranh cãi, nhất làkhi các tổ chức & công ty lớn như Meta (sở hữu WhatsApp, Messenger) vàTencent (sở hữu WeChat) thường khơng có lịch sử tốt về việc sử dụng dữ liệungười dùng.

<i>3.1.4.3.Khả năng tự vận hành & quản lý</i>

Các ứng dụng kể trên không công khai kiến trúc, và việc sử dụng ứng dụngphải phụ thuộc vào hạ tầng của cơng ty sở hữu, điều đó gây khó khăn nếu

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

quản lý tồn bộ dữ liệu nhằm tối đa khả năng bảo mật (ví dụ như dữ liệu nộibộ doanh nghiệp)

<b>3.1.5.Phương hướng giải quyết</b>

<i>3.1.5.1.Các vấn đề đồ án nhắm tới</i>

Phương hướng của đồ án sẽ nhắm đến việc học hỏi, áp dụng các điểm mạnhvề hiệu năng cũng như độ mở rộng của các hệ thống lớn có sẵn, cùng với đấylà thiết kế các cấu trúc, tính năng riêng để giải quyết các vấn đề bất cập vàphục vụ cho các nhóm người dùng cần những tính năng kể trên. Ngồi ra, đồán cũng hướng tới việc cải thiện khả năng tự vận hành và quản lý từ phíangười dùng.

<i>3.1.5.2.Các nền tảng tương tự</i>

Chúng ta có thể tham khảo các nền tảng tin nhắn mã nguồn mở khá phổ biếnnhư:

 <i><b>Signal: hệ thống nhắn tin mã nguồn mở miễn phí cho iOS, Android và</b></i>

desktop, tập trung vào khả năng bảo mật cực kỳ mạnh và tính năng đầy đủcho đa số nhu cầu người dùng.

 <b>Element: hệ thống nhắn tin mã nguồn mở miễn phí cung cấp khả năng mã</b>

hố end-to-end, cùng với việc tích hợp với các dịch vụ khác như Discord,Slack và cung cấp khả năng tự vận hành.

 <b>Let’s Chat: ứng dụng nhắn tin tự triển khai cho nhu cầu người dùng và hội</b>

nhóm nhỏ có nhu cầu.

<i>Hình 2.3. Logo ứng dụng Signal, Element và Let’s Chat theo thứ tự</i>

<b>3.2. Phân tích yêu cầu hệ thống3.2.1.Yêu cầu tổng quan</b>

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<i>3.2.1.1.Yêu cầu ứng dụng</i>

 Phát triển được một ứng dụng nhắn tin trên nền tảng web cung cấp hệthống vận hành tối ưu cho việc xử lý số lượng người dùng cao và kết nốiđồng thời với nhiều người dùng

 Cung cấp cho người dùng một nền tảng giao tiếp thời gian thực cho việctrao đổi tin nhắn văn bản và các tập tin đa phương tiện với đầy đủ các tínhnăng cho đa số nhu cầu sử dụng

 Hệ thống cung cấp khả năng khởi chạy đơn giản và khả năng tự triển khai,vận hành cho các nhu cầu cá nhân, tổ chức

<i><b>- Đối với backend: Sử dụng các framework có hiệu năng cao, hỗ trợ việc</b></i>

thiết kế HTTP endpoint cho các yêu cầu cơ bản và Websocket endpointcho các yêu cầu thời gian thực, cùng với hỗ trợ các tính năng bảo mậtđường truyền và bảo vệ dữ liệu.

<i><b>- Đối với hệ thống vận hành: áp dụng các biện pháp vận hành container,</b></i>

cân bằng tải và bảo mật kết nối giữa các services; cùng với việc cung cấpcác công cụ theo dõi nhằm đảm bảo backend vận hành như mong muốn,cũng như phát hiện lỗi nếu có.

<i><b>- Đối với frontend: Sử dụng framework có cấu trúc, tốc độ phát triển</b></i>

nhanh cho việc demo và thiết kế MVP.

<i>3.2.1.3.2.Mục tiêu phát triển</i>

- Phát triển được một hệ thống hoàn chỉnh đầy đủ các thành phần backend,frontend và vận hành được trên máy chủ cũng như trên các nền tảng đámmây.

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

- Source code phát triển có độ sạch sẽ cao, các thành phần được phân táchrõ ràng, cũng như được chú thích và cung cấp hướng dẫn cho nhu cầu tựvận hành của người dùng

<i>3.2.1.4.Yêu cầu chức năng</i>

<i>3.2.1.4.2.Quản lý thông tin người dùng</i>

- Người dùng có thể cung cấp và sửa đổi thơng tin cho hồ sơ của họ, baogồm tên người dùng, mã số nhận dạng, ảnh đại diện và mô tả người dùng- Người dùng có quyền chỉnh sửa tên tài khoản, mật khẩu và email liên kết- Người dùng có thể yêu cầu xóa tài khoản, đi cùng với xóa các thơng tin

cá nhân của người dùng

<i>3.2.1.4.3.Quản lý hội nhóm</i>

<i><b>- Tạo nhóm: người dùng có thể tạo nhóm riêng và được cấp quyền quản</b></i>

trị viên (admin) cho nhóm đó

<i><b>- Xem thơng tin nhóm: người dùng có thể xem tên, ảnh đại diện, người</b></i>

tham gia nhóm và trạng thái của họ, cùng một vài thơng tin khác

<i><b>- Chỉnh sửa thơng tin nhóm: </b></i>

o Các admin nhóm có thể thay đổi tên nhóm, ảnh đại diện nhóm vàcài đặt hiển thị của nhóm (nhóm cơng khai hoặc riêng tư)

o Admin nhóm có thể chọn các thành viên khác trong nhóm cùnglàm admin

<i><b>- Tham gia nhóm: người dùng có thể tự tham gia các nhóm cơng khai qua</b></i>

liên kết nhóm, và có thể được mời tham gia các nhóm riêng tư qua lờimời của admin

<i><b>- Rời nhóm: các thành viên nhóm có thể tự rời nhóm hoặc được admin</b></i>

mời khỏi nhóm

<i>3.2.1.5.Quản lý tin nhắn và trao đổi thông tin</i>

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

 Người tham gia nhóm có thể gửi nhiều loại tin nhắn vào nhóm:- Tin nhắn văn bản, đường liên kết

- Icon, biểu tượng cảm xúc

- Tập tin đa phương tiện (file, hình ảnh, video, …)

 Người tham gia nhóm có thể ghim tin nhắn của bản thân hoặc của ngườikhác

<i>3.2.1.6.Quản lý thông báo</i>

Người dùng sẽ nhận được thông báo theo thời gian thực về:

 Kết quả của các thao tác quan trọng (tạo nhóm mới, thêm/xố thành viênkhỏi nhóm, …)

 Lời mời tham gia nhóm mới Các tin nhắn mới trong nhóm

 Các thơng báo quan trọng từ hệ thống (cập nhật, bảo trì, …)

<i>3.2.1.7.Tìm kiếm</i>

 Người dùng có thể tìm kiếm thơng tin của những người dùng khác qua tên Người dùng có thể tìm kiếm các tin nhắn trong nhóm qua cụm từ tìm kiếm

<i>3.2.1.8.Quản lý bảo mật thông tin & bảo mật chức năng</i>

 Người dùng khi đăng nhập thành công sẽ được cấp access token và refreshtoken để xác thực cho các tính năng trong hệ thống

 Các nhóm riêng tư sẽ khơng thể được tìm kiếm từ bên ngồi, và ngườidùng khơng thể tham gia các nhóm riêng tư mà cần phải chấp nhận lời mờicủa Admin nhóm đó

<i>3.2.1.9.Quản lý vai trị trong ứng dụng</i>

 <i><b>User: người dùng đã đăng ký tài khoản trên hệ thống. User là vai trị cơ</b></i>

bản trong hệ thống, có quyền xem, chỉnh sửa thông tin cá nhân, tham giacác nhóm cơng khai hoặc các nhóm riêng tư có lời mời, xem thơng tin vàgửi tin nhắn vào các nhóm đã tham gia, gửi báo cáo vi phạm, …

 <i><b>Group Admin (admin nhóm): bao gồm các quyền của User, cùng với đó</b></i>

có quyền thêm / bớt người trong nhóm, chỉnh sửa thơng tin và cài đặt hiểnthị của nhóm, gán / bỏ gán quyền admin cho các thành viên nhóm

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

 <i><b>Application Admin (admin hệ thống): có quyền xem thông tin nhật ký hệ</b></i>

thống, theo dõi các thông số hệ thống, xem / thực thi hành động đối với cácbáo cáo vi phạm, thêm người khác làm admin hệ thống

<b>3.2.2.Yêu cầu phi chức năng</b>

<i>3.2.2.1.Hiệu suất hệ thống (Performance)</i>

Hệ thống cần được tối ưu về cả phần mềm lẫn phần cứng để chịu được tảitrọng giao tiếp cao, số lượng người dùng kết nối cùng lúc lớn trong giới hạnsức mạnh phần cứng

Các mức hiệu suất cần được kiểm tra bằng công cụ load test trong khoảng thờigian nhất định để đảm bảo rằng hệ thống có thể vận hành ổn định và khôngphát sinh lỗi.

<i>3.2.2.2.Độ tin cậy & độ khả dụng của hệ thống (Reliability & Availability)</i>

 Hệ thống cần có tốc độ phản hồi giữa người dùng và các tính năng trongmức độ cho phép (trong khoảng từ 200ms tới dưới 1s được coi là trongmức độ cho phép, theo Google<small>[3]</small>)

 Dữ liệu hệ thống cần được đảm bảo cập nhật liên tục để tránh sự mất đồngbộ giữa các người dùng khác nhau.

 Hệ thống cần có các chức năng quản lý lỗi, xử lý sự cố và tự động phục hồiđể tránh các trường hợp gây sập / tắc nghẽn hệ thống.

 Cố gắng đảm bảo tỉ lệ uptime (tỉ lệ giữa thời gian vận hành và thời gianbảo trì, sửa lỗi) để đảm bảo sự ổn định, trơn tru trong việc sử dụng củangười dùng

<i>3.2.2.3.Khả năng vận hành (Usability)</i>

 <i><b>Đối với ứng dụng: cần đảm bảo giao diện trực quan, các câu lệnh request</b></i>

có format rõ ràng, cùng với các ví dụ để tránh việc người dùng bị nhầmcông năng sử dụng

 <i><b>Đối với hệ thống:</b></i>

- Thiết kế hệ thống được trình bày rõ ràng, đầy đủ tài liệu hướng dẫn khởichạy & mở rộng hệ thống cho các nhu cầu riêng của cá nhân / tổ chức

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

- Cung cấp các cổng kết nối với công cụ quản lý bên thứ ba để cung cấpthêm khả năng quản lý và theo dõi thông số

 Hệ thống cung cấp được các thơng số về q trình hoạt động của các thànhphần, cũng như sử dụng các công cụ trực quan để người quản lý dễ quansát, nhận biết các điểm tắc nghẽn (nút cổ chai) và nâng cấp nếu cần thiết

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

Mỗi thành phần trong hệ thống cần cung cấp khả năng tạo replica (tạo bản saohoạt động song song) để giải quyết các vấn đề tắc nghẽn cụ thể về sau.

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

<b>3.3. Thiết kế kiến trúc hệ thống</b>

<b>3.3.1.Tổng quan kiến trúc hệ thống</b>

<i>3.3.1.1.Các thành phần hệ thống</i>

 <i><b>Client: các kết nối từ người dùng thông qua giao diện Frontend. Tùy vào</b></i>

chức năng người dùng sử dụng mà Frontend tạo ra loại kết nối tương ứng(HTTP hoặc Websocket)

 <i><b>Load balancer: điểm quản lý các kết nối giữa client và server, cũng như</b></i>

thực hiện cân bằng tải (chia đều kết nối ra các thành phần song song) tronghệ thống

 <i><b>API backend: cung cấp API endpoint cho các tính năng cơ bản của ứng</b></i>

dụng, quản lý kiểm tra dữ liệu đầu vào và đầu ra, thực hiện truy vấn và xửlý dữ liệu từ các database cluster

 <i><b>Websocket backend: cung cấp Websocket endpoint cho các tính năng gửi</b></i>

& nhận thông báo tin nhắn theo thời gian thực

 <i><b>Các database: các cụm cơ sở dữ liệu được sử dụng riêng cho từng loại dữ</b></i>

liệu cụ thể.

 <i><b>Notification queue: hàng chờ dữ liệu (message queue) để cập nhật các</b></i>

thông báo mới của người dùng.

 <i><b>File server: service quản lý việc upload và tải file</b></i>

<i>3.3.1.2.Sơ đồ kiến trúc hệ thống</i>

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

<i>Hình 3.1. Software Architecture Diagram tổng quan</i>

<b>3.3.2.Chi tiết kiến trúc hệ thống</b>

<i>3.3.2.1.Bộ công nghệ áp dụng</i>

<i>3.3.2.1.1.Giao diện người dùng (Frontend)</i>

Framework: ReactJS được áp dụng để tái sử dụng các thành phần giao diệnvà tối ưu hiệu suất.

ReactJS là một thư viện JavaScript mạnh mẽ được phát triển bởi Facebook,chuyên dụng trong việc xây dựng giao diện người dùng hiệu quả và linhhoạt. Điểm nổi bật của ReactJS là khả năng tạo ra các thành phần(components) tái sử dụng, giúp quản lý mã nguồn một cách dễ dàng và duytrì ứng dụng một cách hiệu quả. Nó sử dụng mơ hình "one-way databinding" để tối ưu hóa hiệu suất và cung cấp một cách tiếp cận linh hoạttrong quản lý trạng thái ứng dụng

<i>3.3.2.1.2.API Backend</i>

Framework: FastAPI (Python) cùng các thư viện hỗ trợ và thiết lập mơitrường

FastAPI là một micro-framework có hiệu suất cao với kiến trúc dựa trên

<b>Starlette và Pydantic. Việc FastAPI sử dụng chuẩn ASGI (AsynchronousServer Gateway Interface) hỗ trợ code bất đồng bộ cho server interface so</b>

với các Python framework khác chỉ sử dụng WSGI, cùng với việc cung cấpsẵn các biện pháp kiểm tra dữ liệu đầu vào qua Pydantic đã giúp FastAPI cóhiệu năng vận hành nhanh hơn đáng kể.

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

<i>Hình 3.2. Benchmark FastAPI so với các framework phổ biến khác<small>[4]</small></i>

Gorilla Websocket là một thư viện Websocket nằm trong bộ Gorilla Toolkitđược Golang gợi ý sử dụng. Thư viện cung cấp cấu trúc Websocket hồnthiện và đi kèm với documentation chi tiết, thích hợp cho việc thiết kế kếtnối Websocket ổn định và có cấu trúc.

<i>Hình 3.3. Bộ cơng cụ HTTP Gorilla Toolkit3.3.2.1.4.Database</i>

<i><b>- PostgreSQL: dùng để chứa các dữ liệu về thông tin của người dùng</b></i>

PostgreSQL là 1 hệ thống quản trị cơ sở dữ liệu SQL miễn phí và mã nguồnmở tiên tiến nhất hiện nay. PostgreSQL tích hợp nhiều tính năng hỗ trợ cáccâu truy vấn phức tạp, quản lý commit/rollback transaction và khả năng bảomật đáng tin cậy (SCRAM-SHA256, LDAP, …).

Với việc được phát triển từ rất sớm, PostgreSQL có tính ổn định và độ tin

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

<i><b>- Redis: dùng để thiết kế bộ nhớ đệm quản lý token kết nối và lưu trữ</b></i>

thông tin đệm của người dùng

<i>Hình 3.4. Sử dụng Redis trong việc thiết kế bộ nhớ đệm</i>

Redis là 1 cơ sở dữ liệu lưu trữ dữ liệu trên RAM (in-memory) dưới dạngkey-value rất mạnh mẽ và phổ biến. Redis là một lựa chọn tuyệt vời cho nhucầu lưu trữ các dữ liệu với tốc độ cao cũng như để tối ưu hệ thống, nhờ vàotốc độ đọc dữ liệu từ RAM và cấu trúc key-value có độ phức tạp thuật tốnthấp.

Ngồi ra Redis cũng hỗ trợ các tính năng lưu dữ liệu vào ổ đĩa, cũng như saolưu dữ liệu nếu cần thiết.

<b>- ScyllaDB: dùng để lưu trữ tin nhắn người dùng, dữ liệu hội nhóm và các</b>

dữ liệu thời gian thực khác (thơng báo, tin nhắn ghim, …)

ScyllaDB là 1 hệ thống cơ sở dữ liệu NoSQL phân tán dạng node mạnh mẽđược kế thừa từ Cassandra, một hệ thống cơ sở dữ liệu dạng node cực kỳphổ biến khác.

Với thiết kế theo dạng một chuỗi các node kết nối thành vòng tròn, một hệthống ScyllaDB có thể biến đổi theo thời gian bằng cách thêm/bớt node. Dữ

<i><b>liệu được phân bổ vào các node dựa trên Partition Key, với các phần tử dữ</b></i>

liệu có cùng Partition Key sẽ nằm ở chung node (các tin nhắn của cùng mộtnhóm, các nhóm đã tham gia của cùng một người, …), từ đó tăng tốc việctruy vấn dữ liệu.

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

Cùng với đó, việc thiết kế theo dạng node giúp cho ScyllaDB có các tính

<i><b>năng bảo tồn dữ liệu như Replication Factor (RF - một phần tử dữ liệunằm ở nhiều node) và Consistency Level (CL - số lượng phần tử dữ liệu tối</b></i>

thiểu để xác nhận dữ liệu tồn tại) rất mạnh mẽ.

<i>Hình 3.5. Cấu trúc ScyllaDB với 5 node, RF=3 và CL=13.3.2.1.5.Các công nghệ hỗ trợ</i>

<b>- RabbitMQ là hệ thống thiết kế message queue hiệu suất, nhỏ gọn và khả</b>

năng tải cao, thích hợp cho việc truyền tải thơng tin giữa các service.

<b>- NGINX là một trong những công cụ reverse proxy và load balancer phổ</b>

biến nhất hiện tại, với khả năng chuyển hướng đa dạng và xác thực, bảomật thơng tin đa dạng.

<i>3.3.2.2.Phân tích kiến trúc hệ thống3.3.2.2.1.Database</i>

<i><b>Nền tảng của kiến trúc cơ sở dữ liệu của đồ án được dựa trên định lý CAP</b></i>

<i>(CAP Theorem) của Eric Brewer: Khi lỗi phân vùng mạng (networkpartition failure) xảy ra, hệ thống phải lựa chọn một trong hai phương ánsau đây:</i>

<i>- Hủy tác vụ: điều này làm giảm tính khả dụng (availability) nhưng đảm</i>

bảo tính nhất quán (consistency) của hệ thống.

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

<i>- Tiếp tục thực hiện tác vụ: đảm bảo tính khả dụng nhưng có thể dẫn đến</i>

khơng nhất quán trong dữ liệu trả về.

<i>Hình 3.6. Biểu đồ Venn của CAP Theorem</i>

Hệ cơ sở dữ liệu của đồ án được chia thành 2 loại chính:

<i><b>- Relational (SQL): được sử dụng chính để lưu trữ các thơng tin cá nhân</b></i>

của người dùng. Sử dụng SQL database sẽ đảm bảo consistency của dữliệu cá nhân, từ đó đảm bảo nền tảng để thực hiện các chu trình phức tạphơn. Cùng với đó, các nền tảng SQL database thường có khả năng bảomật tốt hơn nhờ cấu trúc chắc chắn và thời gian phát triển lâu dài hơn.Nhóm sử dụng PostgreSQL làm relational database chính.

<i><b>- Non-relational (NoSQL): được sử dụng để lưu trữ các thơng tin về tin</b></i>

nhắn cũng như hội nhóm của người dùng, cũng như dùng để thiết kế bộnhớ đệm và tối ưu truy vấn. Nhóm sử dụng 2 loại non-relational databasechính:

o Database phân tán dạng node (ScyllaDB) để đảm bảo khả năngmở rộng cũng như tốc độ truy vấn cao do dữ liệu được lưu trữthành các partition. Cùng với đó database phân tán cũng hỗ trợviệc tạo nhiều bản sao dữ liệu ở các node khác nhau nhằm đảmbảo tính Availability cho hệ thống nếu một vài node có vấn đề.o Database dạng key-value (Redis) để làm vùng nhớ đệm cho các

thao tác lặp lại và ít thay đổi, do cấu trúc nhỏ gọn và độ phức tạptruy vấn thấp.

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

<i>3.3.2.2.2.Load balancer</i>

Load balancer đóng vai trị điều hướng các request từ client tới đúng service/server thực thi, cũng như chia đều tải tới các replica nếu chạy nhiềuservice/server song song.

Các phương thức chia tải phổ biến của load balancer:

<i><b>- Round Robin: chia đều request cho các service, là phương thức cơ bản</b></i>

<i>Hình 3.7. Phương thức Round Robin của load balancer</i>

<i><b>- Weighted Round Robin: có thể đặt tỉ lệ để một vài service nhận ít hoặc</b></i>

nhiều request hơn

<i><b>- Least Connection: gửi request tới các service đang có ít kết nối nhất </b></i>

Cùng với đó load balancer cũng có thể quản lý việc mã hố đường truyềnbằng các giao thức SSL/TLS như HTTPS và WSS.

Việc áp dụng Load balancer sẽ hỗ trợ việc mở rộng hệ thống theo chiềungang cũng như thêm/tạo bản sao của các service để chia đều khối lượngcơng việc về sau nếu có nhu cầu.

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

<i>3.3.2.2.3.API backend</i>

<i>Hình 3.8. Software Architecture Diagram – phần API Backend</i>

API backend trong hệ thống của nhóm có 3 cơng việc chính:

- Tạo các HTTP API endpoint để client tương tác với hệ thống: cácendpoint cho xác thực người dùng, thông tin cá nhân cũng như cho cáchành động với hội nhóm.

- Kết nối với các databases, thực hiện truy vấn và lưu trữ đệm nếu cầnthiết:

o Kết nối với Redis để lưu trữ / truy vấn thông tin người dùng trongbộ nhớ đệm và quản lý đăng xuất tài khoản (vô hiệu các tokenđăng nhập).

o Kết nối với PostgreSQL để thực hiện các chu trình liên quan đếnthơng tin người dùng.

o Kết nối với ScyllaDB để thực hiện các chu trình liên quan đến hộinhóm, người tham gia và tin nhắn.

- Kết nối với các service khác (ở đây bao gồm Websocket backend và Fileserver) để truyền tải dữ liệu:

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

o Gửi các thơng báo tạo/xố/sửa/… mới đến Websocket backendthông qua Notification queue.

o Truy xuất file từ file server.

<i>3.3.2.2.4.Websocket backend</i>

<i>Hình 3.9. Software Architecture Diagram – phần Websocket backend</i>

Websocket backend của hệ thống quản lý các kết nối Websocket thời gianthực giữa client và server. 3 chức năng chính của kết nối WS là:

- Gửi các thông báo cho người dùng (thông báo tin nhắn mới, chỉnhsửa/thêm/xố hội nhóm, …)

- Nhận và xử lý tin nhắn mới từ phía client

- Nhận và xử lý đánh dấu tin nhắn đã đọc từ phía clientWebsocket Manager của backend chứa một hashmap:

<b>map{ID tài khoản; các kết nối khả dụng của tài khoản đó}</b>

để điều hướng các thơng báo mới từ hệ thống đến đúng người dùng, cũngnhư hỗ trợ nhận thông báo cho tất cả các kết nối đang khả dụng của ngườidùng (mở nhiều tab ứng dụng)

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

Việc sử dụng Websocket backend ở ngôn ngữ Golang là do 2 lý do chính: - Hiệu năng của chức năng Websocket có sẵn trong FastAPI khơng cao và

cấu trúc thiết kế không rõ ràng

- Khả năng thiết kế goroutine (tương tự với asyncio trong Python) cho cácxử lý song song của Golang là rất mạnh mẽ và hiệu quả trong việc sửdụng tài nguyên hệ thống

<i>3.3.2.2.5.Các database</i>

Hệ thống sử dụng các thư viện ORM (Object Relational Mapping) tuỳ vàoframework thực hiện để đảm bảo xác thực các thuộc tính dữ liệu, cùng vớiđó là áp dụng transaction cho commit và rollback nếu có vấn đề xảy ra.Đối với dữ liệu người dùng được lưu trên PostgreSQL, dữ liệu của nhữngngười dùng sử dụng liên tục sẽ được lưu bản sao trên Redis để truy vấn vềsau, từ đó giảm được tải trọng đến database chính, cùng với đó là tăng tốccác cơng việc như xác thực token đăng nhập.

Đối với ScyllaDB, database cluster được thiết kế với 3 node kết nối vớinhau, cùng với Replication Factor 2 (mỗi phần tử dữ liệu có bản sao trong 2node) và Consistency Level 1 (truy vấn ít nhất 1 phần tử để xác nhận tồn tại)nhằm tăng tốc độ truy vấn và Availability của các node. Cùng với đó cấutrúc dữ liệu hội nhóm và tin nhắn cũng được tối ưu Partition Key để đảmbảo khả năng truy vấn trên số lượng dữ liệu lớn.

<i>3.3.2.2.6.Các notification queue</i>

Hệ thống sử dụng RabbitMQ để đảm bảo độ nhỏ gọn cũng như khả năngluân chuyển dữ liệu mạnh mẽ. Ngoài ra RabbitMQ cũng cung cấp các côngcụ theo dõi phù hợp với kích cỡ đồ án.

RabbitMQ có cấu trúc gồm các hàng chờ Queue, trình gửi dữ liệu Producervà trình nhận dữ liệu Consumer. Producer được thiết kế ở phía APIBackend, và WS Backend nhận các thông báo bằng cách dùng Consumerđọc từ trong queue.

<i>3.3.2.2.7.File server</i>

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

File server có thể sử dụng các service bên thứ ba như S3 (AWS), GoogleCloud Storage, hoặc tự thiết kế service chạy trên hệ thống.

Ảnh và file từ phía người dùng sẽ được đẩy lên File server trước khi thựchiện các hành động liên quan. Các service sẽ giao tiếp với nhau để xác nhậnfile tồn tại trước khi khởi chạy hành động tương ứng.

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

<b>3.4. Thiết kế chức năng</b>

<b>3.4.1.Thiết kế quản lý dữ liệu</b>

<i>3.4.1.1.Tổng quan thiết kế</i>

<i>Hình 3.10. Entity Relationship Diagram</i>

Các entity màu xanh đậm là dữ liệu người dùng được lưu trên PostgreSQL,với PK (Primary Key) là khố chính và FK (Foreign Key) là khoá ngoại.Các entity màu xanh nhạt là dữ liệu liên quan đến hội nhóm được lưu trênScyllaDB cluster, với P (Partition Key) xác định phân vùng và C (ClusteringKey) xác định thứ tự sắp xếp các dòng dữ liệu bên trong 1 partition.

<i>3.4.1.2.Các thuộc tính của entity</i>

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

<i>Bảng 3.5. Entity GroupByName</i>

</div>

×