繁体   English   中英

客户轮询活动

[英]Clients polling service for activity

我有一个Windows服务,可以连续执行计算任务。 作为单个计算任务的一部分,执行多个计算步骤。

记录/跟踪计算任务和步骤需要此服务,以便多个客户端可以轮询和观察活动。

为了满足此要求,我向服务中添加了一个简单的Dictionary<Guid, List<string>>_activity ),以收集活动消息。 密钥是表示CalculationTask.IdGuid ,值是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM