【问题标题】:share data status on different instances of WCF在不同的 WCF 实例上共享数据状态
【发布时间】:2014-08-13 05:42:53
【问题描述】:

我有两台带有 WCF 服务的服务器(以后可能会更多),都位于负载均衡器后面。多个 IS 服务器(也是负载均衡)中的客户端应用程序调用 WCF 执行一些操作,比如说保存。 相同的数据,比如说客户信息,可以同时被多个用户打开。 然后,可以同时从多个用户执行 Save 操作,并且调用将转到不同的 WCF 服务器。

我希望当用户从 UI 调用 Save 时,并且已经从另一个 UI 对相同的客户端数据进行了 Save,那么第二个用户会收到有关它的警报。 为此,所有 WCF 实例都应该知道在其他实例中执行的操作。

那么如何在所有 WCF 服务器实例之间同步数据状态? 我不想分享数据,只是数据的一些状态(打开,保存中,类似的)

请指教,谢谢,

我正在使用 c#/.NET4

添加:WCF 实际上托管在 Windows 服务中。

【问题讨论】:

  • 你能发布代码示例吗?这个问题有点太宽泛了,部分问题,比如确保它只保存一次可以使用异步进程解决,也许使用命令模式和消息总线..
  • 好吧,我认为代码示例在这里并不重要,问题更多在于要设置的体系结构。消息总线已经讨论过了,似乎其他团队成员更愿意避免使用中间件层,我们正在寻找其他可能的方法。
  • 您可以使用某种集中式锁定系统和诸如 SignalR 之类的东西来提醒其他查看者相同的数据正在被更改/保存。
  • SignalR 已经讨论过作为通知机制。但在同步部分仍然不清楚。
  • 您可能需要为该部分提供一些代码示例或更多信息。我不确定是否有足够的余地,因为默认情况下 WCF 服务应该是无状态的。

标签: c# asp.net .net wcf


【解决方案1】:

您遇到的问题是资源管理问题之一。

您正在尝试解决一种方法,如何让您的服务客户端以某种方式都知道彼此对服务内部状态的打开句柄,然后强制他们进行协调以处理此问题。

从长远来看,将这一责任推给您的客户会使事情变得更加复杂。理想情况下,客户应该能够以尽可能直接的方式调用您的服务,而无需了解可能正在使用该服务的任何其他客户。如果呼叫不成功,最多应该期望客户端重试。

通常您会通过使用锁定来处理这些情况 - 客户端可以同时提交更改,并且除一个之外的所有客户端都必须根据引发的某些异常或发回的特定响应(可能包括更新的 ClientInformation 对象)重试,具体取决于如何你处理它。

如果你绝对必须实现这个通知的东西,那么你可以考虑使用 WCF duplex bindings,由此你的服务公开一个回调合约,允许客户端注册一个通知处理程序,该处理程序可用于向所有人发送通知与发出请求的通道不同的客户端。然而,这些设置起来最复杂,并且不能很好地扩展。

编辑

在回复您的评论时,您的另一半问题是关于在负载平衡服务端点之间共享状态。

负载平衡 wcf 就像负载平衡网站一样 - 如果您需要在它们之间共享状态,您必须配置一些所有服务都可以访问的后备数据存储。

在您的情况下,显而易见的地方是数据库。您只需要确保在您的服务代码中捕获和处理与并发/死锁相关的问题(使用 NHibernate 之类的东西来持久化数据可以帮助解决这个问题)。我只是看不出你在这里有真正的问题。

【讨论】:

  • 客户端服务更新没问题。但是服务服务更新呢?我没有看到不同的 wcf 实例如何在您的答案中进行通信和更新状态。请告诉我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多