Tản mạn về Backend Engineering…

Linh Ha
4 min readNov 9, 2023

--

Ảnh: Internet

Các hệ thống phần mềm hiện đại hiếm khi hoạt động độc lập, mà chúng được kết nối với nhau thông qua mạng máy tính, giao tiếp với nhau bằng cách truyền các thông điệp (messages). Do đó, một hệ thống phần mềm hiện đại sẽ bao gồm một tập các ứng dụng phần mềm phân tán đang chạy trong các networks khác nhau, giao tiếp với nhau bằng cách truyền các messages thông qua các giao thức truyền thông (communication protocols). Ví dụ, một hệ thống bán lẻ trực tuyến sẽ bao gồm nhiều ứng dụng phân tán như: ứng dụng quản lý đơn hàng, ứng dụng catalog, databases,… Để triển khai các chức năng nghiệp vụ của hệ thống bán lẻ trực tuyến nói trên thì các ứng dụng này cần giao tiếp với nhau.

Với sự ra đời của các phong cách kiến trúc hiện đại như microservices và cloud-native, các hệ thống phần mềm thông thường được xây dựng đáp ứng được nhiều nghiệp vụ khác nhau sẽ được phân tách thành các thực thể phần mềm nhỏ hơn, được biết đến như là các micro-services. Do đó, các hệ thống phần mềm microservices-based yêu cầu các microservices cần được kết nối qua mạng sử dụng các kỹ thuật truyền thông giữa các tiến trình (hoặc giữa các service, giữa các ứng dụng). Vẫn ví dụ với hệ thống bán lẻ trực tuyến, nếu chúng được triển khai theo kiến trúc microservices, chúng ta có thể thấy nhiều microservices cần được kết nối với nhau như quản lý đơn hàng, tìm kiếm, thanh toán, giao hàng, v.v. Các hệ thống phần mềm microservices-based sẽ yêu cầu nhiều kết nối qua mạng hơn các hệ thống phần mềm thông thường. Tuy nhiên, bất kể là phong cách kiến trúc nào được sử dụng, các kỹ thuật truyền thông là một trong những khía cạnh quan trọng nhất của các hệ thống phần mềm phân tán hiện đại.

Giao tiếp giữa các tiến trình thường được triển khai sử dụng cơ chế truyền các messages với một phong cách request-response đồng bộ (synchronous), hoặc phong cách event-driven bất đồng bộ (asynchronous). Trong phong cách giao tiếp đồng bộ, client process gửi một request message tới một server process qua network và chờ đợi cho một response message. Trong giao tiếp bất đồng bộ, các thông điệp thường được truyền qua một hạ tầng trung gian, được biến đến như là event-broker. Tùy thuộc vào business use case, chúng ta sẽ chọn communication pattern phù hợp. Khi xây dựng các microservices giao tiếp với nhau theo phong cách request-response đồng bộ, cách tiếp cận thông thường và phổ biến nhất hiện nay là sử dụng các RESTful services, chúng ta mô hình ứng dụng hoặc dịch vụ như một tập các resources có thể được truy cập qua mạng, sử dụng HTTP protocol. Tuy nhiên, với hầu hết use cases, các RESTful services khá cồng kềnh, kém hiệu quả và dễ xảy ra lỗi khi xây dựng cơ chế truyền thông giữa các tiến trình, các ứng dụng và dịch vụ. Do đó, nhu cầu cần phải có công nghệ khác thay thế, cho phép giao tiếp giữa các tiến trình có khả năng mở rộng, được kết nối lỏng lẻo, và hiệu quả cao so với RESTful services. Đây là lúc gRPC xuất hiện, một phong cách truyền thông hiện đại để xây dựng các hệ thống phân tán, microservices, cho phép các tiến trình giao tiếp với nhau hiệu quả. gRPC chủ yếu sử dụng phong cách giao tiếp synchronous request-response nhưng có thể hoạt động ở stream mode hoặc asynchronous hoàn toàn sau khi giao tiếp ban đầu được thiết lập.

Backend engineering là các công việc liên quan đến Backend. Chúng ta thường nghe nói về Backend trong xây dựng các Web-based application, phân biệt nó với Frontend là các giao diện Web, như vậy chưa đủ. Không có một định nghĩa cụ thể về Backend là gì, Backend engineering là làm gì nhưng có thể nói một cách dễ hiểu thế này: Backend engineering là các kỹ thuật phía sau end-user, ở đó chúng ta sẽ xây dựng các ứng dụng phần mềm phân tán giao tiếp với nhau, hoặc các microservices, các cơ sở dữ liệu,… Frontend có thể coi là các ứng dụng Client. Database là backend của microservice A, trong khi đó microservice A có thể là Backend của microservice B, như vậy microservice này có thể là Backend của microservice khác và cũng có thể là Client của microservice khác nữa. Để làm Backend engineering hiệu quả, hiểu các kỹ thuật truyền thông là một trong các yêu cầu quan trọng, chúng ta thường không đánh giá cao điều này khi các high-level libraries đã che giấu hầu hết những xử lý phức tạp phía sau, điều này là bình thường cho đến khi vấn đề xảy ra, như performance issues, connection issues. Để giải quyết các issues đó, các câu hỏi sau cần được trả lời: Client và Backend giao tiếp với nhau qua communication protocols nào? Connection giữa chúng được thiết lập qua những bước nào? Sau khi thiết lập connection, Backend sẽ đọc request đó và xử lý nó bằng những cách thức nào?

P/s: Bài viết tham khảo một phần từ cuốn sách “gRPS Up & Running” của tác giả Kasun Indrasiri

--

--