Hennessy Artistry 2013 技術回顧

Hennessy Artistry 2013

這是一個送門票的活動,游戲旳玩法如下:

  1. 用戶甲參加游戲
  2. 在三十分鐘之內邀請另外兩個朋友 like 和參加游戲
  3. 他們一共會得到三張門票

一個看似簡單但其實複雜的流程,果難在於:

  • 一天之內只可以有十組人得到門票
  • 20 日的活動其間, 一個人只可以拿到一張門票
  • 三十分鐘的時限一過,用戶便會失去位置,其他人便可以「搶」這三個位置
  • 邀請方和被邀請方的顯示方式,文字都不一樣

最後的一點令我們底估了這個案子的難度和所需的時間。我們沒有預估到測試邀請方和被邀請方的互動是會如此困難。除此之外,還有幾個技術性的問題可以談談:

DNS 問題

我們發覺頁面的載入時間非常長,大約需要5秒的時間,不論是轉換語言,或者是 AJAX 請求都一樣。我們明白這個 tab 有比較多和 facebook 的互動,用戶的資料, signed request,access token,extended access token 等,所以有一些載入的時間是正常的,但5秒真的是太長了。所以我們立即做了一些基本的伺服器優化。一個 Redhat 的伺服器,簡單的 APC, mysqltuner.pl 之後,快了 5ms ,太好了。

這個應用也有很多查詢,有多少空位置,多少個可以參加的朋友,那個朋友已經參加了等等,所以增加了 innodb 緩存,table cache 加大等等⋯⋯無用

然後發覺開發的環境只需要大約一秒便可以返回頁面,就將問題指向網路問題了。但直存最伺服器上的圖片不發覺有問題,速度很快, ping facebook.com: 200ms 看來也是正常的範圍 graph.facebook.com? 200ms. 等一下,本機的 ping 是: 2.8ms !?!?

直接修改 /etc/hosts:
31.13.68.49 graph.facebook.com www.facebook.com

BLOOM! 返回時間由 5s 變成 1s.

Facebook notification api

https://developers.facebook.com/docs/games/notifications/ 看來是簡單到不行。POST 到一個指定的路徑,帶上用戶的 access token,返回 JSON 結果,簡單又容易。你需要產生一個 app access token,放在代碼內,一直重複使用便可。

發佈到用戶的的牆上,使用 extended access token

傳統上, Facebook 提供一個 share dialog: https://developers.facebook.com/docs/reference/dialogs/feed/. 可以照顧到一大部份的要求,但:
縮圖只有一個小方格 75x75
需要用戶的動作才可
所以 facebook 有一個新的權限 “publish_actions” ,可以使用 api 發佈到用戶的牆上, API ref: https://developers.facebook.com/docs/reference/api/post/ 例子: https://developers.facebook.com/docs/php/howto/postwithgraphapi/

提一下,這裡使用的是用戶自已的 access token,和 access token 是會過期的,而預設返回的 access token 很快便會愈期,或者用戶登出都會做成 access token 愈期。你可以使用setExtendedAccessToken() https://developers.facebook.com/docs/reference/php/facebook-setExtendedA... 拿到一個大約兩個月愈期的 token,和用戶的資料一起儲這個長度無上限的 token。

關於 apprequest

Screenshot: https://developers.facebook.com/docs/reference/dialogs/requests/ 是一個有用戶的朋友可以選取的 popup,但有一個容易被人忽略的重點:這是一個 app 的邀請,而非一個 fan page 的邀請。被邀請的用戶會在他的通知欄看到一個邀請,點擊之後會連到 app 的頁面 (app.facebook.com),而非粉絲頁,並不可以修改。這個重要的不同令這裡需要多一個跳轉的機制,由 app 頁跳到粉絲頁面。

實際的操作是如果使用者是透過通知欄跳轉,會有一個沒文檔的 URL parameters fb_source=notification ,檢測存在後使用 window.top.location.href 跳轉到粉絲頁,完全是一片混沌。

Facebook tab + mobile

最後,在移動裝置上的粉絲頁是看不到 Facebook tab 的。Facebook 提供一個選項 “mobile URL” ,但直到現在,我仍然不知道這個選項上的路徑會在什麼時候使用到。但我們仍然做了一個手機版,推廣的同事就可以對應移動裝置使用另一個 URL

Snapshot: 
Google