二. 数据结构分析

2.1 数据结构构造(已审查)

组件数据结构采用数组进行存储,数组的数据结构如下图:

数组结构的各部分阐述如下:

  1. TOTAL_COUNT:记录的总数量

  2. TOTAL_SIZE : 数据包的总大小,通过这个参数可以控制每次UDP数据包的大小临界值。

  3. 每一个数据元包括:log_str、log_struct、log_length这三部分。

  4. log_str:这个元素是一个数组,每个元素就是一个完整的日志字符串。

  5. log_struct:这个元素是一个数组,每个数组元素是个三元组,是构造log_str的源数据。

  6. log_length:这个元素是一个数组,每个元素都是一个数值型数据,代表当前id对应的字符串的长度。

2.2 数据结构操作:(添加、删除)(已审查)

2.2.1 添加操作 (已审查)

当调用set和count函数添加数据时,组件会同时添加log_str、log_struct、log_length三个元素,由于这三个元素添加时数组ID均相同,所以三个元素在结构上是可以通过id进行统一索引的,类似的模型代码如下。

  $log_size = strlen($log);
  self::$gauae_metrics_logs['LOGS_DATA']['log_str'][] = $log;
  self::$gauae_metrics_logs['LOGS_DATA']['log_struct'][] = $logPacker;
  self::$gauae_metrics_logs['LOGS_DATA']['log_length'][] = $log_size;
  self::$gauae_metrics_logs['TOTAL_COUNT']++;
  self::$gauae_metrics_logs['TOTAL_SIZE'] += $log_size;

TOTAL_COUNT在添加的时候会进行递增,TOTAL_SIZE会在添加的时候自动把当前的数据包长度进行添加。

2.2.1 删除操作 (已审查)

当调用send_count_metrics_log、send_gauae_metrics_log函数发送发送数据是,组件会同时删除log_str、log_struct、log_length三个元素,并同时调整TOTAL_COUNT、TOTAL_SIZE数值。

    foreach (self::$gauae_metrics_logs['LOGS_DATA']['log_str'] as $key => $val) {

      $udpPakData .= $val;  //发送前组装最终字符串

      $log_size = self::$gauae_metrics_logs['LOGS_DATA']['log_length'][$key]; //获取当前位置的长度

      unset(self::$gauae_metrics_logs['LOGS_DATA']['log_str'][$key]);
      unset(self::$gauae_metrics_logs['LOGS_DATA']['log_length'][$key]);
      unset(self::$gauae_metrics_logs['LOGS_DATA']['log_struct'][$key]);
      self::$gauae_metrics_logs['TOTAL_COUNT']--;
      self::$gauae_metrics_logs['TOTAL_SIZE'] -= $log_size;

    }
    self::sendUdpPackage(self::$IP, self::$PORT, $udpPakData); //发送UDP

TOTAL_COUNT在删除的时候会进行递减,TOTAL_SIZE会在删除的时候自动把当前的数据包长度进行缩减。

2.2.3 数据构造总结

通过添加、删除操作进行数据结构的构造,可以保障数据结构的平衡,通过TOTAL_SIZE和UDP协议的数据包大小上限进行控制。

文档更新时间: 2018-08-27 02:32   作者:李彪