Revision of Hennessy Artistry 2013 技術回顧 from Thu, 2013-11-21 17:01

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 where facebook list user’s friends and “invite” them to join. Please note one important concept here: Facebook is sharing an app instead of sharing a page. The user being invited via apprequest will have an invitation in their notification center, and click on it will redirect him to app’s page, not a fan page. And this URL is not customizable. This important properties of apprequest introduce another need f redirecting users from app page to fan page.

So there is an un-documented fb_source=notification in URL parameters on app page if user’s referral is notification center, so developers may use window.top.location.href to redirect user from iframe back to fan page. What a mess.

Facebook tab + mobile

Last, Facebook taba are not visible on facebook mobile fan page. Facebook do provide a “mobile URL” that you can fill in, but up until now, I still do not see how that URL will be used. But we do have a mobile page, so marketers can use 2 URLs for different device.

Snapshot: 
Google