假设的简化方案:
我有一个Asp.Net Core 3 API,该API接受Javascript的比萨订单。订购披萨,我在C#API中反序列化对象。我现在有一个对象“ Pizza”:
{
"name": "Margherita",
"date": "20201502",
"amount": "10"
"ingredients": ["tomato", "mozzarella"]
}
[我每天收到1亿个比萨饼订单,我需要一个实时的仪表盘来显示订单,并带有一个菜单来搜索“昨天”,“本月”,“去年”等历史数据。
我还需要在给定的时间范围内订购最多的比萨饼清单,或使用的主要配料。
使用Microsoft Azure和C#达到这种结果的最现代,最有效的方法是什么?
队列,数据工厂,湖泊,存储,流等分析服务太多,无法选择。
我可以想到两种方式:
1)
2)
我认为要走#2的路要走,但我不确定什么是最简单,最经济高效的任务的最佳“堆栈”。
我建议您考虑实施一些遵循Lambda架构的技术。基本上,这是分开的热路径和冷路径技术。这是一个很好的introduction,尽管我不会只关注James提到的技术。
[如果您遇到诸如“在5分钟的滚动窗口中订购的比萨数量”之类的问题,那么Azure Stream Analytics可以输出这些聚合的恒定流。
然后,比萨订单事件也可以存储在Blob存储中,以用于某种批处理技术。例如,每天或每小时加载一次到Azure SQL数据仓库(最近更名为Azure Synapse Analytics)。然后,您的应用可以以特殊方式运行“上个月最受欢迎的比萨馅料”之类的查询。这些热路径和冷路径技术的结合应该比尝试使用一种工具来完成所有工作更好。
另一个选择是Spark。我建议查看Azure Databricks中的Spark流。您应该能够进行流式聚合,并且还可以为较旧时间段的批处理查询加载增量表。此article可能为您提供示例。