随机函数的应用

随机数的应用

首语

随机数大家肯定都用过,无论哪个平台都有随机函数。常规应用随机函数,都是每次随机出不同的数值,模拟某种不确定的状态,但有时候我们需要固定随机序列,达到特定场景需求。

需求

我们要实现一个推送系统(主要针对android,原因你懂的),资源只有几台服务器,要服务上亿的用户,推送信息延迟不能超过1天,而且推送消息时间在早上8点到晚上10点间。

这就是原始需求了,现在我们分解下需求。几台服务器,除了接入服务器,还要有业务服务器和数据库服务器,这么少的资源,长连接肯定是不行的,短连接就没必要走TCP协议了,因为短连接性能消耗不在通信而在连接上

需求难点在于,有限资源下如何接收上亿的pv,并保证系统的稳定性。

常规思路是让所有用户请求打散在8点到22点,那么如何让客户端均匀分布在时间范围内访问服务器呢?毕竟每个客户端与客户端之间,客户端与服务端之间没有关联(首次访问服务端必须已经时间打散),也就是说需要在客户端首次启动时就已经实现。

设计

  • 客户端与客户端如何建立联系?

可以采用客户端唯一标识建立逻辑联系,假设所有客户端都有一个唯一标识,那么根据该标识分布到时间区间就变得可实现。

  • 如何生成唯一标识?

android可以用IMEI等复合字段生成,iOS可以采用uuid(卸载重装用户可以将uuid保存在keychain中)。

  • 如何将唯一标识打散到区间范围?

采用随机数,随机数有个随机种子,同一种子随机出来的序列是相同的,这样就算是卸载重装用户依然可以分配到上次的时间点。

实现

java代码:

    int range = (22-8)*60*60*1000;  //时间区间范围,最小单位毫秒
    Random random = new Random(hashValue(clientID));
    return random.nextInt(range);

结尾

这里主要想表述的不是随机数,而是解决问题的思路,如何一步步解决问题。诚然实际项目中不会这么简单,但总体思路不会变。

你可能感兴趣的:(经验分享)