2012-07-06 18 views
0

我最近觀看了一些Google開發人員在性能和安全性方面呈現GWT的Google I/O視頻。在該視頻的揚聲器使得幾個GWT-主義提到:GWT:批處理vs一次性vs無狀態

  • 客戶端請求 「配料」
  • 「一次性使用」
  • 追求GWT應用 「無國籍」

關於「批處理」,似乎GWT可以配置爲排隊服務器端RPC調用,並一次全部發送(而不是許多微小的,性能受阻的調用)。不幸的是,我只是沒有通過這裏的樹木看到森林:doe GWT爲你處理配料,還是你必須編寫執行捆綁/配料的邏輯?如果您必須這樣做,可以/應該捆綁哪些類型的電話?你怎麼知道什麼時候開始批量生產?

在GWT的行話,這是什麼意思時,有人說:

  • 「客戶端和服務器都是一次性的」;但
  • 「意見」不是一次性的

如何「配料」和「一次性使用」的概念涉及到GWT應用「無國籍」。 (?!?!):通過,揚聲器定義無國籍作爲

  • 瀏覽器體現了會議
  • 服務器是無狀態 - 除了緩存
  • 客戶從來沒有注意到一個(?!?!)重新啓動(?!?!)

如果有人能夠幫助我給出具體的理解這三個項目以及它們如何相互關聯,我想我會開始「得到gwt」。提前致謝!

回答

4

doe GWT爲您處理批處理,還是您必須編寫執行此捆綁/批處理的邏輯?如果您必須這樣做,可以/應該捆綁哪些類型的電話?你怎麼知道什麼時候開始批量生產?

GWT-RPC沒有配料機制。您可以(相對)輕鬆地添加一些,方法是在列表中排列「命令」,然後將列表作爲單個GWT-RPC調用發送。有些項目應該以最小的努力爲你做到這一點(例如GWT平臺)。

另一方面,RequestFactory具有內置批處理:您創建一個RequestContext實例並對其進行批處理調用,直到您fire()它。

「客戶端和服務器是一次性的」;「但「意見」不是一次性的

首先是有關無國籍(並且,例如,與AppEngine上,你不要當創建一個新的服務器實例,關機或重新啓動控制:服務器可以消失,所以不要在內存中保留狀態)。第二個是關於性能:在瀏覽器中與DOM有關的所有東西都是slow,所以構建一個新視圖(堆疊在一起的小部件)是重量級的(儘管Cell小部件很少)。因此,你不要想要使他們一次性,即拋棄他們時不時。您寧願要保留一個視圖實例,以便在應用程序的整個生命週期中重用。
與「可處置性」不完全相同的概念。

瀏覽器體現了會話(?!?!)

GWT是建立在單頁的應用程序。你可以在你的應用程序中簡單地在變量中存儲狀態;你不需要cookies或任何有狀態共享

服務器是無狀態 - 除了緩存

在服務器上存儲會話狀態有(國家必須 - 尤其如果服務器是一次性被持久化成本(?!?!) - ,服務器之間共享 - 當你有一個集羣/在雲中運行時等等,你將花費盡可能多的資源來保持會話狀態的存在性,而不是像實際的業務邏輯那樣)。

客戶從來沒有注意到重啓(?!?!)

HTTP是一個斷開連接的協議。如果服務器重新啓動,客戶端不會知道它,它不應該知道它。

如果有人能幫助我具體理解這三個項目以及它們如何相互關聯,我想我會開始「得到gwt」。

它不是越來越GWT,它是關於獲取網絡獲得單頁面的Web程序,以及如何規模他們。
無論它們是在客戶端使用GWT還是jQuery製作,而服務器端使用Java或Python或.NET並不重要。

閱讀關於REST,它總結了一切。

+0

謝謝你這麼好的回答(+1)!有一件事我仍然不明白:聽起來像使用RequestFactory進行批處理是一條路 - 但我仍然是負責'fire()'的批處理,是的?如果是這樣的話,那麼我怎麼知道什麼時候它是最佳的'fire()'?再次感謝! – IAmYourFaja 2012-07-06 18:57:36

+0

要回答的問題是_do我現在需要這些數據還是可以稍等一下?_如果您可以稍等一下,那麼不要'fire()'。在任何情況下,你都不應該在每個_event循環(''RequestBatcher''可以在這裏幫助)多次觸發()。但有一些例外:你知道的東西需要時間在服務器上,或許不應該與其他東西一起進行批處理,因爲它會減慢一切(響應也是一批)。唯一的_real_答案是_measure_(以及使用什麼是最好的),但是在發生火災時需要batch_和__,但判斷通常足以開始。 – 2012-07-06 19:09:37