このエントリーをはてなブックマークに追加

Backendsは常時起動するインスタンスを作ることも可能です。 制限時間がないので非常に重い処理をまとめてする時などに使えます。

より詳しくは公式ドキュメントJava版(英語)を見てください。

Backendsを作る

アクセスがしばらくないと停止するようにするためdynamictrueにする。 backends.xmlWEB-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インスタンス時間はあり得る)

クーロンジョブ機能を使って

検索のインデックスの更新を、更新の度だと頻繁になるので、一日まとめて、数回行う。

クーロンジョブを使って計画的に作業すれば、タスクキューを使うケースと違って、インスタンス時間が予想管理しやすい。