Skip to content

v2 节点流量统计及定时任务设计

Wendell Sun edited this page Jul 11, 2019 · 1 revision

Background

v2 的多节点模式下,需要对之前的流量统计和定时任务部分重新设计以适应需求。

Demand

  1. 多节点模式下,流量统计需要计算所有服务的使用流量,一旦使用的流量之和超过了用户的每月阈值,则停止所有的服务。
  2. 在下一月开始的时候,归零用户流量使用值,并重启已停止的服务。
  3. 一旦用户过期,会停止所有服务,并不会自动恢复。
  4. 需要新增流量统计的功能,使管理员和用户界面能够看到在节点上的服务的流量使用情况历史。
  5. 需要解决 v1 中定时任务潜在的一个问题,比如在下一月开始的第一天 ignite 挂了,在第二天恢复,这时候就不会再归零用户的流量了,我们需要在 v2 的设计中增加机制解决这一问题。

Design

数据库变化

  • 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_resultlast_stats_result, month_stats_time 为 now,并重启已经停止的服务。

  1. 1 月 31 日 service 的 month_stats_time=2019-01-01 00:00:00last_stats_result=1681123151month_stats_result=1621123151
  2. 在执行 2 月 1 日的定时任务时,month_stats_time=2019-02-01 00:00:00month_stats_result=1681123151

用户过期

每日的定时任务会检查所有的用户的过期时间,一旦过期,停止所有服务。

流量统计

在每日的定时任务时,会将所有服务的流量使用情况从内存写入到数据库中,我们基于 service_stats 表的数据也能提供用户的服务流量使用历史。

  1. 在执行 2 月 2 日每日任务之前,service 的 last_stats_result=1121963151last_stats_time=2019-02-01,内存中的 service stats_result=1321963151
  2. 在执行 2 月 2 日每日任务之后,service 的 last_stats_result=1321963151last_stats_time=2019-02-02,同时会在 service_stats 表新增一条记录start_time=2019-02-01, end_time=2019-02-02, stats_result=1321963151, traffic_used=200000000

异常情况

几种异常情况都能在定时任务中正常处理,除了定时任务以外,还可以在程序启动时做一些检查,如过期用户等。

  1. 月初 ignite 挂了,过了几天恢复,在定时任务中即会以恢复的那天作为当月流量的起始点,并执行后续流程。
  2. igntie 挂了几天, 下一次的流量统计记录里则会生成跨天时间段的记录,如 start_time=2019-02-01end_time=2019-02-08stats_result=1321963151traffic_used=63151