Hỏi đáp về Mini-Web-Server


Q: Mini-Web-Server là gì?

A: Mini-Web-Server (gọi tắt là Mini) là một web server mã nguồn mở viết trên C#, .NET 7, hỗ trợ HTTP/1.1, HTTPS, Multi-Host…

Q: Mini có hỗ trợ nội dung động không?

A: Có, vì không có nội dung động thì sẽ không cần dùng đến các method như POST, PUT… Tuy nhiên hiện tại tôi chưa quyết định cụ thể sẽ hỗ trợ như thế nào, ban đầu dự định hỗ trợ thông qua CGI (https://www.hostgator.com/help/article/what-is-cgi-bin), thông qua đó sẽ dễ dàng tích hợp các ngôn ngữ script như JS hay PHP, nhưng CGI đã quá cũ và tiềm ẩn rất nhiều rủi ro về bảo mật nên có thể tôi sẽ tự thiết kế một engine riêng. (Ở đây các bạn có thể thấy sức mạnh của abstraction, khi tôi có thể thiết kế web server trước khi implement phần cung cấp nội dung).

Q: Mini được viết ra để làm gì?

A: Mini được viết ra như một ứng dụng minh họa cho những khái niệm/công nghệ mà tôi đã/đang/định/sẽ nói đến. Do vậy một trong nhưng tiêu chí khi thiết kế và implement là code phải dễ đọc dễ hiểu nhất.

Tôi không thích lắm khi nói về OOP cứ phải lấy ví dụ về Animal với Dog với Cat, hoặc là mấy cái hình vuông với hình chữ nhật, nghe thì dễ hiểu nhưng người học chẳng biết dùng vào việc gì cả.

Các bạn sẽ được nhìn thấy các phần đã học được áp dụng trong thực tế thế nào. Có những khái niệm khá mơ hồ và khó hiểu (ai học OOP thì chắc cũng biết), nhưng vì máy tính là khoa học, không phải nghệ thuật, nên dù có khó thì cũng chỉ có một cách hiểu duy nhất.

Thông qua việc viết ra một ứng dụng hoàn chỉnh, chúng ta sẽ hiểu rõ các khái niệm này một cách chính xác, bằng cách so sánh các cách áp dụng khác nhau (vì hiểu theo những cách khác nhau) sẽ dẫn đến những kết quả nào.

Q: Tại sao không phải là ứng dụng khác mà lại là một Web server?

A: Một web server hoàn chỉnh dù nhỏ cũng phải chứa khá nhiều tính năng khác nhau, và phải sử dụng nhiều kỹ thuật, thiết kế, kiến trúc. Ngoài ra bạn sẽ phải đi sâu vào giao thức HTTP, nền tảng cho mọi thứ trên web, kể cả các web app hay API. Do vậy theo tôi nó là hoàn hảo để trình bày các kỹ thuật khác nhau khi viết chương trình.

Q: Mini có thể thay thế các web server phổ biến hiện tại không?

A: Về mặt chức năng: Có. Nó sẽ có khả năng phục vụ để tạo ra các website, API, (và

có thể cả websocket).

Về hiệu quả sử dụng: Không (hoặc chí ít là chưa). Bạn không nên mạo hiểm đưa mini vào sử dụng production 😅. Một dự án nho nhỏ làm trong lúc rảnh rỗi thì không thể so được với dự án được hàng trăm chuyên gia làm trong nhiều (chục) năm.

Tuy nhiên, sử dụng Mini làm backend server và một web server khác (nginx chẳng hạn) làm reverse proxy cũng có thể là một ý hay 🙂.

Q: Tại sao không sử dụng các web server mã nguồn mở để học?

A: Hầu hết các web server phổ biến nhất (trừ IIS) đều là mã nguồn mở. Bạn hoàn toàn có thể đọc code để xem họ đã làm như thế nào. Tuy nhiên bạn chỉ nên làm điều này khi muốn tham gia vào dự án, bởi sau nhiều năm phát triển chúng đã quá phức tạp để hiểu, đặc biệt với người chưa có kinh nghiệm.

Minix – hệ điều hành còn già hơn Linux (Minix chính là cảm hứng để Linus Torvalds viết lên Linux) vẫn còn được dùng để giảng dạy môn Hệ điều hành trong nhiều trường đại học (https://wiki.minix3.org/doku.php?id=courses) bởi sự đơn giản của nó (Linux hiện đã có hơn 30 triệu dòng code).

Q: Mini có hỗ trợ HTTP/2, HTTP/3 không?

A: Có (nhưng khi nào thì chưa biết 😅). HTTP/2 và HTTP/3 chủ yếu khác HTTP/1.1 ở phương thức truyền dữ liệu giúp tăng cường hiệu năng, cấu trúc các request và response và các tính năng bên dưới hầu như không có thay đổi. Do vậy việc implement hai phiên bản này không phải là một yêu cầu quan trọng với một máy chủ web “hiệu năng thấp” như Mini.

Q: Tính năng Multi-Host là gì?

A: Multi-Host cho phép bạn chạy nhiều website trên cùng server, tùy thuộc vào domain name.

Q: Làm sao tôi hiểu được Mini được thiết kế và viết như thế nào?

A: Tôi sẽ có bài viết/video hướng dẫn, hiện nay chưa làm là vì LƯỜI!

Q: Nếu một lúc nào đó ứng dụng được hoàn thành, vậy khi đó nó lại trở nên quá phức tạp để học?

A: Khi đã implement các tính năng ở một mức độ hoàn chỉnh cho phép, tôi sẽ tạo các tag để lưu lại source code ở thời điểm đó (https://github.com/daohainam/mini-web-server/tags). Các bài hướng dẫn sẽ dựa trên các tag này, tránh việc khi source code thay đổi thì nội dung bài viết trở nên không chính xác. Khi nói về vấn đề nào, tôi sẽ cố gắng sử dụng tag đầu tiên mà tính năng đó xuất hiện, giúp chúng ta dễ dàng theo dõi nhất.

Q: Viết ra Mini có khó không?

A: Khó. Đặc biệt là phần xử lý giao thức HTTP. Dù tôi đã làm với HTTP từ rất lâu (có thể từ trước khi một số độc giả ở đây ra đời 😉) nhưng tôi vẫn thấy khó, nguyên nhân là vì phải đọc và implement TOÀN BỘ giao thức, theo đúng các RFC của nó (https://datatracker.ietf.org/doc/html/rfc9112), không được bỏ sót kẽ hở nào (công nhận ông này cũng rảnh thật). Ngoài ra việc xử lý các dữ liệu đó trên nhiều stream khác nhau một cách không đồng bộ cũng gây ra khó khăn, bởi sẽ xảy ra vô số trường hợp cần xử lý.

Q: Để hiểu thì có cần biết kiến thức gì trước không?

A: Tất nhiên là có. Bạn sẽ cần biết về lập trình, tốt nhất là với C#, nhưng nếu chỉ biết một ngôn ngữ khác tương tự cũng không sao (Java, C++), nếu chỉ biết JS thì hơi khó nhưng nếu đã viết app NodeJS thì chắc cũng được.

Bạn sẽ cần biết về networking (TCP/IP, socket), OOP, multi-thread programming, các cấu trúc dữ liệu thông dụng… Những thứ này các bạn có thể đọc các bài viết trên trang https://www.daohainam.com hoặc hỏi chị Google. Khi đi vào phần code, sẽ có nhiều pattern (Mini được viết để minh họa cho các pattern này), sẽ dễ hiểu hơn nếu các bạn đã từng học về chúng.

Ngoại trừ phần ngôn ngữ lập trình, các phần còn lại sẽ có bài viết/video giải thích. Hiện nay vì sao chưa có chắc các bạn cũng biết rồi đấy! Vì LƯỜI! 😁

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s