在服务之间共享数据

时间:2012-04-03 21:41:00

标签: c# wcf

我需要拆分我的双工服务,并希望将大型传输封装到一个服务中并从其他服务中检索。我曾经在一个服务中拥有它,但现在需要从缓冲切换到流式传输以考虑大小/内存容量。 我看过几个问题herehere,但它们已经很老了

我在服务之间使用什么IPC,一个namedPipe?

服务A 公开2个方法Guid Upload(stream)Stream Download(Guid)并使用net.tcp流,这很有效,

现在我想坚持服务B ?这会是namedPipe WCF吗?

服务C - >业务层 - >使用Guid 服务B ,检索并对项目进行计算,并保留回B

我的问题是如何使用持久性/ 服务B

从客户的角度来看

  1. 客户电话ServiceA_Proxy.Upload(someLargeItem)返回Guid
  2. 客户然后拨打ServiceC_Proxy.DoSomeWork(GuidFromCall_1)
  3. 客户然后拨打ServiceA_Proxy.Download(GuidFromCall_1)
  4. 客户端显示给最终用户

1 个答案:

答案 0 :(得分:0)

是的,只要在同一台服务器上运行通信进程,您就可以将命名管道用作 WCF绑定 。基本上,您创建WCF服务就像使用TCP / IP之类的任何其他绑定一样,但是您需要配置端点以使用netNamedPipeBinding

如果要保留/保存数据,则可以将其保存到文件甚至数据库,具体取决于您的要求。如果你只是想保留数据,直到ServiceC要求它,那么Dictionary<Guid, SomeLargeItem>就足够了。

所以你的流程看起来像:

  1. 客户端调用ServiceA_Proxy.Upload(someLargeItem)返回Guid
  2. ServiceA调用ServiceB_Proxy.Upload(GuidFromCall_1,someLargeItem)
  3. 客户端然后调用ServiceC_Proxy.DoSomeWork(GuidFromCall_1)(首先需要确保上传完成)
  4. ServiceC调用ServiceB_Proxy.Download(GuidFromCall_1)
  5. ServiceC调用DoSomeWork(GuidFromCall_1)(内部)
  6. ServiceC调用ServiceB_Proxy.Upload(GuidFromCall_1,someLargeItemProcessed)
  7. 客户端然后调用ServiceA_Proxy.Download(GuidFromCall_1)(同样,您需要确保处理已完成)
  8. ServiceA致电ServiceB_Proxy.Download(GuidFromCall_1),并返回客户。
  9. 客户端显示给最终用户
  10. 我不确定我是不是搞砸了什么。如您所见,这变得非常复杂。 您需要问问自己这是要走的路,如果以这种方式拆分您的服务真的会让它更具可扩展性吗?您计划使用NamedPipes,因此所有处理仍将在同一台计算机上。

    你应该考虑你的设计。也许将功能分成一些* .dll并直接调用它们就足够了?这样您就可以实现图层的逻辑分离。 从缓冲切换到流式传输不需要您将逻辑拆分为更多服务。

    如果您想要真正的可伸缩性,请考虑使用队列(例如 MSMQ )并为每项服务分离计算机。