WCF "global coordinator"
WCF "global coordinator"
我正在使用 WCF 在 C# 中实现 Web 服务。目标是创建服务,使用户能够在 "transaction" 内从服务器写入或读取文件。
写作示例场景:
- 用户打开交易(向服务器发送打开请求)
- 用户发送带有文件名和内容的请求以写入文件
- ...其他 read/write 操作...
- 用户结束事务并在服务器中进行(提交)更改。
因为它是已经存在的小型分布式系统的一部分,所以我必须使用 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; }
}
}
我想要像 "global coordinator" / 主线程 / 处理程序这样的东西一直工作,以便管理打开的事务和阻止的文件。我需要在我的服务中使用以下功能:
- 添加新交易
- 检查给定 ID 的交易是否已经打开/是否存在于打开的交易列表中
- 超时后删除事务
- 重置交易超时计数器
- 对于被阻止的文件也同样如此。
我不知道如何实现这种在后台工作的协调器thread/service。它将解决在服务 class 中管理多个线程的问题。我考虑过另一种存储有关事务、阻止文件及其超时的信息的服务,具有获取或重置它们的功能,但它会使通信加倍并降低我服务的可靠性。
问题:如何引入后台thread/service管理我的服务状态,如阻止的文件或打开的交易?
您似乎将 "coordinator" 视为在后台运行并管理一切的代理。该代理可以按照您的建议作为线程实现。请求将进入该代理,得到服务并回复。
没有必要有这样的agent/thread。您可以在收到请求时对 WCF 线程执行所有必要的处理。当然,您需要同步对所有共享可变数据结构的访问。
如果您只使用全局锁,这将等同于您提出的基于代理的解决方案,但更简单。
如果您需要基于时间的触发(可能过期),请使用计时器。
我正在使用 WCF 在 C# 中实现 Web 服务。目标是创建服务,使用户能够在 "transaction" 内从服务器写入或读取文件。 写作示例场景:
- 用户打开交易(向服务器发送打开请求)
- 用户发送带有文件名和内容的请求以写入文件
- ...其他 read/write 操作...
- 用户结束事务并在服务器中进行(提交)更改。
因为它是已经存在的小型分布式系统的一部分,所以我必须使用 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; }
}
}
我想要像 "global coordinator" / 主线程 / 处理程序这样的东西一直工作,以便管理打开的事务和阻止的文件。我需要在我的服务中使用以下功能:
- 添加新交易
- 检查给定 ID 的交易是否已经打开/是否存在于打开的交易列表中
- 超时后删除事务
- 重置交易超时计数器
- 对于被阻止的文件也同样如此。
我不知道如何实现这种在后台工作的协调器thread/service。它将解决在服务 class 中管理多个线程的问题。我考虑过另一种存储有关事务、阻止文件及其超时的信息的服务,具有获取或重置它们的功能,但它会使通信加倍并降低我服务的可靠性。
问题:如何引入后台thread/service管理我的服务状态,如阻止的文件或打开的交易?
您似乎将 "coordinator" 视为在后台运行并管理一切的代理。该代理可以按照您的建议作为线程实现。请求将进入该代理,得到服务并回复。
没有必要有这样的agent/thread。您可以在收到请求时对 WCF 线程执行所有必要的处理。当然,您需要同步对所有共享可变数据结构的访问。
如果您只使用全局锁,这将等同于您提出的基于代理的解决方案,但更简单。
如果您需要基于时间的触发(可能过期),请使用计时器。