【问题标题】:Keep big sized data received from clients until processed保留从客户端接收到的大数据直到处理
【发布时间】:2016-04-21 01:49:06
【问题描述】:

我有具有以下服务的服务结构:

  1. 当每个请求的字节数组为 1MB 时,接收请求的无状态 web-api。
  2. 处理数据并将其写入 Azure 存储帐户的服务。

我从多个客户端接收到大量数据,我想将其插入一组队列(Azure 服务总线),以便每个服务(在 2.中)在从队列中接收到数据后对其进行处理。

问题是我无法在队列中存储超过 250K 的消息。

在这些 1MB 数据块被处理并保存在 Azure 的存储帐户中之前,存储这些数据块的最佳做法是什么?

天真的解决方案:

将数据保存在状态管理器中的单实例微服务,并且只会将引用保存在队列中。

这个解决方案打破了微服务架构,因为它不可扩展。

请帮忙?

【问题讨论】:

  • 为什么不直接从 Web API 写入 Azure 存储?
  • 我有 X 个微服务……它们不能在请求到达时都处理 web-api 请求。我不希望客户端超时,所以我将请求存储在一个队列中,这样当 X 服务有空闲处理它时,它就会被处理。
  • 是的,但为什么您认为将 1MB 发送到队列比将其存储到 Azure Blob 更快?
  • 状态管理器队列?大概。服务总线队列?也许。我需要最快的数据存储,直到我能够处理它。

标签: c# azure servicebus azure-service-fabric


【解决方案1】:

我同意 Mikhail 的观点,即从 Web API 层将每个请求写入 blob 存储是正确的解决方案。然后,您将对 blob 的引用进行排队,您的第二层服务实例会将这些引用出列并依次处理每个 blob。

这是分布式系统中相当常见的模式……每个 1 MB 的 blob 存储请求都会产生成本,但没有免费的午餐。除非您想直接在 Web 层中进行请求处理,否则您需要将请求数据保存在某处。听起来您已经决定不在 Web 层进行处理...这通常是个好建议,但这取决于处理的性质、您预期的请求量、VM 功能等。

我不喜欢在 Service Fabric 中使用有状态参与者/服务来保存 1 MB 请求负载的想法,因为一个简单的事实是,随着请求数量(和所需 RAM)的增长,扩展集群会变得很昂贵。考虑在整个集群中可靠地复制该 1 MB 状态(或避免复制并等待不可避免的问题),相对于其他选项,这几乎肯定是一个坏主意。

祝你好运!

【讨论】:

  • 所以你建议我将数据块写入存储帐户,将引用排队,当我想将块添加到不同存储帐户上的不同 blob 时,我将加载数据到内存。将其写入 blob 并从存储帐户中删除块?我必须将每个块写入存储帐户两次。
  • 您可以使用 AzCopy 实用程序azure.microsoft.com/en-us/documentation/articles/…从 blob 到 blob 高效地复制
  • 我需要复制 blob-to-block-in-blob 而不是 blob-to-entire-blob,因为我收到了 1MB 的 blob 块。
  • 从“临时存储”中的块构建 blob 正是我在“真实存储”中所做的。所以,我将直接处理请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多