Chia sẻ kiến thức lập trình

Lựa chọn giao thức

Cơn đau đầu dễ chịu

Nếu như những năm 2012 chỉ phổ biến nhất là giao thức HTTP với xml để làm API, mà được biết nhiều nhất là SOAP, thì ngay nay, với sự sáng tạo không ngừng nghỉ của các kỹ sư lập trình, đã cho ra đời hàng loạt các ngôn ngữ và giao thức nhẹ nhàng hơn SOAP rất nhiều lần. Điều đó cũng tạo ra những cơn đau đầu nhất định khi chúng ta phải đưa ra lựa chọn, nhưng đó là một cơn đau đầu vô cùng dễ chịu.

Nhiều giao thức để làm gì?

Đây là câu hỏi mình nhận được rất nhất nhiều. Có một thứ mà chúng ta không được dạy trên trường học, và khi đi làm phải hiếm hoi lắm chúng ta mới cần quan tâm, đó hiệu năng của các ứng dụng client server bị tác động chủ yếu bởi tốc độ gửi nhận dữ liệu qua mạng. Nghĩa là càng ít dữ liệu được gửi nhận qua mạng thì hiệu năng sẽ càng được cải thiện. Chính vì vậy các giao thức mới ra đời nhằm mục tiêu duy nhất đó là giảm được nhiều nhất dung lượng gói tin từ đó giảm thiểu được số lượng dữ liệu phải gửi nhận qua mạng.
Các giao thức mà chúng ta vẫn đang sử dụng ngày nay đa phần dựa trên TCP, nên nếu bạn vẫn còn thắc mắc tại sao gói tin lớn lại làm giảm hiệu năng, hãy đọc qua bài viết về TCP nhé.

Một số giao thức

Ở thời điểm hiện tại của bài viết này, có một số giao thức được sử dụng rộng rãi như sau (ưu ý rằng một số bạn sẽ gọi Json, Message Pack, Protobuf là data format, nhưng với cá nhân mình, mình tạm gọi nó là giao thức (protocol) cho đồng nhất nhé):

  1. Json: sự ra đời của json là một cuộc cách mạng, nó đã thay thế và gần như xoá sổ xml khỏi việc giao tiếp giữa client và server. Vì sao vậy? Vì xml yêu cầu phải có thẻ đóng và mở, trong khi json chỉ có thẻ mở mà thôi, điều này giúp nó giảm được rất nhiều dung lượng cho gói tin. Json đã nâng đôi cánh cho giao thức Restful, giúp nó trở thành giao thức được sử dụng rộng rãi nhất trên toàn thế giới.
  2. Message Pack: message pack bản chất vẫn là json nhưng nhẹ hơn, bằng cách khéo léo sử dụng các byte đại diện cho các kiểu dữ liệu và loại bỏ byte 0 không cần thiết đi, từ đó mà gói tin sẽ nhỏ hơn json rất nhiều
  3. Protobuf: protobuf được sáng chế bởi google, chính vì vậy mà nó được sử dụng rộng rãi, ý tưởng của nó cũng giống như message pack, tuy nhiên nó không dùng byte để định kiểu mà sử dụng 1 bit đầu tiên để xem có dữ liệu ở byte tiếp theo không, và sử dụng file.proto để định nghĩa cấu trúc gói tin. Framework gRPC của google cũng gắn liền với protobuf này.
  4. GraphQL: GraphQL nên được gọi là ngôn ngữ truy vấn thì hơn, nhưng gọi là giao thức truy vấn cũng được, nó vẫn sử dụng cấu trúc giống json như Restful, chỉ khác là nó sẽ quy định các trường dữ liệu mà bạn chỉ định mà thôi

Tại sao JSON phổ biến nhất?

  1. Mặc dù gói tin rất nhỏ, nhưng nhược điểm của Message Pack và Protobuf là rất khó để đọc nếu như không có công cụ hỗ trợ, đặc biệt là trên môi trường trình duyệt (browser), chúng ta phải phụ thuộc vào nhà cung cấp.
  2. Message Pack và Protobuf vẫn còn rất khó hiểu với đại đa số lập trình viên, và khi chúng ta không hiểu thì chúng ta thường có xu thế né tránh chúng.

Sử dụng giao thức nào

Hiện tại 4 nền tảng chính mà chúng ta chúng ta cần quan tâm đó là:

  • Web (1): đối với web và ngôn ngữ javascript thì JSON và GraphQL vẫn là dễ chịu nhất. Bởi vì trên web vẫn chủ yếu hỗ trợ HTTP và websocket, thêm vào nữa khi hiển thị trên Console của browser chúng sẽ tường minh và có thể đọc được. Mà hiện nay các trình duyệt cũng chưa hỗ trợ trực tiếp việc chuyển đổi các loại dữ liệu kiểu như MessagePack và Protobuf sang đối tượng javascript, nếu muốn chúng ta sẽ cần dùng thư viện ngoài.
  • Moble (2), Desktop (3) và các thiết bị IoT(4): thì tốt nhất là chúng ta nên sử dụng các giao thức càng nhẹ càng tốt, vì các nền tảng này cho phép chúng ta sử dụng mọi thứ từ HTTP, websocket cho đến TCP và UDP. Chúng ta cũng có thể tự viết ứng dụng và làm mọi thứ chúng ta muốn mà không phải phụ thuộc vào nhà cung cấp, nên MessagePack và Protbuf là một lựa chọn phù hợp.

Hiện tại EzyFox Server cũng đang sử dụng JSON cho websocket và message pack cho TCP và UDP, điều này giúp nó nhẹ nhàng, mềm dẻo và phù hợp với mọi nền tảng.

Vậy còn việc giao tiếp giữa các server thì sao?
  • Đối với các server sử dụng nội bộ thì đương nhiên là chúng ta càng giảm dung lượng được gói tin thì càng tốt nên MessagePack và Protbuf là một lựa chọn rất phù hợp và không có gì phải bàn cãi.
  • Đối với các server cung cấp API cho đối tác bên ngoài gọi thì chúng ta nên cung cấp ở dạng Restful (JSON) để cho họ dễ sử dụng và thích hợp trên mọi nền tảng.

Tổng kết

Rốt cuộc thì các giao thức ra đời cũng chỉ có một mục tiêu duy nhất là giảm được dung lượng gói tin khi gửi nhận qua mạng. Và ở thời điểm hiện tại thì JSON vẫn là lựa chọn phổ biến nhất, vì nó nhẹ hơn XML nhưng vẫn giữ được sự tường minh và được hỗ trợ rộng rãi bởi mọi nền tảng.
Đối với các dự án lớn, việc kết hợp giữa các giao thức là rất cần thiết để tạo ra được sự linh hoạt, từ đó giúp cho hệ thống đạt hiệu suất cao nhất, và nâng cao được trải nghiệm của người dùng.

Share: