2011-05-07 29 views
4

應用程序引擎中的多租戶與名稱空間是如何工作的? 我的應用程序有多個用戶,每個用戶有點像多租戶中的租戶。 它們的URL以domain/customer/companyToken#pageName?param1 & param2開頭。 因此,從谷歌文檔,如果我想與命名空間應用多租戶,每個需要分配的NamespaceManager一個唯一的ID給每個客戶 因此,像下面的客戶 :Multitenancy如何在App Engine中使用對象化進行工作?

NamespaceManager.set(request.getServerName()); 

現在我有一個幾個問題。

  1. 具有App Engine的名稱空間的多租戶是如何工作的?

  2. 它如何改變我們訪問數據的方式?

  3. 它如何改變我們使用Objectify訪問數據的方式?

  4. 首先,我對上述應用程序的理解是,當檢索數據時,與上述客戶(租戶)有關的所有數據都聚集在同一個名稱空間中,那麼我們如何使用Objectify訪問數據更改?目前,公司obj作爲與客戶有關的所有obj的父項。 (所以在我的申請?)

非常感謝你提前。

回答

2
  1. 在數據存儲的存儲級別,名字空間只是一個APP-ID。每個名稱空間實際上都將數據存儲視爲應用數據的另一個視圖。這就是爲什麼像查詢這樣的操作不能跨越命名空間(至少現在)。即使id範圍對每個名稱空間也是不同的。

  2. 你需要知道你真的使用了哪個命名空間。例如一旦一個實體被創建,它的命名空間不會改變,所以做一個NamespaceManager.set(...)將不會影響它的鍵。與查詢對象類似。一旦創建了查詢,就會設置其名稱空間。與MemcacheService相同。因此,如果您處於調用NamespaceManager.set的習慣之中,那麼知道哪些對象具有哪些名稱空間非常重要,而不是從請求的開頭開始。

  3. 很難知道Obectify如何使用數據存儲區API,所以在一個請求中多次更改當前名稱空間需要了解Objectify如何使用數據存儲區API以確保您不會無意中在其中創建實體意外的命名空間。

  4. 通常情況下,您需要知道Objectify何時創建低級別的Key,Entity和Query對象,並確保將當前名稱空間設置爲您想要的名稱空間。如果每個請求只有一個名稱空間,那很容易。

6
  1. 谷歌的AppEngine不開源所以只有谷歌真的知道這是如何工作的內部。但有一些關於數據存儲如何在內部構建的公開數據:http://www.youtube.com/watch?v=tx5gdoNpcZM。基本上所有的AppEngine數據都在一個表中(對於所有AppEngine應用程序來說是一張表)分佈在多臺計算機上。每個實體都有唯一標識的Key(id,parent,你可以在你的應用中看到),但是也有一個數據告訴實體屬於哪個應用。這個數據是AppEngine內部的,用戶看不到它。我的猜測是,這部分還擴展到包含命名空間數據。

  2. 它沒有。數據存儲API可以識別名稱空間,因此您的代碼保持不變。它內部知道實體屬於哪個名稱空間。

  3. 客體是建立在低級別的數據存儲API之上,所以答案是一樣的2

  4. 命名空間數據間隔化:一旦你設置了命名空間,數據存儲API將只能看到下添加的實體這個命名空間。

+0

感謝偉大的答覆。我還不確定#2。那麼「內部知道一個實體屬於哪個名稱空間」真的意味着什麼?它沒有關於實體關係的任何信息(在我的情況下,公司obj是父母,和用戶的obj屬於這個公司,等等),所以,當我查詢用戶的公司照常使用物化如何命名空間識別這家公司作爲家長和屬於這家公司的用戶等?謝謝。 – Mayumi 2011-05-08 18:45:11

+1

設置一個命名空間和節省一些實體 - 現在這個單位屬於這個命名空間(因爲數據存儲API是名稱空間感知)。切換命名空間並嘗試獲取相同的實體(通過鍵) - 找不到它們。 – 2011-05-08 18:50:35

+0

基本上,名稱空間感知意味着數據存儲將名稱空間數據保存到實體鍵中。我們只是沒有看到這個,因爲它沒有通過公開的API公開。如前所述(這是視頻中的),實體鍵還包含應用程序ID(在關鍵API中也不可見) - GAE知道哪些實體屬於您的應用程序。 – 2011-05-08 18:55:46

相關問題