最近のGoogle App Engineでは、課金額節約のために、不要なシングルプロパティインデックスを削除するチューニングを行いますよね。
でも何でもかんでも unindexes にする訳にはいかないです。
シングルプロパティインデックスを使うQueryとかには必要な訳です。そもそもコンパイルが通らなくなるので間違えようがありません。
じゃあそれだけ気をつけて、あとはカスタムインデックスで対応しようとすると、特定のEntityがクエリによって見えたり見えなかったりする不具合に遭遇しました。
ある程度データがあるEntityの特定のプロパティを @Attrbute(persistend = false) すると、その後に生成されたEntityに関しては、そのプロパティを含むインデックスにエントリが保持されない様です(DatastoreNeedIndexException とかそういうのでなく、あたかもEntity.setUnindexedProperty()した様な振る舞い)。
どうやら、appengine のカスタムインデックスに含まれるプロパティに対して、シングルプロパティインデックスを無効にすると、該当するカスタムインデックスは作成されない様です。(slim3 1.0.15 + appengine sdk 1.6.4)
カスタムインデックスに関しては、個別にインデックスが作られるイメージで理解してましたが、シングルプロパティインデックスを参照しているんですね。知らなかったです。
いつの間にか appengine の Mail APIで bounce mailが受信できなくなっていて、まだ治ってない感じです。
不達メールのエラーメールが届かない – Google-App-Engine-Japan | Google グループ
凄く前は動いてた気がするんだけどなァ。気のせいなのかな。
これでは沢山メールを送信するサービスを appengine で運営するとなると厳しいことになります。
メールを沢山送信するサービスをやった事がある方なら判ると思うんですが、バウンスメールの内容を解析して、常に会員マスタとかののメールアドレスをスクリーニングしないと、厳しいトコならSMTPのリレーを拒否されます。(yから始まるISPとか)
GMailという世界一のメールサービスを運営しているGoogleがそれを知らない訳が無いんです。
Google先生ひどい。ひどいっす。
appengine は SSLへの対応の遅さといい、本当に Enterprise を取りに行くつもりがあるんでしょうか。
私もすごく困るんで、issueにスター付けて頂けると嬉しいです。
Issue 1800 – googleappengine -Mail API – Return-Path header contains garbage@apphosting.bounces.google.com
Issue 3210 – googleappengine – Allow setting envelope sender (return path) via mail service API
それにしてもスター少な!
バウンスメールへの関心の低さには元インフラ屋として残念な気持ちでいっぱいです。

久しぶりにGoogle Code にあった Appengine のドキュメント達を見ようとしたら、Google Developer の方にリダイレクトされました。
引越しは着々と進んでいるようですね。
今更ですが、メンテナンス対策メモ。
定期メンテナンス中の機能の維持 – Google App Engine — Google Developers
Datastoreが読み取りモードになった時に無様なエラー画面にならない様に、Datastoreの put とかは com.google.apphosting.api.ApiProxy.CapabilityDisabledException をcatchましょう、という事です。
上記以外にも色々スローされるので、運用としては発生したらエラー制御を追加していく感じになりましょうか。
GAE/Jで運用中に発生する例外(と一部対処法) : CB NANASHI管理人ブログ
Memcache も メンテ中の put とかは com.google.appengine.api.memcache.MemcacheServiceException がスローされるんでcatchしてね、との事です。
特にMemcacheはメンテナンス以外でも結構な頻度でおかしくなるんで、私は不精して put に限らず get も無条件で try 〜 cache でくくってます。
それが正しい作法かどうか疑問ですしもうちょっとスマートな方法があるのかも知れませんが、ユーザ影響は避けたいんで。
私の環境でたまにあるのがget時の com.google.appengine.api.memcache.InvalidValueException なんですが、コレはアプリケーション側のバグの可能性が高いんですが、起こり得ると言う意味ではcatchした方がいいと思うです。
いつのまにかappengineの特定のアプリで少し前まで見られていたDatastore Admin のページが見られない様になっていました。
Internet Explorerで見られないとかそんなんじゃありません。ブラウザはWindows版 chrome, firefox、およびmac版chrome で試しました。
lastest というバージョン名は使っていないので、この現象とは違います。
Datastore Adminのページが開けない – Google グループ
経緯としては、最初こんなエラーが出たので、
Error: Not Found
The requested URL /_ah/login_required?continue=https://ah-builtin-python-bundle-dot-latest-dot-slow-net.appspot.com/_ah/datastore_admin/?app_id=s~xxxx was not found on this server.
Application Settingsから、「Datastore Admin」を「Disable」して「Enable」をクリックしたんです。
その後、Datastore Adminをみたらこんな事を言われ
サードパーティのサービスが Google アカウント へのアクセスを許可するようリクエストしています。
使用するアカウントを選択してください。
「次へ」をクリックしたらそれ以降、Datastore Adminの画面が真っ白のままです。
Google グループ へ投稿しました。
Datastore Admin のページが見られない(真っ白) – Google グループ
そしてすぐに解決しました。
Authentication Options を Federated Login にしてるせいでした。
多分 Federated Login にしていると Bulkloader が使えないのと同じ理屈なんでしょうね。
issue trackerをよく見れば判ったものを、慌ててました。
appengine java + slim3 の開発では、scenic3にお世話になっています。
scenic3は t2 frameworkのようなPageクラスをslim3で実現するslim3の拡張ライブラリです。
scenic3
ページ作るの便利なんで。
そのPageクラスを作るときにアノテーションとか忘れそうになるんでメモしておきます。
@Page リクエストパスの1個目?を指定する
@ActionPath = リクエストパスの2個目以降を指定する
手が覚えるまで迷うのがこれら。
@Var = リクエストパスの中に引数を指定した場合に書く
私にとってコレが簡単に出来る事がscenic3を使う理由のひとつ。
@RequestParam = リクエストパラメータ(GET引数)を引数にする場合に書く
勿論メソッド内で request.getParameter(“xxx”) とも書けるけど、明示的にメソッドの引数にも出来るってこと。
自然語でメモするとなんかややこしい・・・。
簡単なPageクラスはこんな感じになる。
@Page("/path")
public class PathPage extends ScenicPage
{
@ActionPath("to/{id}")
public Navigation list_json(
@Var("id") String id
, @RequestParam("limit") Integer limit
, @RequestParam("offset") Integer offset
)
{
// POSTの場合はコッチ
String hoge = (String) request.getAttribute("hoge");
....
return forward("/path/to/page.vm");
}
}
AppUrl.java への追加も忘れずに。
public AppUrls()
{
excludes("/_ah/*");
excludes("/remote_api");
add(PathPageMatcher.get());
}