Thư Viện Socket Của Skynet Đã Được Cải Thiện
Hôm nay mình vừa thực hiện một số cải tiến đáng kể cho thư viện socket của skynet nhằm tối ưu hóa khả năng kết nối và xử lý dữ liệu. Mục tiêu ban đầu là để thử truy cập một API HTTP bên ngoài từ hệ thống skynet, qua đó phát hiện ra một số hạn chế trong phiên bản socket mới viết gần đây.
Trong quá trình kiểm thử, mình gặp phải vấn đề khi URL dùng để test bị chặn (firewall). Sự cố này đã phơi bày điểm yếu của hàm connect hiện tại đang hoạt động ở chế độ blocking. Khi xảy ra tình trạng kết nối đến server không ổn định, toàn bộ tiến trình có thể bị treo trong thời gian dài. Để khắc phục, mình đã dành thời gian chuyển đổi cơ chế connect sang dạng non-blocking. Đây là một kỹ thuật tương đối phức tạp do bản chất bất đồng bộ của nó, đặc biệt với những ai chưa từng xử lý trường hợp này trước đây. Mình đã tham khảo một số tài liệu kỹ thuật tiêu chuẩn để triển khai, nhưng vẫn rất mong nhận được sự phản hồi từ các bạn có kinh nghiệm sâu hơn về skynet để review patch mới này trước khi chính thức áp dụng.
Về mặt chức năng xử lý HTTP, thư viện socket giờ đây được bổ sung thêm hàm readall mới. Hàm này cho phép đọc toàn bộ dữ liệu từ socket cho đến khi đối phương close kết nối. Đây là một cải tiến quan trọng giúp đơn giản hóa quy trình nhận dữ liệu hoàn chỉnh từ server.
Hai hàm hiện có là socket.read và socket.readline cũng đã được nâng cấp. Bây giờ, khi kết nối bị đóng đột ngột, ngoài việc trả về giá trị nil như trước, các hàm này còn trả về dữ liệu đã nhận được trong lần gọi cuối cùng. Tính năng này đặc biệt hữu ích với readline khi xử lý các trường hợp dòng dữ liệu cuối cùng không có ký tự phân cách tiêu chuẩn.
Một cải tiến nhỏ nhưng mang lại trải nghiệm tốt hơn là cơ chế thông báo lỗi trong quá trình khởi tạo dịch vụ Lua. Mình đã tích hợp thêm chức năng gửi thông tin lỗi chi tiết về service launcher, qua đó giúp dễ dàng hơn trong việc debug các sự cố phát sinh khi khởi động dịch vụ.
Nhân tiện, mình rất ấn tượng với cách Hive xử lý quy trình khởi động dịch vụ. Giải pháp của họ tách biệt hoàn toàn giao thức khởi động thành một service riêng biệt, truyền tham số khởi động qua cơ chế message. Cách tiếp cận này tỏ ra vượt trội so với phương pháp hiện tại của skynet sử dụng chuỗi ký tự dài để truyền thông tin, vốn dễ dẫn đến lỗi.
Tuy nhiên, do hệ thống của chúng ta đã tích lũy một lượng lớn code dựa trên kiến trúc hiện tại, việc thay đổi toàn bộ sang mô hình mới gặp phải nhiều trở ngại về tính tương thích ngược. Dù vậy, đây vẫn là một hướng phát triển đáng cân nhắc trong tương lai.