2012-03-06 17 views
6

Tôi đã gặp sự cố này lần thứ hai và tôi tự hỏi liệu có giải pháp nào cho vấn đề này hay không. Tôi đang chạy một ứng dụng trên Google App Engine dựa trên việc liên lạc thường xuyên với một trang web thông qua HTTP JSON RPC. Dường như GAE có xu hướng một cách ngẫu nhiên hiển thị một thông điệp như thế này trong các bản ghi:GAE Go - "Yêu cầu này gây ra một quá trình mới để bắt đầu cho ứng dụng của bạn ..."

"Yêu cầu này gây ra một quá trình mới được bắt đầu cho ứng dụng của bạn, và do đó gây ra mã ứng dụng của bạn được nạp cho lần đầu tiên. Yêu cầu này có thể mất nhiều thời gian hơn và sử dụng nhiều CPU hơn yêu cầu điển hình cho đơn đăng ký của bạn. "

Và đặt lại tất cả các biến được lưu trữ trong RAM mà không cảnh báo. Quá trình tương tự xảy ra hơn và hơn bất kể có bao nhiêu lần tôi đặt lại các biến hoặc tải lên mã mới hơn lên GAE, mặc dù việc tăng số phiên bản ứng dụng dường như giải quyết được vấn đề.

Làm cách nào để có thêm thông tin về hành vi này, cách tránh và ngăn chặn mất dữ liệu các ứng dụng Golang của tôi trên Google App Engine?

EDIT:

Các biến được lưu trữ trong RAM có các lớp học nhỏ của chuỗi, byte, bools và con trỏ. Không có gì quá phức tạp hoặc lớn.

Công cụ ứng dụng của Google dường như "bắt đầu một quy trình mới" trong vài giây sử dụng nặng hơn, không đủ thời gian để ứng dụng bị tắt do không được sử dụng. Khoảng thời gian giữa các ứng dụng được tải lên GAE, có bộ biến của nó và một quá trình mới được tạo ra chưa đầy một phút.

+0

Bạn có thể làm rõ về bản chất của các biến được lưu trữ trong RAM không? Bạn có thể cache dữ liệu đó trong Memcache không? – kristianp

Trả lời

3

Bạn có thể đọc về trường hợp GAE trong tài liệu của họ vào đây, hãy kiểm tra phần thực hiện:

http://code.google.com/appengine/kb/java.html

Trong trường hợp của bạn có dữ liệu nhỏ có sẵn, nếu tĩnh của nó sau đó bạn có thể tải nó vào bộ nhớ trên khởi động một cá thể mới. Nếu đó là dữ liệu động, bạn nên lưu nó vào cơ sở dữ liệu bằng cách sử dụng api của chúng.

Tôi đề nghị cho giữ một trường hợp GAE sống, hoặc là trả tiền cho các dịch vụ Always-On hoặc làm theo khuyến nghị của tôi cho việc sử dụng một cron đây:

http://rwyland.blogspot.com/2012/02/keeping-google-app-engine-gae-instances.html

tôi sử dụng cái mà tôi gọi là "lịch trình Thủ" trong một công việc định kỳ 3, 7, 11 phút.

+0

Khoảng thời gian giữa ứng dụng đang được khởi tạo và quá trình mới được tạo dưới 1 phút, do đó, sự cố có thể khác với ứng dụng đang bị đóng do không được sử dụng trong một thời gian. – ThePiachu

+2

Luôn bật sẽ không giúp ích gì nếu bạn có thiết kế xấu dự kiến ​​có thể lưu trạng thái trong RAM giữa các yêu cầu. Bạn vẫn có thể có hàng chục trường hợp chạy cùng một lúc khi bạn mở rộng quy mô để xử lý nhiều lưu lượng truy cập và chúng sẽ không chia sẻ trạng thái. – geoffspear

+0

@ThePiachu Đăng nhập vào trang web appengine và xem các trường hợp của bạn và đăng nhập. Có thể bạn sẽ thấy rằng sau khoảng 5-10 phút không hoạt động, phiên bản chạy của bạn sẽ tắt. GAE là một nền tảng có thể mở rộng: nếu bạn không sử dụng nó, tại sao lại lãng phí tài nguyên? – rwyland

12

Bạn có nhận ra rằng GAE là một giải pháp lưu trữ đám mây tự động quản lý các phiên bản dựa trên tải không? Đây là tính năng chính và lý do mọi người đang sử dụng nó.

Khi tải tăng, GAE tạo một phiên bản mới, tất nhiên, có tất cả các biến RAM trống.

Giải pháp không phải là mong đợi các biến có sẵn hoặc lưu trữ chúng vào bộ nhớ vĩnh viễn vào cuối yêu cầu (phiên, memcache, kho dữ liệu) và tải chúng nếu không có ở đầu yêu cầu.

2

Bạn nên cân nhắc sử dụng Backends nếu bạn muốn các phiên bản chạy dài có bộ nhớ cư trú.

+0

Các chương trình phụ trợ hiện được khắc phục. Bất cứ một đề nghị nào khác? – Ajai

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