想象一个社交网络应用程序。用户关注其他用户,用户拍照。照片有其他用户的标签。
我正在尝试为该应用程序获取图形的有效 Cosmos db 实现。我提供了一个 SQL Server 版本以及一个基准。
这是它的表格版本:
这是 Gremlin 查询:
g.V('c39f435b-350e-4d08-a7b6-dfcadbe4e9c5')
.out('follows').as('name')
.out('took').order(local).by('postedAt', decr).as('id', 'postedAt')
.select('id', 'name', 'postedAt').by(id).by('name').by('postedAt')
.limit(10)
这是等效的 SQL 查询(实际上是 linq):
Follows
.Where(f => f.FollowerId == "c39f435b-350e-4d08-a7b6-dfcadbe4e9c5")
.Select(f => f.Followees)
.SelectMany(f => f.Photos)
.OrderByDescending(f => f.PostedAt)
.Select(f => new { f.User.Name, f.Id, f.PostedAt})
.Take(10)
该用户关注了 136 个用户,他们总共拍摄了 257 张照片。
SQL Server 和 Cosmos db 都位于西欧 Azure 位置。我在法国。我在 Linpad 上做了一些测试。
- Gremlin Query 运行时间超过 1.20 秒,消耗大约 330 RU。仅供参考,400RU/s 的费用为 20 美元/月。
- SQL 查询在 70 毫秒内运行。db 为 10 DTU(S0 的 1 个实例)。所以它的成本是 12.65eur / 月
如何使用 cosmos db 更快、更便宜地获取 feed?
注意:为了收取 RU 费用,我使用的是Microsoft.Azure.Graph
. 但我也可以使用Gremlin.Net
并获得类似的结果。