C# 这种体系结构是好是坏:多个WCF服务通过单个静态对象相互通信吗?

C# 这种体系结构是好是坏:多个WCF服务通过单个静态对象相互通信吗?,c#,.net,multithreading,wcf,architecture,C#,.net,Multithreading,Wcf,Architecture,我自己的一点背景:我通常从事一些小项目,这些项目不需要重大的体系结构或扩展问题(例如使用web表单和MVC开发小型web应用程序) 我的工作内容:我现在正在构建一组WCF应用程序(一种在“请求者”客户机和“响应者”客户机之间路由消息的WCF服务),这些应用程序需要稳定、可扩展且明显响应 我在做什么:我有一个“代理服务”运行两个端点,一个用于请求者客户端,另一个用于响应者客户端。除了ConcurrencyMode被设置为可重入外,每个服务和客户机基本上都使用WCF默认值运行 //Client [C

我自己的一点背景:我通常从事一些小项目,这些项目不需要重大的体系结构或扩展问题(例如使用web表单和MVC开发小型web应用程序)

我的工作内容:我现在正在构建一组WCF应用程序(一种在“请求者”客户机和“响应者”客户机之间路由消息的WCF服务),这些应用程序需要稳定、可扩展且明显响应

我在做什么:我有一个“代理服务”运行两个端点,一个用于请求者客户端,另一个用于响应者客户端。除了ConcurrencyMode被设置为可重入外,每个服务和客户机基本上都使用WCF默认值运行

//Client
[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]

//Service
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Reentrant)]
当然,每个服务实例(PerSession)彼此独立,不能相互通信。因此,为了在它们之间建立一个桥梁,我有一个名为MessageBroker的类,它带有服务访问的单例实例。代理将请求从请求者服务路由到响应者服务,并以相同的方式将响应路由回

我关心的是让这一个对象/实例路由整个系统的所有消息以及它对性能的影响。现在,每个客户端都在使用我添加服务引用时定义的预定义*异步方法调用各自的Send*方法,并且客户端上的回调正在使用事件委托的Begin/End invoke方法触发事件。除此之外,目前所有方法都是同步调用的。我正在考虑以使用代理中委托的Begin/End invoke方法的形式添加更多的多线程处理(我还有一个关于使用此方法在线程池中耗尽线程的问题)

由于我对整个设计/架构概念还不熟悉,我想知道我所做的是正确的选择,还是应该考虑实现一个不同的架构(这是我提出的第一个,也是最明显的一个)

我真的没有一位导师能在当地提出想法,所以我希望社区能提供一些指导


感谢您的建议、建议或批评。:)

这种类型的问题正是构建BizTalk要解决的问题。你可以调查,要么把它带进来,要么模仿它的行为

简而言之,它通过执行以下操作来工作:
1.消息来自请求者。
2.它将消息保存到数据库中。
3.它通过将消息路由到适当的目的地来处理消息。(具有沿途转换信息的能力)。
4.它会再次保存消息状态。
4.当目的地响应时,它保存结果并将其转发给请求者

基本上,Biztalk不是单例,而是通过利用数据库后端精确存储消息的位置来维护状态。把它看成一台状态机。如果biztalk get重新启动或在某个位置失去连接,它可以轻松返回到消息管道中的确切位置。因此,任何线程都可以处理消息状态的任何更改;这使得它非常健壮


以上是Biztalk功能的一个非常简化的版本。此外,还有其他具有类似行为的消息传递系统。您可能希望在开始构建自己的解决方案之前进行一些研究。我个人认为Biztalk相当昂贵。但我的经验是,它坚如磐石,成本比让开发人员(或团队)尝试并模仿它的功能要低得多。

如果您希望您的服务能够扩展,您需要使参与者之间的链接松散耦合。这意味着异步排队消息传递。之所以必须这样做,原因不计其数,主要是为了:

  • 在负载中经受住尖峰
  • 扩大而不是扩大
  • 管理服务可用性停机时间(在您端和服务客户端)
WCF支持通过MSMQ进行排队消息传递,但您必须忘记关于基于HTTP的服务模型的一切,从基于消息的范例开始。此外,您还需要解决在客户端位置部署的MSMQ队列之间进行身份验证和路由的问题(这不是一个简单的问题)

您还可以考虑提供消息传递基础设施的服务,如


最后,如果您的后端是基于SQL Server的端到端,那么您可以直接从数据库使用异步消息传递:。

成本是我们动机的一部分,另一个是可部署性。我们将有三个部分:经纪人服务;将托管在托管服务器(请求者客户端)上;将是访问服务的网站、电话应用程序或桌面应用程序,以及响应者客户端;wcf客户端位于客户端网络上,它为我们提供了一个将其数据连接到中心服务器的桥梁,这样他们就可以从中心网站访问其数据,而不是在每台需要访问数据的机器上安装客户端。这第三部分是我选择WCF的主要动机。听起来我可以利用数据库来存储“消息”(请求和响应),也可以利用windows消息队列本身(我觉得很难管理,但我可能错了)。我将按照您的建议调查BizTalk,但我认为我们系统的关键部分,即“内部”响应客户端,使用BizTalk不会便宜(可能也不容易)。感谢您的建议。BizTalk是一个很好的产品,但是它非常昂贵,部署和管理起来可能会很繁琐,并且对于一个应用程序来说可能不实用,除非该应用程序能够显著增加您组织的收入。我们是一家小公司,但有问题的产品将