Backends
Google App EngineのBackendsとは
Backendsは常時起動するインスタンスを作ることも可能です。 制限時間がないので非常に重い処理をまとめてする時などに使えます。
より詳しくは公式ドキュメントJava版(英語)を見てください。
Backendsを作る
アクセスがしばらくないと停止するようにするためdynamic
をtrue
にする。
backends.xmlをWEB-INF
の中に作成します。
<backends>
<backend name="my-dynamic">
<class>B1</class>
<options>
<dynamic>true</dynamic>
</options>
</backend>
</backends>
Eclipseで開発していれば、Deploy時に、自動で設定されます。
Backendsを呼び出す。
通常は、タスクキュー機能かクーロンジョブ機能で呼ばれます。
タスクキューから呼び出す
BackendServiceFactoryを使ってHostを追加します。
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.appengine.api.backends.BackendServiceFactory;
import com.google.appengine.api.taskqueue.Queue;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.google.appengine.api.taskqueue.TaskOptions.Method;
public class TestBackends extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Queue queue = QueueFactory.getDefaultQueue();
queue.add(TaskOptions.Builder.withUrl("/administrator/updateindex?option=all").method(Method.GET).header("Host", BackendServiceFactory.getBackendService().getBackendAddress("my-dynamic")));
resp.setContentType("text/plain");
resp.getWriter().println("called");
}
}
クーロンジョブから呼び出す
通常のクーロンジョブにターゲットで使用するBackendsを指定します。
<?xml version="1.0" encoding="UTF-8"?>
<cronentries>
<cron>
<url>/administrator/updateindex?option=all</url>
<description>update data</description>
<schedule>every 6 hours</schedule>
<target>my-dynamic</target>
</cron>
</cronentries>
Backendsの管理について
AppEngineの管理画面のダッシュボードのVersionからバックエンド名を選ぶと、状態を見ることが出来ます。
同じく管理画面のBackendsから、バックエンド名をクリックして、開く(Dynamicなら起動する)ことができます。
また、Stop/Start
の所で、開始・停止できます。
オプション
backendのpublicオプションについて
public
にすると、外からアクセスできるようになります。そして普通にWebサイトにアクセスしたのと同様に動きます。
(privateだと403 forbiddenエラーが返ってきます。)
メインのインスタンスを最小や余裕のない状態で運用している場合、管理画面で操作すると反応が重く、あるいはユーザー側の表示も遅くなって困ります。
管理画面はbackend経由にすると、重さが解消されるので、backendのインスタンスに余裕があるなら、試す価値はあります。
無料枠が9インスタンス時間もあるので、普通に営業時間内で管理に使うだけなら、課金が発生することもないでしょう。
注意事項
安全性のため、複雑なbackends名を付けると、意図的に外部からアクセスされることはないでしょう。 (DNS詳しくないのであくまで予想です。)
切り忘れて、予算に食い尽くさないよう、dynamicで運用した方がいいのでは
後は、長期使わない時は念の為にpublic外してprivateに戻すとか気をつけたいですね。
サンプル
<backends>
<backend name="admxs-great">
<class>B1</class>
<options>
<dynamic>true</dynamic>
<public>true</public>
</options>
</backend>
</backends>
どういう時にバックエンドを使うか
publicオプションで管理用に使う以外だと
タスクキュー機能を使って
通常のコンテンツを更新した際に、履歴情報やアクセスカウンターみたいな追加の書き込みを、ユーザーを待たせないために、バックエンドを使って別のインスタンスで行う。
(Dynamicに設定しても、一度起動すると数十分ぐらい?常駐するので、インスタンス時間の予想ができない。デフォルトの設定でも最大、常時起動と同じく24インスタンス時間はあり得る)
クーロンジョブ機能を使って
検索のインデックスの更新を、更新の度だと頻繁になるので、一日まとめて、数回行う。
クーロンジョブを使って計画的に作業すれば、タスクキューを使うケースと違って、インスタンス時間が予想管理しやすい。