Xây dựng máy chủ trò chuyện trực tuyến: Từ xử lý phân tán đến tối ưu hóa hiệu suất

Phát triển máy chủ trò chuyện thời gian thực WebSocket có khả năng mở rộng, xử lý lưu lượng truy cập lớn bằng cách xây dựng cụm 3 thực thể (instance) với Spring Boot 3.x + Kotlin, đồng thời sử dụng tin nhắn phân tán Redis Pub/Sub và bộ cân bằng tải Nginx.

(4.9) 29 đánh giá

241 học viên

Độ khó Nhập môn

Thời gian Không giới hạn

Spring
Spring
Kotlin
Kotlin
Spring Boot
Spring Boot
websocket
websocket
Spring
Spring
Kotlin
Kotlin
Spring Boot
Spring Boot
websocket
websocket

Đánh giá từ những học viên đầu tiên

Đánh giá từ những học viên đầu tiên

4.9

5.0

Jlos Ho

100% đã tham gia

Khóa học này thực sự là Goat. Tôi đã học nhiều khóa học khác nhưng có vẻ như khóa học thực tế và giống như có người bên cạnh hướng dẫn như thế này là duy nhất trên nền tảng Inflearn này. Đã giúp ích rất nhiều. Cảm ơn bạn.

5.0

Hoos

96% đã tham gia

Có cả kiến trúc như thế này nữa... Từ Kotlin đến kiến trúc về nền tảng và thông qua code thực tế, có vẻ như đây là một khóa học tốt giúp nhiều người có thể hiểu về nền tảng chat.

5.0

미래 1인 개발자

32% đã tham gia

Tôi là lập trình viên server tại Toss, người đã hỗ trợ kiến trúc máy chủ và tiến hành thiết kế xử lý tin nhắn khi quay bài giảng này. Tôi cũng đang dần tích lũy kinh nghiệm. Cho đến nay, tôi chỉ thực hiện các dự án/công việc với chủ đề giao tiếp thông qua giao thức phi trạng thái, nên việc quay một bài giảng với chủ đề mới như thế này thực sự là một trải nghiệm khá vui vẻ và thú vị. Hãy cứ tự do để lại câu hỏi nhé. Tôi cũng sẽ dành thời gian để xem xét kỹ lưỡng và muốn có thời gian để chia sẻ quan điểm của mình về các câu hỏi. Mong mọi người quan tâm nhiều đến bài giảng.

Bạn sẽ nhận được điều này sau khi học.

  • Hệ thống nhắn tin phân tán sử dụng Redis Pub/Sub để đồng bộ hóa tin nhắn thời gian thực giữa nhiều thực thể máy chủ (server instances).

  • Cách cấu hình cụm 3 instance bằng Docker Compose và phân phối lưu lượng truy cập bằng bộ cân bằng tải Nginx

  • Thực hiện giao tiếp thời gian thực hai chiều bằng cách sử dụng Spring WebSocket

  • Cách thiết kế kiến trúc server có thể mở rộng bằng cách áp dụng Thiết kế hướng tên miền (Domain-driven Design) với cấu trúc multi-module.

  • Kỹ thuật đảm bảo thứ tự tin nhắn trong môi trường phân tán bằng cách quản lý trình tự tin nhắn sử dụng Redis

  • Phương pháp vận hành dịch vụ thông qua triển khai dựa trên container Docker, kiểm tra sức khỏe (health check) và giám sát nhật ký (log monitoring)

  • Phương pháp phát triển backend hiện đại tận dụng các tính năng mới nhất của Spring Boot 3.x + Kotlin

  • Các kỹ thuật lập trình phòng thủ để vận hành dịch vụ ổn định như ngăn chặn xử lý trùng lặp tin nhắn, dọn dẹp session và giải phóng tài nguyên.

Thông qua khóa học này, các bạn sẽ...

Bạn sẽ được trực tiếp thiết kế và xây dựng kiến trúc máy chủ có khả năng mở rộng có thể đáp ứng hàng chục nghìn người dùng trong môi trường dịch vụ thực tế.


🏗. Không chỉ dừng lại ở việc triển khai các tính năng, bạn sẽ được lĩnh hội các nguyên lý cốt lõi của hệ thống phân tán để có thể hoạt động ổn định ngay cả khi có lưu lượng truy cập lớn.

