我們有一個B2B模型,我們在Azure爲我們的小企業客戶的員工,合作伙伴和客戶託管一個門戶。目前,我們在node.js網絡應用程序中運行良好,但我們希望轉移到大規模的Azure功能,這使我們重新思考最初的設計。在DocumentDB中分隔租戶和主機名的最佳方式是什麼?
目前,該進來的web應用程序的每個XHR請求經過這樣的邏輯:
- 得到對應的主機名
- 的siteconfig文件從siteconfig文檔檢索的organization_ID
- 插入organization_id納入查詢的WHERE子句
我們使用node-cache將siteconfig文檔存儲在內存中,因此檢索ti mes仍然非常快,只有在第一次請求主機名時,我們會連續運行兩個查詢。
由於Azure函數不會在請求之間存儲狀態或緩存,所以我們將無法緩存主機名/組織ID關係。同樣,如果我們爲每個請求在一個Function中運行兩個DocumentDB查詢,那麼我們的數據庫成本將幾乎翻倍。
所以我的問題是這樣的 - 是否有一個很好的方法來檢索這個信息在一個單一的查詢,可以加載到Azure功能?在舊世界的RDBMS我只是用一個連接或者甚至一個子查詢是這樣的:
SELECT c.name, c.price
FROM c
WHERE c.type = "product"
AND c.organization_id =
(SELECT d.organization_id FROM d WHERE d.hostname = @hostname)
這裏有以下一些樣本文檔。具體而言,當一個請求進入到我們要返回小部件和Widget b。使用一個單一的查詢,但不作爲的小工具屬於不同的公司portal.xyz.com/api/products。
{
id: "17500961",
type: "organization",
name: "XYZ inc."
}
{
id: "34903332",
type: "siteconfig",
hostname: "portal.xyz.com",
organizationid: "17500961"
}
{
id: "86785057",
type: "product",
name: "Widget A",
price: "9.99",
organizationid: "17500961"
}
{
id: "17979681",
type: "product",
name: "Widget B",
price: "14.99",
organizationid: "17500961"
}
{
id: "24669887",
type: "product",
name: "Gadget",
price: "899",
organizationid: "31514620"
}
我們不想依賴於來自客戶端的數據請求中的organizationid,這提供了內部安全明知X公司不能檢索任何組織數據,但他們自己的,因爲在確定服務器通過傳入的請求頭。
一個解決方案已經在我腦海中消失是將主機名添加到每個文件,但是,似乎是多餘/複製數據的極端金額。
請問DocumentDB專家謹慎權衡這個並提供一些指導?
我第一次給你的建議是在兩次往返的情況下實現它,然後只有在你驗證這不是高性能或太昂貴後才優化到本地高速緩存。 –
你是說在DocumentDB中的單個查詢中確實沒有辦法做到這一點? – Graham
您可以使用您建議的方法,緩存或Fabios其他建議。但是,這些增加了複雜性。我所說的只是嘗試直接前進兩次往返的方法,然後再訴諸於複雜性。 –