Chào các bạn, việc tải dữ liệu lên các internet diễn ra hàng ngày, từ việc tải ảnh lên Facebook, tải video lên Youtube, Tiktok hay tải file lên Google Drive, … Với các file có dung lượng từ nhẹ tới rất lớn, tuy nhiên môi trường mạng thì chưa bao giờ là ổn định cả 😅, giật, lag hoặc rớt mạng giữa chừng 🤯? Các bạn có bao giờ thắc mắc làm thế nào để có thể triển khai một hệ thống có khả năng tiếp tục tải lên một tệp dữ liệu kể cả khi bị đứt mạng giữa chừng không?

Hôm nay, chúng ta sẽ cùng tìm hiểu về giao thức Tus, một giao thức giúp chúng ta giải quyết vấn đề trên. Tus là một giao thức tải lên dữ liệu dựa trên HTTP, cho phép tải lên dữ liệu một cách phân mảnh, tiếp tục và bảo mật. Tus giúp chúng ta tải lên dữ liệu một cách linh hoạt, không cần phải tải lại từ đầu nếu bị đứt mạng giữa chừng, giúp tiết kiệm băng thông và thời gian tải lên.

Đây là bài viết đầu tiên trong series Learn Something New, một series mà mình sẽ chia sẻ với các bạn những kiến thức mới mà mình học được qua kinh nghiệm làm việc hoặc đọc sách, bài viết, … Hy vọng rằng các bạn sẽ học được nhiều điều mới từ series này nhé. 🎊

1. Giao thức Tus là gì?

Tus Protocol

📌 Tus là giao thức mở dựa trên HTTP, giúp tải dữ liệu lên mà có thể tiếp tục nếu có vấn đề xảy ra như mất mạng, lỗi hệ thống, … giữa chừng.

Tus cho phép tải lên dữ liệu một cách phân mảnh, tiếp tục và bảo mật. Tus giúp chúng ta tải lên dữ liệu một cách linh hoạt, không cần phải tải lại từ đầu nếu bị đứt mạng giữa chừng, giúp tiết kiệm băng thông và thời gian tải lên.

Tus được tạo ra để đem lại một só ưu điểm sau:

  • Một giao thức tải lên dựa trên HTTP: HTTP là một giao thức phổ biến, Tus sử dụng HTTP để tải lên dữ liệu, giúp dễ dàng tích hợp vào các hệ thống hiện có.
  • Đa nền tảng: Tus có thể hoạt động trên nhiều nền tảng khác nhau như Web, Mobile, IoT, …
  • Ổn định cao: Tus đưa ra một số đặc tả về việc tải lên dữ liệu, giúp hệ thống tải lên dữ liệu một cách ổn định, không bị mất dữ liệu giữa chừng.
  • Hỗ trợ đa ngôn ngữ: Tus có thư viện hỗ trợ cho nhiều ngôn ngữ lập trình khác nhau như Go, Node.js, Java, … giúp dễ dàng tích hợp vào các hệ thống hiện có.

2. Cách hoạt động của Tus

Vì Tus dựa trên HTTP và chỉ dành cho mục đích tải dữ liệu lên nên cần cần phải có đặc tả cụ thể về việc tải lên dữ liệu. Bạn có thể tìm hiểu chi tiết về đặc tả Tus Protocol tại đây. Hiện tại, phiên bản ổn định của Tus là 1.0.0 theo SemVer, tuy nhiên các cải tiến về giao thức này vẫn đang được phát triển bởi Internet Engineering Task Force (IETF).

2.1. Sơ đồ hoạt động

Tus Protocol là một tập hợp các phương thức HTTP (OPTIONS, HEAD, POST, PATCH, DELETE, …) để tải lên dữ liệu. Luồng cơ bản của một hệ thống Tus client và Tus server như sau:

sequenceDiagram
	autonumber
	participant c as Client
	participant s as TusServer
	participant st as Storage

	c->>+s: OPTIONS (Gather information)
	s-->>-c: 204 No content (Supported methods, extensions, ...)

	c->>s: HEAD (Check if the file is already uploaded)

	alt File uploaded completely
		s-->>c: 200 OK (File size, metadata, ...)
	else File not uploaded or partially uploaded
		s-->>c: 404 Not found

		c->>+s: POST (Create a new upload)
		s->>+st: Upload new resource on storage (s3, gcs, ...)
		st-->>-s: Resource uploaded
		s-->>-c: 201 Created (Location, unique upload ID, ...)

		loop Upload chunks
			Note right of c: Read a chunk of data from file
			c->>+s: PATCH (Upload a chunk of data)
			s->>+st: Append data to the resource
			st-->>-s: Data appended
		end
		s-->>-c: 204 No content (Offset, ...). Upload completed.
	end

	alt Enable Termination extension
		c->>+s: DELETE (Optional, remove the upload)
		s->>+st: Remove the resource on storage
		st-->>-s: Resource removed
		s-->>-c: 204 No content (Upload removed)
	end

