2013-03-23 74 views
0

我在GAE上構建了一個應用程序,當另一個用戶執行影響它們的操作時需要通知用戶。當你的朋友評論你的Facebook狀態時,一個真實的世界比喻會被警告。向用戶處理通知

我明白Channel API的工作原理是如何實時發送通知,但我試圖理解將這些通知存儲在數據存儲區中的最有效方法。理想情況下,我希望通知代碼與正在執行的實際事件分離。這是一個很好的用例Prospective Search?它並不完全正確,因爲我不需要執行任何類型的搜索,只是:如果您看到新評論,則創建一個存儲在數據存儲中並通過通道api推送到客戶端的新通知連接。我基本上需要數據庫觸發器,但我不認爲GAE支持這一點。

+0

爲什麼感覺前瞻性搜索感覺不對?其他事件必須符合什麼標準才能觸發通知?您是否可以使用標準查詢輕鬆查詢需要通知的所有用戶?如果是這樣,那麼在任務中執行該查詢。但是比較兩種方法的效率是值得的。預期的搜索查詢區域比標準查詢更靈活,所以權衡是創建文檔模式,而不是額外的工作來製作標準數據庫查詢 - – 2013-03-24 00:20:57

+0

預期的搜索對於在其他地方創建數據流數據似乎很有用。因此,如果用戶執行了搜索,那麼我們希望「保持搜索正在運行」,並在用戶查看原始結果時發送新匹配給用戶。我試圖做的更像是幾乎所有交易的副作用。 Prospective提供了很多我不需要的靈活性。另外,如果我不需要遷移,我不喜歡與GAE特定的功能綁定。 – wlindner 2013-03-24 16:37:59

回答

1

你爲什麼不想要在第一頁中將事件和通知結合起來花邊? 我認爲這可能是有趣的知道,以幫助您的使用情況:)

如果我不得不這樣做,我會啓動一個任務隊列,我寫任何可能觸發事件的數據存儲... 這樣你就可以做你的寫作,並有一個單獨的「層」來處理事件。 觸發器甚至不會是一個很好的選項,因爲您的應用程序必須「輪詢」數據庫以將事件推送到用戶的用戶界面。

我認爲你的進程(觸發事件)不屬於數據庫,因爲它可能需要數據存儲不能提供的業務規則:例如,當用戶忽略另一個時,你不應該觸發事件。 您放入數據庫系統的業務邏輯越多,維護得越複雜&規模恕我直言......

+0

我調查這個問題的次數越多,我認爲將這些事情聯繫起來就越好。我不認爲真的有辦法解決這個問題。似乎任務隊列是要走的路,以便用戶在執行操作時不必等待觸發通知。因此,更多的是這樣的:用戶執行操作,操作存儲在數據庫中,用戶完成後,操作需要通知另一個用戶,但這只是發送到任務隊列,以便通知可以在沒有原始用戶等待的情況下執行。 – wlindner 2013-03-24 16:45:00

0

看起來像GAE支持使用hooks模仿數據庫觸發器。

鉤子可以

  1. 查詢緩存
  2. 審計數據存儲活動每個用戶
  3. 模仿數據庫是有用的觸發
+0

但是,這些都在面向用戶的事務中運行,如果它們是複雜的查詢,這可能會降低用戶體驗。無論哪種方式,如果你必須做很多的通知,你會想要使用任務來實際執行通知 – 2013-03-24 00:22:36

+0

好點,使用掛鉤可能會減慢用戶體驗,我會研究任務隊列。 – wlindner 2013-03-24 16:39:45

+0

我發現數據庫鉤子並不是我想要的。他們不允許我知道放置數據存儲對象時發生了什麼變化,所以我無法發送特定類型的通知,具體取決於發生了什麼變化。 – wlindner 2013-03-24 16:46:22