WCF“全球协调员”
本文关键字:全球协调员 协调员 WCF | 更新日期: 2023-09-27 17:49:27
我正在使用WCF在c#中实现Web服务。我们的目标是创建一种服务,让用户能够在"事务"中从服务器写入或读取文件。写入的示例场景:
- 用户打开事务(向服务器发送打开请求)
- 用户发送带有文件名和内容的请求来写文件
- …其他读写操作…
- 用户结束事务并在服务器中进行更改(提交)。
由于它是已经存在的小型分布式系统的一部分,我必须使用JSON并通过HTTP发送它,并且它不能更改。
根据客户端生成的ID (UUID)来区分事务。事务具有有限的最大空闲时间。当事务打开时,它一直存在,直到达到超时或客户端完成事务。事务中的每个新操作都应该重置超时计数器。每次客户端想要写入文件时,该文件都会在事务存在的时间内被阻塞。如果文件已经被其他事务阻塞,则请求等待一段时间才能打开文件。如果打开,则继续操作,否则将回滚整个事务。
我使用以下配置:
- 为了接收和发送JSON,我为我的服务端点设置了
binding="webHttpBinding"
。 - 为了存储全局数据(即关于阻塞文件或打开的事务),并同时为多个客户端提供服务,我使用单实例模式和多并发模式:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Multiple)]
:
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线程上执行所有必要的处理。当然,你需要同步访问所有共享的可变数据结构。
如果您只是使用全局锁,这将相当于您提出的基于代理的解决方案,但更简单。
如果您需要基于时间的触发(可能是过期),请使用计时器。