Trong sơ đồ trên, là tập hợp tương đối đầy đủ các phương thức mà một hệ thống Tus client và Tus server cần phải thực hiện để tải lên dữ liệu.

  • OPTIONS: Phương thức này được sử dụng để lấy thông tin từ server như các phương thức hỗ trợ, các extension, …
  • HEAD: Phương thức này được sử dụng để kiểm tra xem file đã được tải lên chưa, nếu:
    • File đã được tải lên hoàn tất -> kết quả trả về 200 OK -> kết thúc.
    • File chưa được tải lên hoặc đã được tải lên một phần, server sẽ trả về 404 Not found và tiếp tục tải lên dữ liệu như sau.
  • POST: Phương thức này được sử dụng để tạo một upload mới, trả về một unique upload ID để sử dụng cho việc tải lên dữ liệu. Đồng thời, server sẽ tạo một resource mới ở storage để lưu trữ dữ liệu tải lên. Chỉ có sẵn với Creation extension.
  • PATCH: Phương thức này được sử dụng để tải lên một phần dữ liệu, trả về offset của dữ liệu đã tải lên. Server cũng sẽ upload dữ liệu lên storage tương ứng. Việc tải lên dữ liệu sẽ được thực hiện nhiều lần cho đến khi dữ liệu được tải lên hoàn tất (offset = file size).
  • DELETE: Phương thức này được sử dụng để huỷ một upload, xóa dữ mọi liệu đã tải lên. Chỉ có sẵn với Termination extension.

Đây chỉ là mô tả cơ bản mà thôi, nếu các bạn muốn hiểu rõ hơn về cách triển khai một Tus server dựa trên các phương thức trên, các bạn có thể đọc qua tài liệu đặc tả chính thức nhé.

2.2. Làm sao để Tus tiếp tục tải lên dữ liệu nếu có trục trặc?

Tus giúp chúng ta tiếp tục tải lên dữ liệu một cách linh hoạt, không cần phải tải lại từ đầu nếu bị trục trặc giữa chừng. Điều này dựa trên việc Tus lưu trữ offset của mỗi lần send chunk lên server, nếu có trục trặc xảy ra, Tus client có thể tiếp tục tải lên dữ liệu từ offset đó mà không cần phải tải lại từ đầu. Để triển khai điều này, cả client và server cần phải lưu trữ thông tin về offset của dữ liệu đã tải lên. Nơi lưu trữ thông tin này phụ thuộc vào từng loại platform, như đối với web, thông tin này có thể lưu trữ trong localStorage, sessionStorage, cookie, … Đối với mobile, thông tin này có thể lưu trữ trong SharedPreferences, CoreData, …

Các bạn hãy lưu ý rằng cả client và server đều phải triển khai đặc tả của Tus Protocol để đáp ứng các phương thức cần thiết. Nếu không, việc tải lên dữ liệu sẽ không được thực hiện đúng cách.

2.3. Các extension của Tus

Việc lưu dữ liệu tại client phụ thuộc vào từng loại platform (web, android, ios, …). Ngoài ra Tus cũng hỗ trợ một số extension như:

  • Creation: Cho phép client tạo một upload mới mà không cần phải tải lên dữ liệu.
  • Expiration: Cho phép client xác định thời hạn của tiến trình tải lên. Nếu quá thời hạn, client sẽ không thể tiếp tục tải lên dữ liệu và server sẽ xóa dữ liệu đã tải lên.
  • Checksum: Cho phép client kiểm tra (checksum) dữ liệu đã tải lên. Điều này giúp chúng ta đảm bảo dữ liệu tải lên không bị thay đổi và kiểm tra metadata của dữ liệu.
  • Concatenation: Cho phép client chia một file lớn thành nhiều phần và tải lên một cách song song, không liền kề. Điều này giúp tối ưu hóa việc tải lên dữ liệu.
  • Termination: Cho phép client kết thúc việc tải lên dữ liệu và xóa dữ liệu đã tải lên. Điều này giúp chúng ta giải phóng bộ nhớ và lưu trữ dữ liệu.

Ngoài ra, Tus còn đặc tả nhiều extension khác, các bạn có thể tìm hiểu thêm tại đây.

3. Khi nào nên sử dụng Tus?

Nếu bạn đang xây dựng một hệ thống tải lên dữ liệu lớn, cần phải tải lên dữ liệu một cách linh hoạt, không cần phải tải lại từ đầu nếu bị trục trặc giữa chừng, Tus là một lựa chọn tốt cho bạn. Tus giúp chúng ta tải lên dữ liệu một cách ổn định, không bị mất dữ liệu giữa chừng, tiết kiệm băng thông và thời gian tải lên.

Vậy làm thế nào để tích hợp Tus vào hệ thống của mình nhỉ?

Tus là một giao thức và có đặc tả của riêng nó như mình có đề cập ở trên, vì vậy cách đơn giản nhất để tích hợp Tus vào hệ thống của bạn là sử dụng các thư viện hỗ trợ Tus cho ngôn ngữ lập trình mà bạn đang sử dụng. Hiện tại, Tus hỗ trợ nhiều ngôn ngữ lập trình như Go, Node.js, Java, … Các bạn có thể tìm hiểu thêm về các thư viện hỗ trợ Tus tại đây.

Trên trang chính thức cũng có hướng dẫn đó, nếu hứng thú các bạn có thể tham khảo thêm tại đây.

4. Lời kết

Bao lâu nay, việc tải lên dữ liệu luôn là một thách thức với bất kỳ hệ thống nào, đặc biệt là với dữ liệu lớn và yêu cầu chịu lỗi cao như hiện nay. Tus giúp chúng ta giải quyết vấn đề trên một cách hiệu quả, giúp chúng ta tải lên dữ liệu một cách linh hoạt, không cần phải tải lại từ đầu nếu bị trục trặc giữa chừng, tiết kiệm băng thông và thời gian tải lên.

Hy vọng rằng qua bài viết này, các bạn đã hiểu được về Tus Protocol, cách hoạt động của Tus, khi nào nên sử dụng Tus và cách tích hợp Tus vào hệ thống của mình.

Nếu có bất kỳ thắc mắc nào, đừng ngần ngại để lại comment bên dưới nha, chúng ta sẽ trao đổi thêm về vấn đề thú vị này. 😄