我正在开发一个程序,该程序将具有多个线程,这些线程需要来自可处理诸如以下请求的Web服务的信息:
“给我[Var1, Var2, Var3]作为[Object1, Object2, ... Object20]

在这种情况下,得到的答复将为我提供20个节点的XML(每个对象一个),每个节点具有3个子节点(每个var一个)。

我的挑战是,对此Web服务提出的每个请求都要花费组织金钱,并且无论是1对象1 var还是20对象20 var,成本都是相同的。

因此,既然如此,我正在寻找一种架构,该架构将:

  • 由于需要数据,请在每个线程上创建一个请求
  • 有一个中间层的“聚合器”,可以获取所有请求
  • 一旦汇总了X个请求(或达到了时间限制),则中间层将对Web服务
  • 执行单个请求
  • 中间层收到Web服务
  • 的回复
  • 中间层将信息路由回等待的对象

  • 目前,我的想法是使用像NetMQ这样的库,中间层作为服务器,每个线程作为轮询器,但是我陷入了实际的实现过程中,并且在深入探讨之前,希望那里已经有一个设计模式/库,它比我想象的要有效得多。

    请理解我是菜鸟,因此,非常感谢您的任何帮助/指导!!

    谢谢!!!

    最佳答案

    概述

    从体系结构的角度来看,您刚刚勾勒出解决该问题的好方法:

  • 在请求的应用程序和远程Web服务
  • 之间插入代理
  • 在代理中,将请求放入请求队列,直到至少发生以下事件之一
  • 请求队列达到给定长度
  • 请求队列中最旧的请求已达到一定年龄
  • 将一个请求中的所有请求分组到一个请求中,删除重复的对象或属性
  • 将此请求发送到远程Web服务
  • 将请求移入(等待)响应队列
  • 等待响应,直到出现以下情况之一
  • 响应队列中最旧的请求达到一定期限(超时)
  • 响应到达
  • 获取响应(如果适用)并将其映射到响应队列
  • 中的相应请求
  • 回答响应队列中所有具有答案
  • 的请求
  • 为所有超过超时限制的请求发送超时错误
  • 从响应队列
  • 中删除所有已回答的请求

    技术

    您可能找不到符合您需求的现成产品或框架。但是,您可以使用几种框架/体系结构模式来构建解决方案。

    C#:RX和LINQ

    当您想使用C#时,可以使用reactive extensions来获取时间和正确的分组。

    然后,您可以使用LINQ从请求中选择属性以构建响应,并在响应队列中选择与响应的某个部分匹配或超时的请求。

    Scala/Java:Akka

    您可以使用多个参与者将解决方案建模为参与者系统:
  • 一个 Actor ,作为请求
  • 的网关
  • 持有请求队列的 Actor
  • 一个参与者将请求发送到远程Web服务并将响应返回给
  • 持有响应队列的 Actor
  • 发送响应或超时的 Actor

  • 使用参与者系统可以轻松处理并发并以可测试的方式分离问题。

    使用Scala时,您可以使用其“monadic”集合API(filtermapflatMap)与在C#方法中使用LINQ基本上相同。

    当您要测试各个元素时,actor方法确实很出色。这很容易to test each actor individually,而不必模拟整个工作流程。

    Erlang/Elixir: Actor 系统

    这与Akka方法类似,只是使用了不同的(功能!)语言。 Erlang/Elixir对分布式actor系统提供了很多支持,因此当您需要超稳定或可扩展的解决方案时,应考虑使用这一解决方案。

    NetMQ/ZeroMQ

    这可能是太低的级别,并且几乎没有基础架构。使用actor系统时,可以尝试引入NetMQ/ZeroMQ作为传输系统。

    09-10 14:30
    查看更多