2011-01-17 39 views
8

Một trong những trách nhiệm của ứng dụng Rails của tôi là tạo và phục vụ các xml đã ký. Bất kỳ xml đã ký nào, khi đã tạo, không bao giờ thay đổi. Vì vậy, tôi lưu trữ mọi xml trong thư mục public và chuyển hướng máy khách một cách thích hợp để tránh việc xử lý không cần thiết từ bộ điều khiển.Cung cấp các tệp zip động thông qua Apache

Bây giờ tôi muốn một tính năng mới: mỗi xml được liên kết với một ngày và tôi muốn triển khai khả năng phân phối tệp nén chứa mọi xml có ngày nằm trong khoảng thời gian được chỉ định bởi ứng dụng khách. Tuy nhiên, khoảng thời gian không thể giới hạn dưới một tháng để tính năng này hữu ích và điều này ngụ ý rằng một số tệp zip được phân phát sẽ lớn tới 50 triệu.

Ứng dụng của tôi được triển khai làm mô-đun Hành khách của Apache. Do đó, hoàn toàn không thể chấp nhận để phục vụ tệp với send_data, vì khách hàng sẽ phải đợi toàn bộ tệp nén được tạo trước khi quá trình tải xuống thực sự bắt đầu. Mặc dù tôi có ý tưởng về cách triển khai tính năng trong Rails để tệp nén được sản xuất trong khi đang được phục vụ, tôi cảm thấy máy chủ của mình sẽ khan hiếm tài nguyên khi một số quy trình Ruby/Hành khách dài được phân bổ để phục vụ các tệp zip lớn.

Tôi đã đọc khoảng a better solution để phân phối tệp tĩnh qua Apache, chứ không phải tệp động.

Vì vậy, giải pháp cho vấn đề là gì? Tôi có cần thứ gì đó giống như một trình xử lý Apache tùy chỉnh không? Làm cách nào để tôi thông báo cho Apache, từ ứng dụng của tôi, cách xử lý yêu cầu, nén tệp và truyền trực tuyến kết quả cùng một lúc?

+0

Chỉ mục định dạng tệp ZIP ở cuối tệp. Ngoài ra tôi liếc nhanh qua RFC 2616 (HTTP 1.1) và độ dài thay đổi tương tự như vậy có thể hoạt động mặc dù thông thường độ dài nội dung sẽ được công bố. Về mặt kỹ thuật, điều này có thể xảy ra theo như tôi thấy. – erloewe

+0

Không có sự cố HTTP nào mà không biết trước về độ dài, đây là mã hóa chuyển mã chunked. Bạn có thể viết các byte trông giống như một tập tin zip trong bất kỳ ngôn ngữ nào, chỉ cần chắc chắn rằng bạn sẽ xóa đầu ra định kỳ. – covener

Trả lời

3

Kiểm tra mô-đun mod_zip tôi cho Nginx:

http://wiki.nginx.org/NgxZip

Bạn có thể có một kịch bản backend nói Nginx những vị trí URL để đưa vào lưu trữ, và Nginx sẽ tự động dòng một tập tin ZIP cho khách hàng có chứa những tệp đó. Module này sử dụng mã proxy đơn luồng của Nginx và cực kỳ nhẹ.

Mô-đun được phát hành lần đầu tiên vào năm 2008 và khá trưởng thành vào thời điểm này. Từ mô tả của bạn, tôi nghĩ rằng nó sẽ phù hợp với nhu cầu của bạn.

0

Bạn chỉ cần sử dụng bất kỳ API nào bạn có sẵn để tạo một tệp zip và ghi nó vào phản hồi, làm sạch đầu ra định kỳ. Nếu điều này đang phục vụ các tệp zip lớn hoặc sẽ được yêu cầu thường xuyên, hãy xem xét chạy tệp đó trong một quy trình riêng biệt với giá trị tốt/ion tốt cao/mức độ ưu tiên thấp.

Trường hợp xấu nhất, bạn có thể chạy zip dòng lệnh trong quy trình ưu tiên thấp và chuyển đầu ra theo định kỳ.

0

thật khó để làm, nhưng tôi đã tạo một viên ngọc được gọi là zipline (http://github.com/fringd/zipline) để mọi thứ hoạt động với tôi. Tôi muốn cập nhật nó để nó có thể hỗ trợ xử lý tập tin đơn giản hoặc đường dẫn, ngay bây giờ nó giả sử bạn đang sử dụng carrierwave ...

cũng có, bạn có thể không dòng phản ứng với hành khách ... Tôi đã phải sử dụng kỳ lân để làm cho công việc phát trực tuyến hoạt động đúng cách ... và một số phần mềm trung gian giá nhất định thậm chí có thể vít lên (gọi phản hồi.to_s ngắt nó)

nếu ai đó vẫn cần điều này làm phiền tôi trên trang github

Các vấn đề liên quan