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上で掲示板とかコメントサービス作ろうとしたときに、 リモートホストで規制掛けられると便利じゃないかなぁと思ったからです。
まあ今日まとめた方法がどう考えてもバッドノウハウな気がしてたまらないので、 どうしてもリモートホストが必要なときに試してみてはどうでしょうか。