Hỗ Trợ UDP Trong Skynet - nói dối e blog

Hỗ Trợ UDP Trong Skynet

Sau một thời gian dài cân nhắc, cuối cùng tôi đã quyết định bổ sung hỗ trợ UDP cơ bản cho skynet. Dù trong đa số trường hợp tôi không khuyến khích sử dụng giao thức UDP, đặc biệt là trong lĩnh vực game online, nhưng xét thấy hiện nay skynet đã được ứng dụng rộng rãi ngoài lĩnh vực game, nên việc thêm hỗ trợ UDP giới hạn là hoàn toàn đáng giá.

Một vài thông tin thú vị từ phản hồi gần đây: Có nhóm kỹ sư đã triển khai skynet trên thiết bị switch mạng (CPU PowerPC) và nhờ đó đã giúp sửa một số lỗi liên quan đến thứ tự byte; có đơn vị ứng dụng trong lĩnh vực chứng khoán; cũng có nhóm làm phát video trực tuyến. Đáng chú ý là trong lĩnh vực phát triển web, dù mới chỉ là thử nghiệm đơn giản nhưng hiệu năng đã không thua kém so với giải pháp tích hợp Lua vào Nginx.

Hiện tại mã nguồn UDP đã hoàn thành, được lưu trên nhánh “udp” của kho GitHub. Dự kiến trong thời gian tới sẽ được hợp nhất vào nhánh chính. Do bản thân tôi không có nhu cầu sử dụng UDP nên rất mong các bạn đang có nhu cầu dùng UDP hãy đọc kỹ mã nguồn, thực tế triển khai để phát hiện các lỗi tiềm ẩn.

Tài liệu thiết kế và API đã được cập nhật đầy đủ trên trang wiki dự án.

Gần đây tôi cũng thực hiện tối ưu nhỏ cho cơ chế phân phối tin nhắn mạng, xin chia sẻ phương pháp:

Thông thường khi xử lý nhiều tin nhắn, giải pháp đơn giản là đưa vào hàng đợi và xử lý tuần tự. Tuy nhiên nhược điểm là nếu một tin nhắn bị chặn (blocking) sẽ làm trì hoãn toàn bộ các tin nhắn sau.

Giải pháp khả dĩ là dùng skynet.fork tạo nhiều coroutine xử lý song song. Tuy nhiên nếu quy trình xử lý không có chặn thì lại gây lãng phí tài nguyên.

Tôi đề xuất giải pháp trung hòa:

  1. Kiểm tra hàng đợi không rỗng
  2. Dùng skynet.fork gọi lại chính hàm xử lý này
  3. Ngay lập tức vòng lặp xử lý tiếp tin nhắn trong hàng đợi

Nếu xử lý không bị chặn, coroutine fork ra sẽ thấy hàng đợi trống và thoát ngay. Nếu có chặn, coroutine fork sẽ tiếp tục xử lý phần còn lại. Số lượng coroutine tạo ra chỉ nhiều hơn phương pháp lý tưởng nhất đúng một coroutine.

Về kế hoạch cộng đồng, trong năm nay chúng tôi dự kiến tổ chức buổi gặp mặt offline tại Quảng Châu (Trung Quốc). Thời gian cụ thể sẽ thông báo sau, các bạn quan tâm vui lòng đăng ký qua danh sách email của dự án.

0%