Trước tiên, bạn sẽ học cách phân tán lưu lượng bằng bộ cân bằng tải Nginx để nhiều máy chủ hoạt động như một hệ thống duy nhất 🌐, và cách đồng bộ hóa tin nhắn giữa các máy chủ trong thời gian thực bằng Redis Pub/Sub. Trong quá trình này, bạn sẽ tự nhiên nắm vững bí quyết giải quyết vấn đề C10K (10.000 kết nối đồng thời).


Ngoài ra, bạn sẽ được trải nghiệm việc tinh chỉnh Database Connection Pool, áp dụng xử lý JPA Batch và phân trang dựa trên Cursor để cải thiện tốc độ phản hồi đến từng mili giây.

Cuối cùng, bạn sẽ học các kỹ thuật vận hành ổn định để ngăn ngừa sự cố dịch vụ bằng cách duy trì môi trường nhất quán từ phát triển đến triển khai thông qua Docker container🐳, đồng thời xây dựng hệ thống Health Check và giám sát🩺. Tất cả quá trình này sẽ được thực hiện bằng mã nguồn tinh tế và hiệu quả, sử dụng các công nghệ mới nhất như Kotlin, Spring Boot 3.x và websocket .

📦Sau khi nghe bài giảng, bạn có thể tạo ra những sản phẩm như thế này

Một ứng dụng trò chuyện phân tán hoàn chỉnh 📦

Bạn sẽ nhận được một gói ứng dụng hoàn chỉnh, nơi có thể thực thi toàn bộ hệ thống (máy chủ, cơ sở dữ liệu, bộ nhớ đệm, v.v.) cùng một lúc chỉ bằng một câu lệnh. Đây không chỉ đơn thuần là một tập hợp các đoạn mã, mà là một dịch vụ có thể triển khai ngay lập tức.

Sơ đồ thiết kế kiến trúc hệ thống cấp độ production 🗺

Bạn sẽ trực tiếp xây dựng và thấu hiểu sơ đồ thiết kế kiến trúc hệ thống bao quát toàn bộ luồng dữ liệu từ yêu cầu của người dùng đến việc lưu trữ dữ liệu. Sơ đồ thiết kế này sẽ trở thành một tài sản danh mục đầu tư (portfolio) tuyệt vời chứng minh chiều sâu kỹ thuật của bạn.

Tính năng trò chuyện hai chiều thời gian thực 💬

Bạn sẽ sở hữu một thành phẩm với các tính năng chat cốt lõi được hiện thực hóa một cách hoàn hảo, cho phép người dùng đăng nhập, tạo phòng chat và gửi nhận nhiều loại tin nhắn khác nhau trong thời gian thực.

Cụm máy chủ có khả năng mở rộng hàng ngang

Bạn sẽ xây dựng một cụm máy chủ (server cluster) nơi n máy chủ Spring Boot hoạt động dưới bộ cân bằng tải Nginx. Thông qua đó, bạn sẽ học được cách mở rộng hệ thống một cách đơn giản chỉ bằng việc thêm các thực thể máy chủ khi lưu lượng truy cập tăng lên.

Hệ thống nhắn tin có độ khả dụng cao 📡

Xây dựng một hệ thống nhắn tin ổn định, nơi mọi tin nhắn đều được truyền đi mà không bị thất thoát thông qua Redis Pub/Sub, ngay cả khi một máy chủ gặp sự cố hoặc người dùng kết nối với các máy chủ khác nhau.

Hệ thống quản lý dữ liệu được tối ưu hóa

Lưu trữ vĩnh viễn dữ liệu trò chuyện trong PostgreSQL, đồng thời lưu trữ thông tin phiên hoặc dữ liệu bộ nhớ đệm trong Redis để hoàn thiện hệ thống dữ liệu hỗn hợp đáp ứng cả tính ổn định của dữ liệu và tốc độ phản hồi nhanh chóng.

📚Nội dung chính của bài giảng!

Nhắn tin phân tán Redis Pub/Sub

Triển khai mô hình Publish-Subscribe của Redis để đồng bộ hóa tin nhắn thời gian thực giữa nhiều phiên bản máy chủ. Xây dựng hệ thống nhắn tin phân tán cấp độ production bao gồm ngăn chặn tin nhắn trùng lặp, đảm bảo thứ tự tin nhắn và xử lý cách ly theo từng máy chủ để tạo nền tảng giao tiếp thời gian thực có khả năng mở rộng.

