写真共有アプリの
バックエンドサーバー
 appengine ja night #21
       BeerTalk
お前、誰よ?

● 岡野真也(twitter: @tokibito)
  ○ 株式会社ビープラウド
    ■ 受託開発
    ■ Python
    ■ Django
    ■ GoogleAppEngine
事例紹介: 写真共有アプリ Cotto

● http://cotto.jp
● 株式会社バスキュール号
● サーバー側の開発をビープラウドがお手伝いし
  ました
http://cotto.jp/
アプリの概要

● Android用アプリケーション
● mixi/Twitter/facebookアカウントでログイン
● 写真をデコってタイムラインに投稿
● フォローしたユーザーの写真をタイムラインで見
  れる
● チェック、コメント
● テーマごとに投稿された画像を見れる
システム構成

● Android 2.3以上
● GoogleAppEngine/Python 2.7
● EC2(静的コンテンツの配信)
システムのイメージ
開発で気を使った所

●   twitter/mixi/facebook認証
●   画像データの保存と配信
●   タイムライン処理
●   管理画面
twitter/mixi/facebook認証

● サーバー側からSNSへ投稿する必要がある
● サーバー側でソーシャルグラフを取得する必要
  がある
● クライアント-サーバー間の認証も必要



  →WebViewでごにょごにょしてます
認証フロー
画像の保存と配信

● 相互フォローの相手にしか見せない画像がある
 ○ →画像の取得には認証が必要
● 論理削除がある
● 画像主体のため、画像データへのアクセスが多
  い


 →Frontendによるキャッシュ
 →memcacheの活用
Frontendキャッシュ有り(全体に公開する画像)




Frontendキャッシュ無し(友達のみに公開する画像)
タイムライン処理

● いわゆるTwitterみたいなタイムライン+α
 ○ facebookに近い
● フォローしている人の投稿が見れる
 ○ 友達のみなら相互フォローの判定あり
 ○ 例えばフォロワーが1000人いたら、1000人のタイムライン
   に投稿画像が流れる
   ■ DatastoreはJOIN不可なのでクエリで取得は無理
● フォローしている人がチェックしたものが見れる

  →taskqueue利用
  →backends利用
管理画面

● GAEの管理コンソールではデータの追加削除
  が難しい
 ○ 変更時にフックして処理を行なうこともできない
   ■ キャッシュ削除や配信処理など
● 運用のためのツールが必要
 ○ 各種データ投入や設定など


 →djangoformsを使って管理画面を
 作った
その他

● unittest書いてます
● チューニング
  ○ 一括取得/一括更新
    ■ db.get/db.put
  ○ 可能な限りmemcacheを使ってます
    ■ get_multi/set_multi
● 時間のかかる処理は継続タスクで処理
  ○ バッチ処理でも通常は1リクエストあたりで10秒以内にレ
    スポンスを返すようにしている
    ■ 続きの処理は別のタスクにする
    ■ エラー/中断時の最実行の単位を小さくするため
宣伝
     Python
     プロフェッショナル
     プログラミング

     秀和システム
     464ページ
     2,940円

     買ってね!
おしまい

写真共有アプリのバックエンドサーバー