2012年11月13日

處理Google App Engine Transaction Collision

使用Google App Engine以來比較麻煩的就是先天上的限制,曾經遇過比較雞屎的缺點像是
1000筆查詢結果(已改善)、django版本問題、資料結構貧乏、沒有Quota Alarm、對於負面表列的query非常薄弱之外,還有就是transaction collision問題

Transaction Collision問題標準解法通常是用shard,分片儲存來處理大量更新請求,這在於一開始設計資料結構就能洞悉哪些entity將來會需要大量更新,不太精實,尤其後來使用HA後,shard還不能在同一個entity group中,這樣要直接取用或是做query都會變得比較麻煩,也不適合已經不想去修改以前自己留下來的屎的心境。

Transaction Collision問題也可以使用retry,這個方法最簡單,但是對於一次請求要更新不同entity group的情況來說比較麻煩,要自己處理rollback,而且retry對於整體情況沒有減緩作用,比較適合當輔助效果。

Transaction Collision問題也可以使用bulk update,把原本會發生碰撞的request做結合,用記憶體合併請求一次更新,最後再用task queue確保正確性,這樣一來可以減少絕大多數的資料庫更新次數,碰撞發生微乎其微,更可以減少datastore operation節省美金。