在WPF应用程序中加载大量Azure blob数据

时间:2012-11-07 13:34:42

标签: c# .net azure azure-storage azure-storage-blobs

我已经完成了为应用程序构建原型的任务。我还没有任何代码,因为我提出的解决方案概念充其量只是臭...

问题:

该解决方案由各种Azure项目组成,这些项目可以处理存储在Azure SQL db-s中的大量数据。几乎所有发生的操作都会在blob存储中创建一个gzip压缩日志文件。这是每个日志条目的一个.gz文件。

我们还应该有一个小桌面(WPF)应用程序,它应该能够读取,过滤和排序这些日志文件。

我对日志记录的完成方式完全没有影响,因此无法更改以解决此问题。

我提出的可能的解决方案(概念上):

1

  • 连接到blob存储
  • 打开容器
  • 读取/下载blob(使用应用过滤器)
  • 解压缩.gz文件
  • 阅读并展示

问题在于,根据过滤器的不同,这可能意味着需要下载大量数据(速度很慢)和进程(这也不会非常快速)。我真的不能将其视为可用的应用程序。

2

  • 创建将运行WCF或REST服务的Web角色
  • 服务将采用过滤器参数和其他东西,并返回带有数据的单个xml / json文件,处理将在云上完成

使用这种方法,如果存在大量文件,我是否会遇到解压缩这些文件的问题(它会占用服务运行的存储/计算实例上的额外空间)。

编辑:过滤器的含义是按日期和严重性限制结果(信息,警告,错误)。 .gz文件保存在一个非常简单的结构中,我不会通过查看文件来过滤。

第3:

  • 其他一些我不知道的优雅而简单的解决方案

我还需要一些方法让应用程序实时更新显示的日志,我想这需要通过重复请求blob存储/服务来完成。


这不是那些“给我代码”的问题之一。我正在寻找有关最佳实践或类似问题的类似解决方案的建议。我也知道这可能是那些“没有正确答案”的问题之一,因为人们有不同的问题方法,但我有时间建立原型,所以我会尝试不同的东西,我会选择正确的回答,这将显示一个有效的解决方案,或者指导我朝着正确的方向发展的解决方案,即使它确实需要一些时间才能实际构建并测试它。

2 个答案:

答案 0 :(得分:1)

据我了解,您在Azure Blob存储中有一组日志文件,这些日志文件以特定方式格式化(gzip),并且您希望显示它们。

这些文件有多大?您是否在日志文件中显示每条信息?

假设这是一个日志文件,它是静态的和历史的......这意味着一旦创建了log / gzip文件就无法更改(一旦gzip文件出现在博客存储上,你就不会更新它) 。只能创建新文件......

一种解决方案


为什么不创建一个定期关闭的工作者角色/作业进程并扫描blob存储并构建一个持久的“数据库”以便您可以显示。关于这一点的好处是你没有使用解压缩/业务逻辑来提取WPF应用程序或UI中的日志文件。

1)我将使用worker角色扫描Azure Blob存储中的日志文件 2)有某种机制来跟踪哪些处理过程和当前“状态”可能是最后一个gzip文件的UTC日期 3)在worker角色中完成所有解压缩/提取日志文件的操作 4)让worker角色将内容放在SQL数据库,Azure表存储或分布式缓存中以进行访问 5)可以通过REST服务(ASP.NET Web API / Node.js等)进行访问

如果需要扩展它,可以添加更多内容,例如将其作为作业重新执行,以便在给定时间内重新执行所有日志文件(全部刷新)。我不知道你的数据大小,所以我不确定这是否可行。

关于这一点的好处是,如果您需要扩展您的工作(一夜之间),您可以启动2,3,6个工作角色...提取内容,将结果传递给服务总线或存储队列插入SQL,Cache等以进行访问。

答案 1 :(得分:1)

仅仅存储blob是不够的。您要过滤的元数据应该存储在其他易于过滤和检索所有元数据的地方。所以我认为你应该把它分成两个问题:

  

一个。如何有效地列出所有“gzips”及其元数据以及如何   我可以在这些gzips上应用过滤器,以便在我的客户端中显示它们   应用

<强>解决方案

  • Blob:列表blob很慢并且无法过滤(您可以按月或按周将容器分组或用户或......但不过滤)。
  • 表存储:非常快,但搜索速度很慢(只有PK和RK被编入索引)
  • SQL Azure:您可以创建一个包含“gzips”列表的表以及一些其他元数据(例如创建gzip的用户,时间,总大小......)。使用具有一些好索引的存储过程可以非常快速地进行搜索,但SQL Azure不是最具扩展性的解决方案
  • Lucene.NET:Windows Azure有一个AzureDirectory,可以在您的应用程序中使用Lucene.NET。这是一个超快速搜索引擎,允许您索引“文档”(元数据),这将是过滤和返回“gzips”列表的完美选择

更新:由于您只对日期和严重程度进行过滤,因此您应该查看Blob和表格选项:

  • Blob:您可以按日期+严重程度创建容器(20121107-low,20121107-medium,20121107-high ......)。假设每个数据+严重性没有太多blob,您可以直接从容器中列出blob。您可能遇到的唯一问题是用户希望查看上周(7天)内严重性较高的所有项目。这意味着您需要列出7个容器中的blob。
  • 表:即使您说表存储或数据库不是一个选项,也要考虑表存储。使用分区和行键,您可以轻松地以可扩展的方式进行过滤(您还可以使用CompareTo来获取一系列项目(例如,11月1日到7日之间的所有记录)。表中完全可以接受复制数据存储。您可以在表存储实体中包含gzip中的一些数据,以便在WPF应用程序中显示它(过滤后要显示的最重要的信息)。这意味着您只需要处理blob用户打开/双击WPF应用程序中的记录
  

B中。如何在我的应用程序中显示“gzip”(例如双击搜索结果后)

<强>解决方案

  • 从WPF应用程序连接到存储帐户,下载文件,解压缩并显示它。这意味着您需要将存储帐户存储在WPF应用程序中(或使用SAS或容器策略),如果您决定在后端更改文件的存储方式,则还需要更改WPF应用程序。
  • 连接到网络角色。此Web角色从blob存储中获取blob,将其解压缩并通过线路发送(或将其压缩以便加速传输)。如果存储文件的方式发生变化,您只需要更新Web角色