-
Notifications
You must be signed in to change notification settings - Fork 127
v2 节点流量统计及定时任务设计
Wendell Sun edited this page Jul 11, 2019
·
1 revision
v2 的多节点模式下,需要对之前的流量统计和定时任务部分重新设计以适应需求。
- 多节点模式下,流量统计需要计算所有服务的使用流量,一旦使用的流量之和超过了用户的每月阈值,则停止所有的服务。
- 在下一月开始的时候,归零用户流量使用值,并重启已停止的服务。
- 一旦用户过期,会停止所有服务,并不会自动恢复。
- 需要新增流量统计的功能,使管理员和用户界面能够看到在节点上的服务的流量使用情况历史。
- 需要解决 v1 中定时任务潜在的一个问题,比如在下一月开始的第一天
ignite
挂了,在第二天恢复,这时候就不会再归零用户的流量了,我们需要在 v2 的设计中增加机制解决这一问题。
-
service
表新增month_stats_result
,month_stats_time
字段。 - 增加新表
service_stats
,主要字段有user_id
,node_id
,service_id
,start_time
,end_time
,stats_result
,traffic_used
。
month_stats_result
表示 month_stats_time
代表的月的流量统计起始值,last_stats_result
-month_stats_result
即为该月的流量使用值。
agent
会通过 rpc stream
定时向 igntie
汇报节点上运行的相关服务的流量使用情况,这个值除了容器被销毁,否则会一直获取到,且只会递增。基于此,我们可以将流量统计的值维持在内存中,不用实时向数据库保存,可以仅在执行每日的定时任务时保存。
废弃之前的每月任务,合并到每日任务中,在每日的定时任务会检查 month_stats_time
的年月是否和今日一致,如果不是,说明是新的一月,则更新服务的 month_stats_result
为 last_stats_result
, month_stats_time
为 now,并重启已经停止的服务。
- 1 月 31 日 service 的
month_stats_time=2019-01-01 00:00:00
,last_stats_result=1681123151
,month_stats_result=1621123151
。 - 在执行 2 月 1 日的定时任务时,
month_stats_time=2019-02-01 00:00:00
,month_stats_result=1681123151
每日的定时任务会检查所有的用户的过期时间,一旦过期,停止所有服务。
在每日的定时任务时,会将所有服务的流量使用情况从内存写入到数据库中,我们基于 service_stats
表的数据也能提供用户的服务流量使用历史。
- 在执行 2 月 2 日每日任务之前,service 的
last_stats_result=1121963151
,last_stats_time=2019-02-01
,内存中的 servicestats_result
=1321963151 - 在执行 2 月 2 日每日任务之后,service 的
last_stats_result=1321963151
,last_stats_time=2019-02-02
,同时会在service_stats
表新增一条记录start_time=2019-02-01
,end_time=2019-02-02
,stats_result=1321963151
,traffic_used
=200000000
几种异常情况都能在定时任务中正常处理,除了定时任务以外,还可以在程序启动时做一些检查,如过期用户等。
- 月初 ignite 挂了,过了几天恢复,在定时任务中即会以恢复的那天作为当月流量的起始点,并执行后续流程。
- igntie 挂了几天, 下一次的流量统计记录里则会生成跨天时间段的记录,如
start_time=2019-02-01
,end_time=2019-02-08
,stats_result=1321963151
,traffic_used=63151