Giao tiếp thời gian thực dựa trên WebSocket

Sử dụng Spring WebSocket để triển khai giao tiếp hai chiều thời gian thực hiệu quả hơn nhiều so với HTTP. Cung cấp tính năng trò chuyện thời gian thực ổn định thông qua quản lý phiên, theo dõi trạng thái kết nối, xử lý lỗi và áp dụng các kỹ thuật tối ưu hóa để giải quyết vấn đề.

Kiến trúc DDD đa mô-đun

Tách biệt các lớp API, Domain, Persistence và WebSocket thành các mô-đun độc lập theo nguyên tắc Thiết kế hướng tên miền (Domain-driven Design). Bằng cách phân chia rõ ràng trách nhiệm của từng mô-đun và kiểm soát hướng phụ thuộc, chúng tôi xây dựng một kiến trúc máy chủ có khả năng mở rộng, tối đa hóa khả năng bảo trì và tính dễ kiểm thử.

Bộ cân bằng tải Nginx + Proxy WebSocket

Cấu hình bộ cân bằng tải Nginx để phân phối lưu lượng truy cập đồng đều đến n thực thể Spring Boot. Không chỉ các yêu cầu HTTP mà cả các kết nối WebSocket cũng được proxy một cách ổn định, đồng thời thiết lập môi trường dịch vụ có tính khả dụng cao với cấu hình reverse proxy cấp độ production.

📚Xem trước kiến trúc tính năng dự án

Redis Pub/Sub

Quy trình xử lý tin nhắn

📚Xem trước bài giảng!

📚 Viết Class quản lý phiên (session) WebSocket



📚 Triển khai máy chủ bằng script tự động



📚 Docker-Compose để triển khai môi trường Đang diễn ra



📚 Thiết lập chỉ số hiệu suất Nginx Trong



Tại sao nên học Kotlin..?

Được cho là có khả năng tương thích 100% với Spring, ngôn ngữ Kotlin do JetBrains tạo ra được tối ưu hóa cho lập trình đồng thời, điều mà Spring vốn chưa thực sự phù hợp.

📚Cú pháp ngắn gọn và trực quan


Vì Kotlin cung cấp cú pháp ngắn gọn và trực quan, các nhà phát triển có thể thực hiện được nhiều công việc hơn với ít mã nguồn hơn. Điều này mang lại hiệu quả trong việc cải thiện khả năng đọc và giúp việc bảo trì trở nên dễ dàng hơn.

📚 Năng suất và độ an toàn cao


Kotlin hỗ trợ an toàn null (null safety) theo mặc định, giúp giảm thiểu lỗi ngoại lệ con trỏ null (NullPointerException). Ngoài ra, nó còn hỗ trợ lập trình hướng chức năng, cho phép viết mã theo cách chức năng và khai báo hơn. Những tính năng này giúp nâng cao năng suất phát triển và giảm khả năng xảy ra lỗi.

📚 Khả năng tương thích cao


Kotlin tương thích 100% với Java, vì vậy có thể dễ dàng tích hợp vào các dự án Java hiện có. Điều này có nghĩa là không có rào cản lớn nào đối với các nhà phát triển Java khi học Kotlin, và họ có thể sử dụng các tính năng mới của Kotlin trong khi vẫn duy trì mã nguồn cũ.

websocket chẳng phải chỉ cần triển khai bằng HTTP là được sao? 🤔

📌 Có thể được. Đây không phải là phương pháp phát triển bất khả thi.

📌 Tuy nhiên, các nhà phát triển máy chủ thường phải cố gắng tiết kiệm tài nguyên máy chủ nhiều nhất có thể.

📌 Chính vì vậy, đối với các loại giao tiếp cần duy trì kết nối liên tục như máy chủ trò chuyện, việc sử dụng WebSocket là vô cùng phù hợp.

4 giá trị quan trọng được coi trọng

1. Bài giảng phải mang tính nhân văn.

Tôi tin rằng một bài giảng chỉ để cho dễ xem, ngay cả khi nó khiến người dạy trông thiếu chuyên nghiệp, thì không phải là một bài giảng thực thụ. Thời gian thực hiện gỡ lỗi (debugging) cũng là một phần của bài giảng.

