Hive Đã Thêm Thư Viện Socket
Dự án Hive đã chính thức được tích hợp thư viện socket không đồng bộ. Tính năng này cho phép Hive có thể triển khai các chức năng liên quan đến kết nối TCP như module gate trong Skynet chỉ với ngôn ngữ Lua.
Điểm đáng chú ý nhất trong quá trình phát triển là thiết kế API lắng nghe kết nối (listen). Mô hình truyền thống gồm các bước bind → listen → accept không thực sự phù hợp với kiến trúc actor. Một giải pháp từng được áp dụng trong Skynet là mô hình gate, nơi mỗi kết nối mới được chuyển hướng đến một cell (đơn vị xử lý độc lập) mới. Tuy nhiên, để tăng tính linh hoạt, tôi đã quyết định giao quyền kiểm soát chuyển tiếp kết nối cho hàm callback - đây chính là điểm mạnh của Lua trong việc xử lý luồng thực thi.
Người dùng giờ đây có thể lựa chọn giữa hai phương án xử lý kết nối: (1) Khởi tạo cell mới và chuyển tiếp socket sang đó xử lý, hoặc (2) Tạo coroutine mới và chuyển tiếp dữ liệu về chính coroutine đó. Toàn bộ thư viện socket được xây dựng theo cơ chế không đồng bộ - các coroutine sẽ tự động tạm dừng (suspend) khi không có dữ liệu I/O và tiếp tục khi có sự kiện mạng xảy ra.
Dự án này hiện tại vẫn thuộc dạng nghiên cứu thử nghiệm. Skynet với lượng lớn mã nguồn tích lũy trong các dự án thực tế khó có thể chuyển đổi hoàn toàn sang kiến trúc mới. Dù hiệu năng của phiên bản Lua thay vì C chưa rõ ràng, nhưng qua trải nghiệm phát triển, tôi nhận thấy: C thiếu hỗ trợ tự nhiên cho coroutine khiến việc xử lý các tác vụ không đồng bộ trở nên phức tạp, từ đó dẫn đến mã nguồn cồng kềnh. Ngược lại, Lua cho phép tạo ra các module dịch vụ gọn nhẹ nhưng vẫn đầy đủ tính năng.
Thư viện socket mới hỗ trợ đồng thời ba cơ chế nền tảng: epoll (Linux), kqueue (BSD/macOS), và select (Windows). Trong đó, select là phương án khó khăn nhất để triển khai với hiệu năng hạn chế. Với người dùng Windows, tôi khuyên chỉ nên dùng để chạy thử nghiệm - môi trường sản phẩm nên ưu tiên các nền tảng Unix-like.
Tại sao không tận dụng các thư viện socket có sẵn cho Lua? Vấn đề nằm ở kiến trúc đa máy ảo (multi-VM) của Hive. Các thư viện hiện tại đều yêu cầu sao chép dữ liệu mạng vào string hoặc userdata của Lua - điều này gây lãng phí bộ nhớ và giảm hiệu suất. Giải pháp tối ưu được áp dụng là cấp phát vùng nhớ ngoài máy ảo bằng malloc, lưu dữ liệu mạng như lightuserdata, và chỉ chuyển con trỏ tham chiếu qua các VM. Phương pháp này không chỉ hạn chế sao chép dữ liệu mà còn cho phép chuyển tiếp tin nhắn nhiều lần giữa các VM cho đến khi có đơn vị xử lý phù hợp.
Dự án Hive vẫn đang trong giai đoạn phát triển, nhưng đã mở ra nhiều hướng nghiên cứu thú vị:
- Tích hợp giao thức debug tương tự Skynet, cho phép kết nối console từ xa để truy vấn trạng thái hệ thống
- Phát triển cơ chế tương tác giữa các tiến trình Hive chạy trên nhiều máy chủ khác nhau
Theo đánh giá cá nhân, việc chuyển đổi các tính năng cao cấp từ Skynet sang Hive không gặp nhiều trở ngại về kỹ thuật.
P/S: Ban đầu tôi dự định đóng gói thành rockspec để đăng lên luarocks.org, nhưng do gặp phải một số khó khăn kỹ thuật và mã nguồn vẫn đang trong giai đoạn cập nhật thường xuyên nên tạm thời hoãn lại.