【问题标题】:loading lots of Azure blob data in a WPF app在 WPF 应用程序中加载大量 Azure blob 数据
【发布时间】:2012-10-27 13:51:00
【问题描述】:

我的任务是为应用构建原型。我还没有任何代码,因为我提出的解决方案概念充其量看起来很臭......

问题:

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

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

我对如何完成日志记录的影响绝对为 0,因此无法更改以解决此问题。

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

1:

  • 连接到 Blob 存储
  • 打开容器
  • 读取/下载 Blob(使用过滤器)
  • 解压 .gz 文件
  • 读取和显示

问题在于,根据过滤器的不同,这可能意味着需要下载大量数据(速度很慢)和处理(也不会很快速)。我真的不认为这是一个可用的应用程序。

2:

  • 创建一个将运行 WCF 或 REST 服务的 Web 角色
  • 服务将获取过滤器参数和其他内容并返回包含数据的单个 xml/json 文件,处理将在云端完成

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

编辑:我所说的过滤器是指按日期和严重性(信息、警告、错误)限制结果。 .gz 文件保存在一个结构中,这使得这很容易,我不会通过查看文件本身来过滤。

3:

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

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


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

【问题讨论】:

  • 我不清楚。 “每个日志条目一个 .gz 文件” 有一个主日志吗?如果您要通过不查看这些 .gz 文件进行过滤,那么您如何过滤?
  • 应用程序将调用类似 Logger.Log(severity, "message") 的东西。对于这些调用中的每一个,都会创建一个新文件,其文件名类似于“severity-date.gz”(名称中还有一些数据,但在这种情况下无关紧要)。
  • 我还是不清楚。您是说仅基于 .gz 文件名进行过滤吗?所以你无法控制 Logger 应用程序?您是否可以控制对 Logger.Log 的调用?
  • Logger 是创建日志的类,这是一个相当大的解决方案,因此更改记录器不是一种选择。 WPF 应用程序只会读取这些,是的,它将仅基于文件名进行过滤。无需按实际内容进行过滤。
  • 好的,这澄清了前两个问题。但是第3个。您是否可以控制对 Logger.Log 的调用? “The”应用程序将调用..“The”是您控制的应用程序,您可以包装对 Logger.Log 的调用吗?

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


【解决方案1】:

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

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

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

一个解决方案


为什么不创建一个工作人员角色/作业进程,它会定期退出并扫描 blob 存储并构建一个持久的“数据库”,以便您可以显示。这样做的好处是您没有将解压缩/业务逻辑用于在 WPF 应用程序或 UI 中提取日志文件。

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

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

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

【讨论】:

  • 是的,对于云应用程序中发生的每个日志条目,我都有一个 gzip 文件。虽然我喜欢拥有一个数据库并访问它的想法,但我认为目前这不是一个可行的解决方案。此外,应用程序中的日志必须是最新的,所以如果这个工作角色每天运行并填充数据库一到两次,我仍然会在客户端中获得陈旧的数据。
  • 如果您需要,工作者角色可以每 1 秒 ping/查找更新并更新 SQL 表/Azure 存储。这几乎可以实时处理它。我怀疑您的应用程序每秒都在创建日志文件压缩包。请记住,从 UI 应用程序访问日志,您将产生交易成本......此外,它极大地限制了您的解决方案可扩展性以显示原始日志文件(想象一下想要按时进行查询或跨多个日志文件进行某些事情......你要做什么?实时解压10个日志文件,处理查询并渲染UI?)。
  • 事实证明,将日志数据保存到数据库中的工作角色也是一种选择,虽然不是第一种选择,所以这里是 +1。
【解决方案2】:

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

A.如何有效地列出所有“gzip”及其元数据以及如何 我可以对这些 gzip 应用过滤器以便在我的客户端中显示它们吗 应用。

解决方案

  • Blob:列出 Blob 的速度很慢,并且无法进行过滤(您可以每月或每周或用户或用户在容器中分组......但这不是过滤)。
  • 表存储:非常快,但搜索速度很慢(仅索引 PK 和 RK)
  • SQL Azure:您可以创建一个表,其中包含“gzip”列表以及一些其他元数据(例如创建 gzip 的用户、时间、总大小......)。使用具有一些良好索引的存储过程可以使搜索速度非常快,但 SQL Azure 并不是最具可扩展性的解决方案
  • Lucene.NET:有一个适用于 Windows Azure 的 AzureDirectory,这使得在您的应用程序中使用 Lucene.NET 成为可能。这是一个超级快速的搜索引擎,可让您索引您的“文档”(元数据),非常适合过滤和返回“gzip”列表

更新:由于您只过滤日期和严重性,您应该查看 Blob 和 Table 选项:

  • 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 角色

【讨论】:

  • 好吧,“过滤器”可能是一个错误的术语,但我会按日期和日志级别(信息、警告、错误)限制结果,我将编辑问题以明确这一点. blob 文件的结构方式应该不会造成太大问题。正如我对 Bart Czernicki 的回答,数据库(表或 SQL)可能不是一个选项。至于第二部分,我希望能够在列表本身上显示一些数据,而不仅仅是在选择一个 blob 时。顺便说一句,这里为 lucene +1。我有点喜欢这个主意,一定会考虑的。
  • 经过深思熟虑,如果我按日期和严重性过滤,我真的需要 lucene,这基本上只是按预期构造文件名并检查它是否存在。
猜你喜欢
  • 2023-03-03
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多