c# - 在 Azure 中使用 .Net 为大数据创建实时仪表板的最有效方法是什么?
问题描述
假设的简化场景:
我有一个 Asp.Net Core 3 API,它接受来自 Javascript 的披萨订单。订购了比萨饼,我在 C# API 中反序列化对象。我现在有一个对象“披萨”:
{
"name": "Margherita",
"date": "20201502",
"amount": "10"
"ingredients": ["tomato", "mozzarella"]
}
我每天收到 1 亿份披萨订单,我需要一个显示订单的实时仪表板,以及用于搜索“昨天”、“本月”、“去年”等历史数据的菜单。
我还需要在给定时间范围内订购最多的比萨饼列表,或使用的顶级配料。
使用 Microsoft Azure 和 C# 实现这种结果的最现代、最有效的方法是什么?
有太多的队列、数据工厂、湖泊、存储、流等分析服务可供选择。
我可以想到两种方法:
1)
- 将每个披萨订单发送到队列,例如 Service Fabric 队列、AzureStorage 队列或事件中心
- 将对象出列,暂时将它们保存在内存中
- 在内存中有 10k 或更多元素后,以这种方式聚合它们以满足将来的查询并将它们保存到 CosmosDB,而不是保存每个订单
- 这在未来的查询中 CPU 效率低且有限,但节省了存储成本,因为没有存储单个对象,而只是聚合数据
2)
- 将每个比萨饼发送到事件中心或流分析等队列
- 将每个对象保存到“大数据”存储中
- 使用 Azure 上的 Apache Spark 或类似工具来查询数据
- 创建一个工作角色,每分钟查询数据集并使用例如“日期”作为 PartitionKey 创建单个聚合记录以显示在仪表板中
- 不确定删除数据以节省存储成本是否有意义
我认为#2是要走的路,但我还没有决定什么是最简单且具有成本效益的任务的最佳“堆栈”。
解决方案
我建议您考虑实现一些遵循 Lambda 架构的技术。基本上这是分开的热路径和冷路径技术。这是一个很好的介绍,尽管我不会只关注 James 提到的技术。
如果您有一些常规查询,例如“在滚动 5 分钟窗口中订购的比萨饼数量”,则 Azure 流分析可以输出这些聚合的恒定流。
然后,披萨订单事件也可以存档在 Blob 存储中,以便摄取到某些批处理技术中。例如,每天或每小时加载一次 Azure SQL 数据仓库(最近更名为 Azure Synapse Analytics)。然后,您的应用程序可以以特别的方式运行诸如“上个月最受欢迎的披萨配料”之类的查询。这些热路径和冷路径技术的组合应该比试图让一个工具来做所有事情更好。
另一种选择是 Spark。我建议在 Azure Databricks 中查看 Spark 流。您应该能够进行流式聚合,并且还可以为旧时间段的批量查询加载 Delta 表。这篇文章可能会给你一个例子。