美团 Flink 实时路况计算平台全链路架构揭秘

210 阅读3分钟

📌 一、背景:为什么自建路况平台?

虽然我们集成了高德等地图 SDK,但它们存在以下问题:

  • ❌ 不掌握算法细节,无法精细调优
  • ❌ ETA 偏差大:地图预估 vs 实际轨迹
  • ❌ 高频区域拥堵/施工无法快速更新
  • ✅ 所以我们自研了 Flink 实时路况平台

支撑美团外卖、买菜、闪购、配送等 每日亿级路径调用请求


📌 二、系统整体架构(图示)

image.png

📦 三、核心模块详解

✅ 1. Kafka轨迹接入

轨迹数据通过 GPS SDK 统一上报,每条数据结构如下:

{
  "riderId": "A1234",
  "timestamp": 1717481200,
  "lat": 23.123456,
  "lng": 113.123456,
  "speed": 11.4,
  "direction": 87,
  "orderId": "O99887"
}

✅ 2. Flink清洗作业(实时)

Flink ETL Job 示例(Scala + CEP):

val gpsStream: DataStream[GPSPoint] = source
  .keyBy(_.riderId)
  .filter(_.speed < 60) // 过滤异常速度
  .assignTimestampsAndWatermarks(...) // 乱序容忍

val validPoints = gpsStream
  .process(new FilterNoiseGPSFunction)

✅ 3. 轨迹切片 + 网格映射

  • 每 30s 为一个轨迹切片
  • 切片转为 LineSegment,进行网格匹配
  • 我们将全国划分为 30m x 30m 的小网格,每个网格状态独立维护
val gridId = s"${(lat * 1000).toInt}_${(lng * 1000).toInt}"

✅ 4. 路况聚合逻辑(Flink Keyed Process)

Flink Job 的核心逻辑伪代码:

class TrafficAggregator extends KeyedProcessFunction[String, GPSPoint, TrafficStat] {
  lazy val speedState = getRuntimeContext.getState(
    new ValueStateDescriptor[List[Double]]("speeds", classOf[List[Double]])
  )

  override def processElement(point: GPSPoint, ctx: Context, out: Collector[TrafficStat]) = {
    val speeds = speedState.value() :+ point.speed
    speedState.update(speeds.takeRight(20))

    val avg = speeds.sum / speeds.size
    val level = if (avg < 5) "拥堵" else if (avg < 15) "缓慢" else "畅通"

    out.collect(TrafficStat(point.gridId, avg, level))
  }
}

📂 四、状态管理与容错

  • 所有网格状态使用 RocksDB 存储
  • 开启增量 Checkpoint,每分钟一次,约 1.3 秒完成
  • 使用 异地备份(HDFS),支持任务挂掉后快速恢复
state.backend: rocksdb
state.checkpoints.dir: hdfs:///meituan/flink/checkpoints
state.savepoints.dir: hdfs:///meituan/flink/savepoints

🔁 五、输出服务与查询系统

接口服务设计:

GET /traffic/grid?lat=23.1&lng=113.1
→ 返回 {"gridId": "23123_11312", "speed": 12.3, "level": "缓慢"}
  • 实时路况用于 ETA 模型、路径规划引擎、调度器等组件
  • 支持地铁封闭、高架施工、天气数据融合

📈 六、实战效果与性能指标

指标数值
Flink 并发任务数280 个 SubTask
每日轨迹数据24 亿条+
平均处理延迟2.4 秒
状态快照大小6.1 GB / checkpoint
实时路况命中率提升32.8%(对 ETA 准确性)

🔍 七、实际使用场景(美团内部)

使用组件使用方式
ETA 模型路况等级作为特征 + 平均速度值
派单系统拥堵区域降低配送密度
用户端地图动态展示配送员状态(是否拥堵)
闪购/买菜智能分仓基于通行速度判定仓到小区效率

💡 工程挑战总结

问题解决方案
GPS 漂移 + 地图不匹配自研轨迹纠偏引擎 + 路网融合算法
延迟波动大引入异步 IO sink + task chaining
网格状态过多热区分层存储,冷热分区拆表
同一 rider 多地反复出现状态独立分流 + session 归并逻辑

✅ 总结

“路况系统是一切智能调度的前提,Flink 给了我们实时性、状态一致性和计算弹性,让平台站上了 ETA 精度的制高点。”