保留从客户端收到的大尺寸数据,直到处理完

时间:2016-04-20 16:43:47

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

我的服务架构有以下服务:

  1. 当每个请求的字节数组为1MB时,接收请求的无状态web-api。
  2. 处理数据并将其写入Azure存储帐户的服务。
  3. 我从多个客户端收到大量数据,并且我想将其插入到一组队列(Azure Service Bus)中,以便每个服务(在2.中)在从队列接收后处理它。

    问题是我无法在队列中存储250K以上的邮件。

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

    天真的解决方案:

      

    单个实例微服务,它将数据保存在状态管理器中,只有一个引用将保存在队列中。

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

    请帮忙吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

祝你好运!