2. Phải mang tính đặc thù trong thực tế

Phát triển phần mềm không phải là nói suông. Bạn có thể trực tiếp thực hiện và cùng nhau trải nghiệm quá trình vận hành thực tế.

  • Các bạn Planner ơi... cứu tôi với..

3. Phải mang lại lợi ích cho học viên.

Tôi đã cố gắng lồng ghép những khái niệm mà bản thân đã áp dụng và thấy hiệu quả trong thực tế. Thông qua khóa học này, bạn có thể trải nghiệm gián tiếp công việc thực tế, hoặc nếu đã là người đi làm, bạn có thể thể hiện hiệu suất vượt trội hơn trong môi trường làm việc của mình.

4. Bài giảng không phải là kết thúc.

Tôi hy vọng bạn sẽ đặt thật nhiều câu hỏi trong quá trình học. Khóa học này không chỉ được xây dựng từ kiến thức của riêng tôi, mà còn được tổng hợp từ ý kiến của nhiều nhà phát triển tại các tập đoàn lớn khác nhau.

  • Dưới đây là sơ lược lý lịch của những người đã giúp đỡ để hoàn thành bài giảng này.


private val supported_one = "Nhà phát triển Backend nền tảng Kakao Pay" private val supported_two = "Nhà phát triển API Server Toss Securities" private val supported_three = "Nhà phát triển Server tại một startup kỳ lân muốn giữ bí mật"

Lưu ý trước khi học

Môi trường thực hành

  • Được quay bằng MacOS M3.

  • Về cơ bản có sử dụng Docker.

  • java --version : 17.0.12 2024-07-16 LTS

  • Sử dụng các IDE thuộc dòng JetBrains.

  • Được xây dựng bằng cách sử dụng Gradle.

    • Mã nguồn bao gồm tất cả các tệp build để ngăn chặn xung đột phiên bản có thể xảy ra.

😍 Chủ đề nên xem cùng

Khuyến nghị cho
những người này

Khóa học này dành cho ai?

  • Lập trình viên Backend muốn phát triển từ cấp độ Junior lên Mid-level

  • Nhà phát triển muốn tích lũy kinh nghiệm phát triển dịch vụ thời gian thực (real-time)

  • Nhà phát triển quan tâm đến kiến trúc hệ thống phân tán

  • Nhà phát triển cấp trung (mid-level) muốn phát triển thành nhà phát triển cấp cao (senior)

  • Nhà phát triển có kiến thức cơ bản về Docker hoặc nhà phát triển muốn học hỏi.

  • Nhà phát triển dịch vụ Game/Chat/Mạng xã hội

  • Người tìm việc muốn củng cố hồ sơ năng lực (portfolio) của mình

  • Nhà phát triển đang lập kế hoạch nhảy việc thông qua việc mở rộng stack công nghệ.

Cần biết trước khi bắt đầu?

  • Sẽ rất tốt nếu bạn có kiến thức cơ bản về Spring.

  • Sẽ rất tốt nếu bạn có kiến thức cơ bản về giao tiếp Web Socket.

  • Bạn không cần phải có tất cả những kiến thức này. Vì chúng ta sẽ trực tiếp thực hiện dự án nên có thể cùng nhau học hỏi.

Xin chào
Đây là Hong

7,536

Học viên

461

Đánh giá

142

Trả lời

4.7

Xếp hạng

25

Các khóa học

Giới thiệu bản thân

Tôi bắt đầu học lập trình sau một thời gian dài lười biếng ở nhà vì cảm thấy hứng thú với nó, và hiện tại tôi đang đảm nhận vai trò phát triển server nền tảng tại Pangyo. Tôi tiếp tục hoạt động với tư cách là người chia sẻ kiến thức vì muốn cung cấp cho các bạn phương pháp học tập của bản thân, cùng với những vấn đề và giải pháp thực tế mà các bạn có thể gặp phải trong công việc.

 

Bài giảng không chỉ được tạo ra từ kiến thức của riêng tôi. Mỗi bài giảng đều có sự đồng hành của những người cộng sự.

 

Kinh nghiệm của người chia sẻ kiến thức

[Cựu] Nhà phát triển Blockchain liên quan đến IP Sandbox

[Cựu] Nhà phát triển Backend Metaverse

