我有一个环境,通过在凌晨时分接收和发送数据,为3个时区内的许多设备提供服务。基于标识号和使用模运算的简单计算伪随机地确定这些设备的分布。这种计算的结果造成了一个不必要的人为高峰,在夜间的某些时段消耗的资源比我想要的多。
作为我们协议的一部分,我可以指示设备何时在随后的夜晚连接到我们的系统。
我正在寻找一种算法,它通常可以将峰值分配到更高级别的线(虽然通常在更多时候更高)或者至少在正确的方向上推动 - 这意味着我应该花时间阅读什么类型的术语。我可以使用设备的识别号,当前时间和设备的时区作为执行计算的输入。我也可以执行一些前期分析计算来创建从中抽取插槽的池,虽然我觉得这种方法可能不如我希望的那么优雅(虽然学习算法可能不是一件坏事......)。 / p>
(最终并且稍微不那么相关,我将使用C#实现此算法。)
答案 0 :(得分:12)
如果要避免与使用随机时间相关的峰值,请查看用于哈希表的各种哈希函数。您的阅读可能从关于该主题的维基百科文章开始:
http://en.wikipedia.org/wiki/Hash_function
基本上,将您想要的更新窗口划分为适当数量的存储桶。一个选项可能是3小时* 60分钟* 60秒= 10800桶。然后将其用作哈希表大小,用于所选的散列函数。您的唯一输入可能是设备ID。不要忘记在选定的时间内使用GMT。您选择的编程语言可能具有许多内置的散列函数,但如果您想从头开始实现,那么本文应提供一些链接以帮助您入门。
这种方法优于早期的随机访问时间答案,因为它具有更好的均匀性属性,并且确保与随机函数相比,您的访问模式将近似平坦有时表现出尖峰。
以下是有关如何实现各种功能的更具体信息:
答案 1 :(得分:2)
你说你可以告诉设备什么时候连接,所以我不明白为什么你需要任何随机或模块化的东西。当每个设备连接时,选择明天当前没有分配许多设备的时间,并将设备分配到该时间。如果设备都需要大约相同数量的资源来进行服务,那么一个简单的贪婪算法将产生完全平滑的分布 - 将每个设备分配到当前最不拥挤的时间。如果服务器处理除了这些设备之外的其他工作,那么您需要从其典型的负载配置文件开始,然后将设备负载添加到该设备。我不会真正称之为“分析计算”,只是在接下来的24小时内存储预期负荷的直方图。
或者您是否遇到设备可能不遵守指令的问题(例如,它可能在指定的时间处于脱机状态,然后在接下来的时候连接)?显然,如果特定时区的用户都在早上同一时间开始工作,那么这将是一个有问题的策略。
答案 2 :(得分:1)
只需获取设备数量并将您的时间间隔划分为n个相等的段,并将每个段分配给设备,通知它们下次连接时的连接时间。
这将在所有情况下为您提供最佳均匀分布。
将所有时间标准化为GMT,您关心时区或日光节约时间或其他什么?现在,无论你在哪个时区,现在都是。
添加随机分布可能会导致聚集(均匀随机分布在限制范围内是均匀的,但不一定适用于任何特定样本),如果没有反馈机制,则应该使用。由于您可以在某种程度上控制它们连接随机组件时根本不需要甚至不是最佳的。
如果您担心设备间的时钟漂移,请考虑即使您添加了随机性,这也不会以任何方式降低时钟漂移的随机性,并且只会导致更差的优化配置。
如果要确保按区域稳定分配设备,请计算每个区域的设备比例,并适当分配插槽分配。例如,如果您的时区分别为50/25/25,则为第一个时区分配插槽,然后为剩余时区分配下两个插槽,然后重复。