WCF“全球协调员”

本文关键字:全球协调员 协调员 WCF | 更新日期: 2023-09-27 17:49:27

我正在使用WCF在c#中实现Web服务。我们的目标是创建一种服务,让用户能够在"事务"中从服务器写入或读取文件。写入的示例场景:

  1. 用户打开事务(向服务器发送打开请求)
  2. 用户发送带有文件名和内容的请求来写文件
  3. …其他读写操作…
  4. 用户结束事务并在服务器中进行更改(提交)。

由于它是已经存在的小型分布式系统的一部分,我必须使用JSON并通过HTTP发送它,并且它不能更改。

根据客户端生成的ID (UUID)来区分事务。事务具有有限的最大空闲时间。当事务打开时,它一直存在,直到达到超时或客户端完成事务。事务中的每个新操作都应该重置超时计数器。每次客户端想要写入文件时,该文件都会在事务存在的时间内被阻塞。如果文件已经被其他事务阻塞,则请求等待一段时间才能打开文件。如果打开,则继续操作,否则将回滚整个事务。

我使用以下配置:

  • 为了接收和发送JSON,我为我的服务端点设置了binding="webHttpBinding"
  • 为了存储全局数据(即关于阻塞文件或打开的事务),并同时为多个客户端提供服务,我使用单实例模式和多并发模式:[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Multiple)]
我IService.cs

:

namespace WcfJsonRestService
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(Method = "POST",
                   RequestFormat = WebMessageFormat.Json,
                   ResponseFormat = WebMessageFormat.Json,
                   BodyStyle = WebMessageBodyStyle.Bare,
                   UriTemplate = "/data")]
        Response handleRequest(TransactionRequest tRequest);
    }
    [DataContract]
    public class TransactionRequest
    {
        [DataMember]
        public string action { get; set; }
        [DataMember]
        public RequestData data { get; set; }
    }
    [DataContract]
    public class RequestData
    {
        [DataMember]
        public string client_name { get; set; }
        [DataMember]
        public string transactionId { get; set; }
        [DataMember]
        public string file { get; set; }
        [DataMember]
        public string content { get; set; }
    }
}

我想有一些像"全局协调器"/主线程/处理程序,一直工作,以管理打开的事务和阻塞的文件。我需要在我的服务中使用以下函数:

  • 添加新交易
  • 检查给定ID的交易是否已打开/是否存在于已打开的交易列表
  • 在超时后删除事务
  • 重置事务超时计数器
  • +对被阻塞的文件类似。

我不知道如何实现这样的协调线程/服务在后台工作。它将解决在服务类中管理多个线程的问题。我考虑过另一种服务,它可以存储有关事务、被阻止的文件及其超时的信息,并具有获取或重置它们的功能,但它会使通信增加一倍,并降低我的服务的可靠性。

问题:如何引入后台线程/服务来管理我的服务状态,如阻塞文件或打开事务?

WCF“全球协调员”

您似乎认为"协调器"是在后台运行并管理一切的代理。该代理可以按照您的建议实现为线程。请求将进入该代理,得到服务并得到响应。

没有必要有这样一个代理/线程。当请求进入时,您可以在WCF线程上执行所有必要的处理。当然,你需要同步访问所有共享的可变数据结构。

如果您只是使用全局锁,这将相当于您提出的基于代理的解决方案,但更简单。

如果您需要基于时间的触发(可能是过期),请使用计时器。