[英]Clients polling service for activity
我有一个Windows服务,可以连续执行计算任务。 作为单个计算任务的一部分,执行多个计算步骤。
记录/跟踪计算任务和步骤需要此服务,以便多个客户端可以轮询和观察活动。
为了满足此要求,我向服务中添加了一个简单的Dictionary<Guid, List<string>>
( _activity
),以收集活动消息。 密钥是表示CalculationTask.Id
的Guid
,值是List<string>
包含来自各个计算步骤的消息。
我天真地向客户端(通过wcf)调用的服务添加了一种方法来轮询活动消息。 客户端将传递一个lastPolledTimeStamp
,以告知服务“ 将自上次轮询以来的所有消息告诉我 ”。
private readonly Dictionary<Guid, List<string>> _activity = new Dictionary<Guid, List<string>>();
public List<string> GetActivity(DateTime lastPolledTimeStamp)
{
var snapshot = _activity.ToList();
return snapshot.SelectMany(x => x.Value)
.Where(x => x.TimeStamp > lastPolledTimeStamp)
.OrderBy(x => x.TimeStamp)
.ToList();
}
这是我的问题和疑问:
(1)当客户端和服务位于不同的计算机上时,尝试按日期/时间比较过滤结果的尝试将不起作用。 而且我不能每次调用GetActivity
都简单地返回_activity
所有内容-数据太多。 必须进行某种过滤。 我还有什么其他选择?
(2)另一个“问题”是知道何时可以删除_activity
词典中的键/值对。 客户端每5秒轮询一次。 我想将键/值对保持足够长的时间,以使客户端有机会使用它。也许我应该包括另一个计时器,该计时器执行以定期清除_activity
的旧条目。 有什么想法吗?
对于第一个问题,请在每次请求时返回服务器的时间,并让客户端在发出请求时发送此时间戳,而不是他们自己的时间。
对于第二个问题:如果计算/步骤可能以不同的速率生成消息,而不是为每个更新集使用固定大小的缓冲区,那么我将坚持每隔一段时间运行一次清理作业,删除早于[客户端ping间隔的一小部分]。
对于第二个问题,我将实现一个圆形数组结构,该结构将自动覆盖旧条目。 如果写入消息的速率恒定,则应该很容易。 如果它是变量,则必须基于每5秒周期内预期的最大消息数来确定数组的大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.