我正在开发一个程序,该程序将有多个线程需要来自Web服务的信息,该服务可以处理以下请求:
“为[Var1, Var2, Var3]
”
[Object1, Object2, ... Object20]
并且得到的回复将给出一个,在这种情况下,20个节点的XML(每个对象一个),每个节点有3个子节点(每个var一个)。
我的挑战是,这个网络服务的每个请求都要花费组织资金,无论是1个对象的1个变量还是20个对象的20个变量,成本是相同的。
所以,就是这样,我正在寻找一种架构:
目前,我的想法是使用NetMQ这样的库,我的中间层作为服务器,每个线程作为一个轮询器,但是我在实际的实现上陷入困境,在走得太远之前在兔子洞里面,我希望已经有一个设计模式/库,这比我想象的更有效率。
请理解我是菜鸟,所以,任何帮助/指导都会非常感激!!
感谢!!!
答案 0 :(得分:2)
从架构的角度来看,您只是勾勒出一个解决问题的好方法:
您可能找不到与您的要求完全匹配的现成产品或框架。但是,您可以使用几种框架/架构模式来构建解决方案。
如果您想使用C#,可以使用reactive extensions来获取时间和分组权限。
然后,您可以使用LINQ从构建响应的请求中选择属性,并选择响应队列中与响应的某个部分匹配或超时的请求。
您可以使用多个演员将解决方案建模为演员系统:
演员系统可以轻松处理并发并以可测试的方式分离关注点。
使用Scala时,您可以使用其“monadic”集合API(filter
,map
,flatMap
)与C#方法中的LINQ基本相同。
当您想要测试单个元素时,actor方法真的很棒。这很简单to test each actor individually,无需模拟整个工作流程。
这类似于Akka方法,只是使用不同的(功能!)语言。 Erlang / Elixir对分布式actor系统有很多支持,所以当你需要一个超稳定或可扩展的解决方案时,你应该研究一下。
这可能是太低的水平,并导致很少的基础设施。当您使用actor系统时,您可以尝试将NetMQ / ZeroMQ作为传输系统。
答案 1 :(得分:1)
您使用队列的想法对我来说很好。
这是解决您问题的一种可能方案,我确信无数其他解决方案可以满足您的需求。
长(呃)版本:
让您的“中间层”收听队列(客户端向其发布消息)并聚合请求,直到N个请求通过或X时间已过。
您已准备就绪,将聚合请求卸载到线程以调用您的服务器场并获取结果。当您需要将此信息传达给客户时,最有可能出现更大的问题。
为此,您可能需要所有客户端订阅的另一个队列,并且一旦您的结果批处理准备就绪(例如,XML中的20个响应),调用服务器场的线程就会将XML结果分成相应的请求/响应对并发布到此队列。每个客户端都需要从队列中获取正确的请求/响应对并进行处理。
这不是传统意义上的网络服务,因为等待时间可能过长而你不想保持连接,这就是我建议队列的原因。
您还可以让您的消费者队列基于主题,这意味着您只需将req / res对发布给要求它的消费者,而不是广播它(因此客户端不必“选择正确的req / res“。将根据主题名称进行处理。几乎所有队列都支持这一点。