Hive – Mô Hình Actor Trong Lua - nói dối e blog

Hive – Mô Hình Actor Trong Lua

Cuối tuần vừa rồi, tôi dành thời gian suy ngẫm về hành trình phát triển hơn một năm qua với skynet. Từ kinh nghiệm thực tế này, tôi nhận thấy nếu không còn những gánh nặng từ thiết kế ban đầu của Erlang và thiếu kinh nghiệm khi xây dựng skynet ngày xưa, liệu ta có thể tạo ra một phiên bản skynet tối giản hơn, bỏ đi những tính năng thừa thãi?

Một phiên bản skynet thu gọn nên tập trung hoàn toàn vào Lua – ngôn ngữ chính để xây dựng hệ thống. Thay vì hỗ trợ đa ngôn ngữ và giao thức phức tạp, ta có thể tối ưu như sau:

  • Đối với các dịch vụ yêu cầu hiệu năng cao, hãy viết thư viện C tích hợp Lua, để Lua chỉ làm nhiệm vụ phân phối tin nhắn.
  • Khi cần gửi tin nhắn với giao thức tùy chỉnh, hãy đóng gói dữ liệu thành đối tượng C, sau đó mã hóa con trỏ của cấu trúc C này vào tin nhắn.

Các lệnh điều khiển nội bộ của skynet có thể chuyển toàn bộ sang một dịch vụ hệ thống viết bằng Lua. Việc hỗ trợ kết nối đa máy không còn là yếu tố bắt buộc – ta có thể tạo một dịch vụ truyền thông chuyên dụng để xử lý logic phân tán, dù điều này tạo thêm tầng trung gian làm chậm tốc độ truyền liên tiến trình nhưng lại giúp đơn giản hóa đáng kể mã nguồn.

Tương tự, cơ chế phát sóng (broadcast) cũng nên được giải quyết theo cách thủ công: thay vì xây dựng hạ tầng phức tạp, ta chỉ cần lặp qua các đích nhận và gửi bản sao tin nhắn. Để tránh việc sao chép dữ liệu lớn nhiều lần, hãy đóng gói tin nhắn thành đối tượng C rồi phát đi con trỏ tới đối tượng đó.

Từ triết lý tối giản này, tôi đã dành hai ngày để viết lại skynet từ đầu với tên gọi mới Hive. Toàn bộ mã nguồn chỉ vỏn vẹn dưới 2000 dòng, trong đó phần C chưa đến 1400 dòng – hoàn toàn đạt được mục tiêu thu gọn ban đầu.

Nếu bạn chưa từng làm quen với skynet, có thể hình dung Hive như một phiên bản Erlang thu nhỏ được xây dựng bằng Lua theo mô hình Actor. Bạn chỉ cần sử dụng trình thông dịch Lua 5.2 chuẩn, nạp module hive và gọi hàm hive.start() để khởi động hệ thống.

Tập tin main.lua sẽ được thực thi đầu tiên trong một trạng thái Lua độc lập (gọi là cell). Cell hệ thống (system cell) luôn tồn tại để cung cấp các dịch vụ nền tảng như bộ đếm thời gian (timer). Hive bao gồm hàng loạt cell – mỗi cell là một trạng thái Lua độc lập, hoạt động song song trên nhiều luồng. Số luồng có thể cấu hình khi khởi động, trong khi số lượng cell có thể vượt xa con số này, với cơ chế phân bổ tài nguyên CPU đồng đều.

Mỗi cell đóng vai trò bộ xử lý tin nhắn – nhận và phản hồi tin nhắn từ các cell khác. Mô hình xử lý hỗ trợ cả hai chế độ:

  1. Yêu cầu-phản hồi (request-response) chặt chẽ.
  2. Gửi một chiều (one-way messaging) không cần hồi đáp.

Mỗi tin nhắn được xử lý bởi một coroutine riêng biệt. Trong bản demo hiện tại, main.lua minh họa cách khởi tạo cell pingpong.lua và gửi tin nhắn tương tác với nó.

Bạn có thể tải toàn bộ mã nguồn trên GitHub. Tôi đã lập một danh sách công việc cần làm (todo list) dài dằng dặc, phần lớn là các tính năng được chuyển đổi từ skynet. Tuy nhiên đây không phải dự án thương mại nên tôi không đảm bảo sẽ hoàn thành hết trong thời gian tới. Nếu bạn hứng thú, hãy cùng tôi phát triển Hive trở thành một hệ sinh thái mạnh mẽ hơn!

0%