健康度计算方案模拟测试

目的

计算近实时健康度(固定单位时长15mins内的平均健康度)

特点

多种心跳;各心跳开始时间不确定

方案

根据各心跳周期,确定各时间段内(时长15mins)的理论心跳数,以实际检测到的心跳数/理论心跳数=:该时段内的平均健康度

分歧点

各时段内的理论心跳数的确定

方法1、定义各时段取同一个心跳数:平均心跳数(存在小数点,以此计算的健康度会在一定误差范围内波动)

方法2、根据各心跳周期,以期获得各时段的准确理论心跳数(整数,希望获得准确心跳)

针对确定各时段理论心跳数方法2的反例

方法2并不能获得准确心跳数,因为起始时间的不确定性,而且并不只是第一个点不准确

问题抽象

假设某服务层包含两种心跳:60s周期和1800s周期,将一天内的时间以秒为单位,记为[0,86400],并且假设心跳正常且都从0时刻开始跳动,即两种心跳跳动时刻点分别如下

HB60<-seq(from=0,to=86400,by=60)#模拟发生心跳的时刻点
HB1800<-seq(from=0,to=86400,by=1800)
head(HB60)#查看前几个心跳时刻点
## [1]   0  60 120 180 240 300
head(HB1800)
## [1]    0 1800 3600 5400 7200 9000

那么,该服务层的所有心跳时刻点为:

heartbeat<-sort(c(HB60,HB1800))#将两种心跳时刻点合并且排序,注意这里不要去重
head(heartbeat)
## [1]   0   0  60 120 180 240

定义每15mins(900s)的切割点:

break.a<-seq(from=0,to=86400,by=900)
head(break.a)
## [1]    0  900 1800 2700 3600 4500

计算各时段内的“准确”理论心跳数:

each<-hist(heartbeat,breaks = break.a,plot = F)$count
head(each)
## [1] 17 16 15 16 15 16

如果所有心跳果真都是从同一时刻开始跳动,那么健康度一直都是准确的100%,如下图:

RateHealthy<-hist(heartbeat,breaks = break.a,plot = F)$count
plot(RateHealthy/each,type='b',col='red',xlim = c(0,100),ylim = c(0.9,1))

但是,当初始心跳不同时,比如,我们假设第一种心跳从40s开始跳,第二种心跳从100s开始跳:

hb60<-seq(from=40,to=86400,by=60)#模拟发生心跳的时刻点
hb1800<-seq(from=100,to=86400,by=1800)
head(hb60)
## [1]  40 100 160 220 280 340
head(hb1800)
## [1]  100 1900 3700 5500 7300 9100
heartbeat.new<-sort(c(hb60,hb1800))
head(heartbeat.new)
## [1]  40 100 100 160 220 280
RateHealthy.new<-hist(heartbeat.new,breaks = break.a,plot = F)$count
plot(RateHealthy/each,type='b',col='red',xlim = c(0,100),ylim = c(0.9,1.1))
lines(x=1:length(RateHealthy.new),y=RateHealthy.new/each)

其中红色为都为0s开始跳动时候的健康度图,黑色为从不同时刻开始跳动的健康度图,从图中明显可以看出来,并不只是起始几个点会影响,而是会一直传递到整个过程,实际上取统一理论心跳数的情形与之类似,也是在一定范围内波动,因此,建议不搞这么复杂,就用统一均值处理即可