【发布时间】:2017-05-11 16:09:14
【问题描述】:
我们有一个 B2B 模型,我们在 Azure 中为小型企业客户的员工、合作伙伴和客户托管一个门户。这目前在我们的 node.js Web 应用程序中运行良好,但我们希望迁移到 Azure Functions 以实现大规模,这导致我们重新考虑最初的设计。
目前,进入网络应用程序的每个 XHR 请求都经过这个逻辑:
- 检索主机名对应的siteconfig文档
- 从 siteconfig 文档中检索 organization_id
- 将 organization_id 插入查询的 WHERE 子句中
我们使用节点缓存将站点配置文档存储在内存中,因此检索时间仍然非常快,只有第一次请求主机名时,我们才会连续运行两个查询。
由于 Azure Functions 不存储请求之间的状态或没有缓存,我们将无法缓存主机名/组织 ID 关系。似乎如果我们在一个函数中为每个请求运行两个 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)
以下是一些示例文档。具体来说,当一个请求进入到 portal.xyz.com/api/products 时,我们希望使用单个查询返回小部件 A 和小部件 B,而不是小工具,因为它属于不同的公司。
{
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"
}
我们不想在数据请求中依赖从客户端传入的组织 ID,这提供了内部安全性,知道 X 公司永远无法检索除他们自己以外的任何组织的数据,这在服务器上由传入的请求标头。
我想到的一个解决方案是将主机名添加到每个文档中,但这似乎是大量冗余/复制数据。
DocumentDB 专家是否愿意对此进行权衡并提供一些指导?
【问题讨论】:
-
我给您的第一个建议是通过两次往返来实现它,然后仅在您确认这不是高性能或太昂贵之后才优化到本地缓存。
-
你是说在 DocumentDB 的单个查询中确实没有办法做到这一点?
-
您可以使用您提出的方法、缓存或下面的 Fabios 其他建议。然而,这些增加了复杂性。我的意思是在你增加复杂性之前尝试直接的两次往返方法。
-
我将阅读这里的字里行间,并假设您真的想说“这在 DocumentDB 中的一个查询中是不可能的,因此您应该找到另一种方法。”
-
这就是我的意思
标签: azure azure-cosmosdb azure-functions