現在の Google App Engine で取得できないリモートホストを効率よく取得する方法
2010 年 1 月 18 日現在、 [[Google App Engine]] ではソケットの使用とか DNS の名前解決ができないため、リモートホストが取得できません。また Google App Engine 上でリモートホストが必要な場合、外部のサーバ経由で取得するとかしか方法がないのが現状です。
で、外部サーバ経由でリモートホストを取得する方法について、今日本屋で行った帰りの電車の中で思いついたので、とりあえず書き留めてみるよ。
方法一、リモートホストを取得する Web サービスにリクエストを送ってリモホを取得する
これは僕が最初に思いついた方法なんですが、
- リモートホストが必要になるたびに、リモートホストを返す Web サービスにリクエストを送る
- Web サービスから返ってきたホスト名を使用する
という方法です。
シンプルで分かりやすいのが利点といえば利点ですが、
- リモートホストが必要になるたびに外部サーバにリクエストを送ることになる
- 貴重な外部サーバへのリクエスト要求のリソースを無駄に消費することになる
という欠点があります。
まあキャッシュしたりすればある程度はリクエストを減らすこともできると思いますが、それでも上記の問題は完全に解決できるわけではありません。
で、今日思いついた方法が次。
方法二、外部サーバにリモートホストを GAE サーバに送らせる
これは今日思いついた方法なんですが、これは、
- GAE のサイト上に IP アドレスとリモートホストを GAE サーバに送信する Web アプリケーションを埋め込む
- リモートホスト送信サーバから送信されたリモートホストを memcache に保存する
- リモートホストが必要なときは memcache からリモートホストを取得する
という方法です。
一番の埋め込み方法としては、
- 隠し iframe とかでリクエストが飛ぶようにする
- Web サービスの方で Web ビーコン返すようにして画像として埋め込む
という方法が考えられます。
あと IP アドレスをリモートホストを返す Web サービスで、 IP とリモートホストの対応が変更された場合にのみ、GAE サーバにリクエストを送る という風にしておけば、GAE 上のリソースの消費を最小限に抑えることができます。
で、この方法の欠点としては、
- 結局外部サーバに依存してしまう
- 少なめといえ GAE のリソースを消費する
- _ GAE 上のサイトに初めてアクセスしたユーザーのリモートホストが取得できない(次回以降になる)_
という点が挙げられます。
まあ一番二番は方法一でも一緒です。あと三番に関しては、この方法独自の問題と言えますが、方法一と組み合わせるとなんとかなるんじゃないかと思います。
まとめ
まあ一番最初に思いついた方法も、今日思いついた方法も、 [[Google App Engine]] でリモートホストが取得できるようになればいらない子になることが確実な方法です。
つーかあとリモートホストが取れなくても、リモートアドレス取得すればいいじゃないって話なので、上記の方法はどうしてもリモートホスト取りたいって時以外はあんまり必要無い方法だと思います。
で、なんでリモホにこだわるかっていうと、GAE 上で掲示板とかコメントサービス作ろうとしたときに、リモートホストで規制掛けられると便利じゃないかなぁと思ったからです。
まあ今日まとめた方法がどう考えてもバッドノウハウな気がしてたまらないので、どうしてもリモートホストが必要なときに試してみてはどうでしょうか。