Giải Pháp Cụm Mới Của Skynet - nói dối e blog

Giải Pháp Cụm Mới Của Skynet

Vào tuần trước, phiên bản 0.3 của Skynet đã chính thức ra mắt, nổi bật với một giải pháp cụm hoàn toàn mới.

Trước đây, giải pháp cụm của Skynet bị giới hạn ở mức 255 nút, sử dụng 8 bit trong địa chỉ dịch vụ để đánh số nút. Quá trình truyền tin nhắn sẽ dựa trên số hiệu nút, qua kết nối TCP giữa các nút, được đẩy tới dịch vụ harbor của nút Skynet đích trước, sau đó mới được phân phối tiếp.

Giải pháp này có khả năng ẩn giấu vị trí thực tế của hai dịch vụ Skynet - dù chúng nằm cùng tiến trình hay khác máy vật lý, đều có thể sử dụng địa chỉ duy nhất để gửi tin nhắn. Tuy nhiên, thiết kế của nó tương đối đơn giản, chưa tính đến trường hợp kết nối giữa các nút không ổn định. Thường chỉ phù hợp trong trường hợp nâng cao hiệu năng bằng cách mở rộng phần cứng khi một máy vật lý không đáp ứng đủ công suất. Trong môi trường này, các máy chủ nên được triển khai cùng một switch mạng.

Giải pháp cũ còn tồn tại vấn đề về tính đàn hồi. Khi một máy chủ gặp sự cố, việc khởi động lại với cùng ID nút sẽ gây ra hậu quả khó lường. Bởi các dịch vụ đang hoạt động sẽ không nhận thức được toàn bộ địa chỉ cũ trong nút đó đã失效, đồng thời trạng thái nội bộ của tiến trình mới không thể phục hồi giống như trước.

Chính vì vậy, tôi đã xây dựng một giải pháp cụm mới dựa trên các API cấp cao hơn của Skynet, mang lại độ đàn hồi vượt trội.

Khác biệt lớn nhất so với giải pháp trước là giao tiếp cụm trong phiên bản mới sẽ không còn trong suốt. Nếu muốn gửi tin nhắn tới một dịch vụ trên máy khác trong cụm, bắt buộc phải sử dụng API phân phối tin nhắn cụm đặc biệt. Các nút hiện tại sẽ được phân biệt bằng tên chuỗi thay vì ID số. Các tin nhắn giữa các cụm được thống nhất dùng chung một giao thức tuần tự hóa (để đơn giản hóa giao thức).

Bạn có thể tham khảo giải pháp mới này qua hai file cấu hình config.c1 và config.c2 trong thư mục examples, cho phép hai nút khởi động và giao tiếp lẫn nhau.

Nếu sử dụng giải pháp mới, bạn có thể tắt cơ chế đa nút cũ bằng cách cấu hình harbor = 0 trong Skynet (tất nhiên cũng có thể dùng song song). Để đơn giản hóa thiết lập, các thông số như address, standalone, master… không còn cần thiết nữa.

Thay vào đó, hãy thêm thông số cluster trỏ tới một file Lua mô tả tên và địa chỉ của từng nút trong cụm.

Hiện tại giải pháp cluster mới chỉ hỗ trợ một phương thức RPC duy nhất dùng để gọi dịch vụ từ xa. API này tương tự skynet.call nhưng yêu cầu cung cấp tên chuỗi của nút từ xa và bắt buộc sử dụng kiểu dữ liệu Lua làm giao thức truyền thông.

Giải pháp mới này có thể được xem như một bổ sung hoàn hảo cho cụm Skynet truyền thống. Khi bạn cần triển khai các máy chủ ở nhiều trung tâm dữ liệu khác nhau, trong khi mối quan hệ giữa các nút tương đối lỏng lẻo và chỉ có một số ít dịch vụ cần gọi RPC, giải pháp mới sẽ là lựa chọn tối ưu. Bởi khi nút từ xa mất kết nối, bên phát起了 RPC sẽ bắt được ngoại lệ; đồng thời việc dùng tên chuỗi để đánh dấu nút giúp xóa bỏ giới hạn 255 nút. Ngay cả khi mất kết nối, hệ thống cũng có thể tự phục hồi thông qua việc kết nối lại.

0%