Common Gateway Interface ( CGI ), một công nghệ web từ những năm 1990 đã bị bỏ rơi phần lớn vì quá chậm, đang trải qua sự quan tâm mới từ các nhà phát triển. Các thử nghiệm gần đây cho thấy CGI có thể xử lý khối lượng tải ấn tượng trên phần cứng hiện đại, thách thức những niềm tin lâu nay về các hạn chế của nó.
Các thí nghiệm của Jake Gold chứng minh rằng một chương trình CGI dựa trên Go chạy trên bộ xử lý AMD 3700X 16 luồng có thể phục vụ hơn 2.400 yêu cầu mỗi giây, tương đương với hơn 200 triệu yêu cầu mỗi ngày. Mức hiệu suất này đưa CGI trở lại cuộc cạnh tranh cho các ứng dụng web nghiêm túc, điều mà có vẻ không thể chỉ vài năm trước.
Chỉ số hiệu suất:
- Số yêu cầu mỗi giây: 2.400+
- Khả năng xử lý yêu cầu hàng ngày: Hơn 200 triệu
- Phần cứng thử nghiệm: Bộ xử lý AMD 3700X 16 luồng
- Triển khai: Chương trình CGI Go + SQLite
Vấn Đề Ban Đầu và Tại Sao Nó Tồn Tại
CGI hoạt động bằng cách tạo một tiến trình mới cho mỗi yêu cầu web - khởi động chương trình, chạy nó, và sau đó tắt hoàn toàn. Vào cuối những năm 1990, cách tiếp cận này tỏ ra chậm chạp đáng kể, dẫn đến việc các nhà phát triển tạo ra các giải pháp thay thế như mod_php của PHP và FastCGI để giữ mã nguồn chạy trong bộ nhớ giữa các yêu cầu.
Cuộc thảo luận cộng đồng tiết lộ bài học này đã ăn sâu vào tư duy của nhà phát triển như thế nào. Nhiều lập trình viên đã dành hàng thập kỷ tránh các mẫu tiến trình-cho-mỗi-yêu-cầu, tin chắc rằng chúng có khiếm khuyết cơ bản. Tuy nhiên, niềm tin này dựa trên các hạn chế máy tính của những năm 1990 chứ không phải bất kỳ vấn đề cố hữu nào với chính cách tiếp cận này.
Bối cảnh lịch sử:
- Vấn đề ban đầu: Chi phí tạo tiến trình quá cao trên phần cứng thập niên 1990
- Ngôn ngữ cũ: Perl , Python , Java (thời gian khởi động chậm)
- Ngôn ngữ hiện đại: Go , Rust (thời gian khởi động nhanh)
- Vấn đề bảo mật: Lỗ hổng Shellshock (2014), các mối lo ngại về xác thực đầu vào
Lợi Thế Hiện Đại Xuất Hiện
Bối cảnh máy tính ngày nay đã thay đổi đáng kể. Các máy chủ hiện thường có hàng trăm luồng CPU , và ngay cả các máy ảo nhỏ thường có 16 lõi. Quan trọng hơn, các ngôn ngữ như Go và Rust khởi động nhanh hơn nhiều so với các script Perl , Python và Java thống trị trong phát triển web thời kỳ đầu.
Mô hình tiến trình-cho-mỗi-yêu-cầu thực sự mang lại một số lợi thế hấp dẫn trong môi trường hiện đại. Mỗi yêu cầu chạy trong sự cô lập hoàn toàn, loại bỏ các rủi ro bảo mật đến từ trạng thái chia sẻ giữa các yêu cầu. Sự cô lập này cũng làm cho các chương trình CGI xuất sắc trong việc tận dụng nhiều lõi CPU đồng thời.
Quan trọng nhất, các chương trình CGI , vì chúng chạy như các tiến trình riêng biệt, rất xuất sắc trong việc tận dụng nhiều CPU !
Tranh Luận Về Bảo Mật và Hiệu Suất
Sự quan tâm mới đối với CGI đã khơi mào các cuộc tranh luận về tác động bảo mật của nó. Những người chỉ trích chỉ ra lịch sử lỗ hổng bảo mật của CGI , bao gồm tính dễ bị tổn thương trước lỗi Shellshock năm 2014. Tuy nhiên, những người ủng hộ lập luận rằng những vấn đề này xuất phát từ các thực hành xác thực đầu vào kém chứ không phải khiếm khuyết cơ bản trong chính giao thức CGI .
Các so sánh hiệu suất cũng tạo ra thảo luận. Trong khi một chương trình Go sử dụng các cách tiếp cận truyền thống có thể dễ dàng vượt quá 10.000 yêu cầu mỗi giây, không phải mọi ứng dụng đều cần hiệu suất cực đoan như vậy. Tính đơn giản và lợi ích cô lập của CGI có thể vượt trội hơn tốc độ thô cho nhiều trường hợp sử dụng.
CGI so với các Lựa chọn Thay thế Hiện đại:
- Ưu điểm của CGI: Cô lập tiến trình hoàn toàn, tận dụng đa lõi xuất sắc
- Phương pháp truyền thống: Có thể xử lý 10,000+ yêu cầu/giây với Go
- Đánh đổi: Bảo mật và đơn giản so với hiệu suất thô
- Trường hợp sử dụng: Tạo mẫu nhanh, ứng dụng đa ngôn ngữ, tiện ích mở rộng khách hàng
Ứng Dụng Thực Tế Ngày Nay
Sự hồi sinh của CGI không chỉ là sự tò mò học thuật. Các nhà phát triển đang tìm thấy các ứng dụng thực tế, đặc biệt cho việc tạo mẫu nhanh và tạo các ứng dụng web đa ngôn ngữ lập trình nơi các ngôn ngữ lập trình khác nhau xử lý các đường dẫn URL khác nhau. Cách tiếp cận này cũng hoạt động tốt để cho phép khách hàng mở rộng phần mềm với mã tùy chỉnh mà không cần các framework tích hợp phức tạp.
Các máy chủ web hiện đại như h2o đang nắm bắt xu hướng này, cung cấp các tệp cấu hình sạch sẽ làm cho việc triển khai CGI trở nên đơn giản. Một số nhà phát triển thậm chí coi CGI là nền tảng tốt hơn cho điện toán serverless so với các hàm lambda độc quyền, vì nó dựa trên các tiêu chuẩn mở thay vì các triển khai cụ thể của nhà cung cấp.
Sự trở lại của CGI đại diện cho một ví dụ hấp dẫn về cách công nghệ thay đổi có thể phục hồi các cách tiếp cận dường như lỗi thời. Mặc dù nó có thể không thay thế hoàn toàn các framework web hiện đại, tính đơn giản và thuộc tính cô lập của CGI làm cho nó đáng để xem xét lại cho các ứng dụng cụ thể.
Tham khảo: Serving 200 million requests per day with a cgi-bin