[Hiện tại] Nhà phát triển máy chủ dày dặn kinh nghiệm tại Pangyo

 

Lịch sử phỏng vấn

Các thắc mắc khác

  • unduck2022@gmail.com

Thêm

Chương trình giảng dạy

Tất cả

28 bài giảng ∙ (4giờ 55phút)

Tài liệu khóa học:

Tài liệu bài giảng
Ngày đăng: 
Cập nhật lần cuối: 

Đánh giá

Tất cả

29 đánh giá

4.9

29 đánh giá

  • kask814587762님의 프로필 이미지
    kask814587762

    Đánh giá 3

    Đánh giá trung bình 5.0

    5

    100% đã tham gia

    Tôi đã xem bài giảng rất hay. Không có gì bất tiện khi xem và nội dung cũng rất bổ ích. Mong rằng sẽ có những bài giảng tốt hơn nữa trong tương lai!

    • jhong
      Giảng viên

      Xin chào bạn 우당탕탕, cảm ơn bạn đã để lại đánh giá tốt!! Tôi sẽ cố gắng cung cấp những khóa học phù hợp với thực tế công việc, bổ ích và thú vị hơn nữa! Chúc bạn có một ngày tốt lành!

  • kju626095386님의 프로필 이미지
    kju626095386

    Đánh giá 8

    Đánh giá trung bình 5.0

    5

    100% đã tham gia

    Tôi đã xem bài giảng rất hay với nội dung tốt và thực tế. Cảm ơn bạn.

    • jhong
      Giảng viên

      Xin chào ks ju, cảm ơn bạn đã để lại đánh giá. Trong môi trường vận hành thực tế, có thể thêm vào nhiều tính năng đa dạng hơn và bạn có thể coi đây là cấu trúc dành cho dạng thức như vậy 😊😊 Chúng tôi sẽ cung cấp những bài giảng hữu ích hơn nữa trong tương lai. Chúc bạn có một ngày tốt lành :)

  • youngba8935643님의 프로필 이미지
    youngba8935643

    Đánh giá 7

    Đánh giá trung bình 5.0

    Đã chỉnh sửa

    5

    96% đã tham gia

    Tôi đã chuẩn bị việc làm và trong quá trình làm việc thực tế, tôi đã tham khảo rất nhiều bài giảng của giảng viên và học tập dựa trên đó, thực sự đây là một chủ đề chất lượng cao rất hữu ích. Quá trình cùng nhau viết code cũng rất bổ ích và có cảm giác như đang cùng ngồi bên cạnh coding, nhờ đó mà hiệu quả học tập càng tốt hơn!! Hy vọng sẽ xem thường xuyên hơn và có thêm nhiều bài giảng hay được tạo ra. Cảm ơn!

    • jhong
      Giảng viên

      Xin chào bạn Tenburger! Nghe nói bạn đang chuẩn bị tìm việc!! Mình hy vọng khóa học này sẽ giúp ích rất nhiều cho bạn. Nếu sau này bạn tìm được việc thành công thì hãy chia sẻ tin tức nhé 😊😊 Cảm ơn bạn!

  • eightee724277님의 프로필 이미지
    eightee724277

    Đánh giá 6

    Đánh giá trung bình 5.0

    5

    93% đã tham gia

    Tôi đã học rất tốt. Tôi nghĩ đây là một khóa học hay. Tôi dự định sẽ tham gia các khóa học khác nữa.

    • jhong
      Giảng viên

      Xin chào, tôi thích số 8!! Hy vọng sẽ gặp lại bạn ở các khóa học khác nữa 😊😊 Cảm ơn bạn đã đánh giá tốt!

  • tasdo4797187님의 프로필 이미지
    tasdo4797187

    Đánh giá 5

    Đánh giá trung bình 5.0

    5

    100% đã tham gia

    Là một lập trình viên backend.. thực sự đã giúp ích rất nhiều. Cảm ơn bạn.

    • jhong
      Giảng viên

      Xin chào tasd os, chúng ta cùng làm công việc giống nhau mà có thể giúp đỡ được nhiều như vậy nên tôi cảm thấy rất tự hào. Cảm ơn bạn!

Khóa học khác của Hong

Hãy khám phá các khóa học khác của giảng viên!

Khóa học tương tự

Khám phá các khóa học khác trong cùng lĩnh vực!

1.727.621 ₫