Cho Nhiều Trạng Thái Lua Chia Sẻ Cùng Một Tập Dữ Liệu Tĩnh
Chia sẻ dữ liệu tĩnh giữa nhiều Lua state Khi làm việc với nhiều Lua state trong cùng một tiến trình, nếu chúng cần truy cập chung một lượng lớn dữ liệu chỉ đọc, bạn hẳn sẽ không muốn mỗi state đều phải nạp và phân tích dữ liệu này riêng lẻ. Giải pháp tối ưu là xây dựng một cơ chế chia sẻ dữ liệu chỉ đọc hiệu quả.
Trước đây mình từng xây dựng một dịch vụ bộ nhớ chia sẻ đảm bảo an toàn đọc/ghi, nhưng với dữ liệu chỉ đọc thì thực ra không cần phức tạp đến vậy. Chúng ta hoàn toàn có thể nạp dữ liệu vào một Lua state duy nhất, sau đó các state khác trong cùng tiến trình truy cập thông qua interface C để đọc dữ liệu.
Ngày hôm nay, mình đã hoàn thành phiên bản thử nghiệm đơn giản và đăng tải lên Github. Hiện tại hệ thống hỗ trợ chia sẻ các kiểu dữ liệu: nil, number, boolean, function, table. Với kiểu function có một số hạn chế - không thể chứa upvalue, được thực hiện thông qua string.dump và load. Đối với kiểu table, hệ thống trả về tập hợp key để tiếp tục truy vấn từng phần tử bằng hàm get.
Vấn đề an toàn đa luồng: Mình tin rằng việc chỉ đọc từ một Lua state là an toàn trong môi trường đa luồng. Tuy nhiên như bạn @resty đã提醒, khi nhiều thread đồng thời thao tác với database stack sẽ tồn tại rủi ro. Giải pháp được áp dụng là khởi tạo sẵn 32 thread trong database state, mỗi thread sử dụng stack độc lập để đảm bảo an toàn đồng thời.
Cải tiến ngày 23/4: Phiên bản cũ gặp vấn đề an toàn khi truy vấn key không tồn tại, do hàm lua_pushstring không đảm bảo thread safety. Mình đã viết lại toàn bộ phần implement bằng C, sử dụng hash table thuần C để thay thế. Phiên bản mới này không chỉ khắc phục hoàn toàn lỗ hổng an toàn mà còn cải thiện hiệu năng truy xuất đáng kể.