{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "bd03-title",
   "metadata": {},
   "source": [
    "# ⏱️ 03 · Flink 与实时计算：窗口 / Watermark / 状态\n",
    "\n",
    "> 实时计算岗位必考 **Flink**。本节手写核心概念：**事件时间、水位线（Watermark）、\n",
    "> 滚动/滑动窗口、迟到数据处理**，用 numpy 模拟流式处理（无 Flink 依赖）。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd03-q",
   "metadata": {},
   "source": [
    "## 📋 本节要解决的问题\n",
    "\n",
    "| # | 问题 | 方法 |\n",
    "|---|---|---|\n",
    "| 1 | 批与流区别？ | 有界 vs 无界数据 |\n",
    "| 2 | 事件时间 vs 处理时间？ | 乱序怎么处理 |\n",
    "| 3 | 水位线（watermark）？ | 允许延迟的边界 |\n",
    "| 4 | 窗口类型？ | 滚动/滑动/会话 |"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "bd03-setup",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T09:38:26.085899Z",
     "iopub.status.busy": "2026-10-08T09:38:26.085191Z",
     "iopub.status.idle": "2026-10-08T09:38:35.593808Z",
     "shell.execute_reply": "2026-10-08T09:38:35.586871Z"
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'PingFang SC', 'Noto Sans CJK SC', 'Arial Unicode MS']\n",
    "matplotlib.rcParams['axes.unicode_minus'] = False\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import sqlite3\n",
    "import os\n",
    "rng = np.random.default_rng(42)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd03-1",
   "metadata": {},
   "source": [
    "## 1️⃣ 批处理 vs 流处理（必背）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "bd03-batch",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T09:38:35.599520Z",
     "iopub.status.busy": "2026-10-08T09:38:35.598746Z",
     "iopub.status.idle": "2026-10-08T09:38:35.656744Z",
     "shell.execute_reply": "2026-10-08T09:38:35.649531Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "批处理（离线）：数据有界、一次性处理、延迟高（小时级）、准确；\n",
      "流处理（实时）：数据无界、持续到达、延迟低（秒级）、对乱序敏感；\n",
      "Lambda 架构：批+流两套并行再合并（历史准确+实时快但对账难）；\n",
      "Kappa 架构：只用流处理（重放历史=批），Flink 主流。\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print('''批处理（离线）：数据有界、一次性处理、延迟高（小时级）、准确；\n",
    "流处理（实时）：数据无界、持续到达、延迟低（秒级）、对乱序敏感；\n",
    "Lambda 架构：批+流两套并行再合并（历史准确+实时快但对账难）；\n",
    "Kappa 架构：只用流处理（重放历史=批），Flink 主流。\n",
    "''')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd03-2",
   "metadata": {},
   "source": [
    "## 2️⃣ 三种时间与乱序问题"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9802aa14",
   "metadata": {},
   "source": [
    "### 三种时间语义（必背）\n",
    "\n",
    "| 时间 | 定义 | 用途 |\n",
    "|---|---|---|\n",
    "| 事件时间 Event Time | 事件**发生**的时刻（数据里带的时间戳） | 业务正确性首选 |\n",
    "| 摄入时间 Ingestion Time | 进入 Flink 的时刻 | 少用 |\n",
    "| 处理时间 Processing Time | 算子**处理**它的时刻（看机器时钟） | 低延迟、可容忍近似 |\n",
    "\n",
    "**乱序是常态**：网络抖动、分区并行都会让\"先发生的数据后到达\"。\n",
    "若按处理时间统计\"10:00:00–10:00:10 的订单\"，一条 10:00:09 发出、10:00:11 才到的订单会被算错窗口。\n",
    "所以严肃的实时统计必须用**事件时间 + Watermark**。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "bd03-time",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T09:38:35.661966Z",
     "iopub.status.busy": "2026-10-08T09:38:35.660990Z",
     "iopub.status.idle": "2026-10-08T09:38:35.800732Z",
     "shell.execute_reply": "2026-10-08T09:38:35.796138Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "到达顺序: ['A', 'B', 'D', 'C']\n",
      "事件时间顺序: [('A', '2024-01-01 10:00:01'), ('B', '2024-01-01 10:00:02'), ('C', '2024-01-01 10:00:03'), ('D', '2024-01-01 10:00:04')]\n",
      "\n",
      "  如果按\"处理时间\"聚合，会得到错误顺序（C 与 D 顺序反了）；\n",
      "  所以流计算默认用\"事件时间 + 水位线\"处理乱序。\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 事件时间（事件发生时刻）vs 处理时间（数据到达处理系统时刻）\n",
    "events = [\n",
    "    ('A', '2024-01-01 10:00:01'),\n",
    "    ('B', '2024-01-01 10:00:02'),\n",
    "    ('D', '2024-01-01 10:00:04'),\n",
    "    ('C', '2024-01-01 10:00:03'),   # 乱序：C 在 D 之后才到\n",
    "]\n",
    "print('到达顺序:', [e[0] for e in events])\n",
    "print('事件时间顺序:', sorted(events, key=lambda e: e[1]))\n",
    "print('''\n",
    "  如果按\"处理时间\"聚合，会得到错误顺序（C 与 D 顺序反了）；\n",
    "  所以流计算默认用\"事件时间 + 水位线\"处理乱序。\n",
    "''')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd03-3",
   "metadata": {},
   "source": [
    "## 3️⃣ 滚动窗口（Tumbling Window）手写"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "bd03-tumble",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T09:38:35.805897Z",
     "iopub.status.busy": "2026-10-08T09:38:35.805252Z",
     "iopub.status.idle": "2026-10-08T09:38:35.979063Z",
     "shell.execute_reply": "2026-10-08T09:38:35.975904Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "窗口 [3s, 13s): ['a', 'b', 'c']\n",
      "窗口 [12s, 22s): ['d', 'e']\n",
      "✅ 滚动窗口：每条数据属于唯一窗口\n"
     ]
    }
   ],
   "source": [
    "# 滚动窗口：固定长度、不重叠、每条数据只属于一个窗口\n",
    "def tumbling_window(events_with_ts, win_len):\n",
    "    # events_with_ts: [(id, ts_seconds)]\n",
    "    buckets = {}\n",
    "    for eid, ts in events_with_ts:\n",
    "        w = (ts // win_len) * win_len          # 窗口起点\n",
    "        buckets.setdefault(w, []).append((eid, ts))\n",
    "    return [sorted(v) for k, v in sorted(buckets.items())]\n",
    "\n",
    "stream = [('a', 3), ('b', 5), ('c', 8), ('d', 12), ('e', 17)]\n",
    "wins = tumbling_window(stream, 10)\n",
    "for w in wins:\n",
    "    print(f'窗口 [{w[0][1]}s, {w[0][1]+10}s): {[e[0] for e in w]}')\n",
    "assert sum(len(w) for w in wins) == len(stream), '滚动窗口每条数据只属于一个窗口'\n",
    "print('✅ 滚动窗口：每条数据属于唯一窗口')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd03-4",
   "metadata": {},
   "source": [
    "## 4️⃣ 滑动窗口（Sliding Window）手写"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "bd03-slide",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T09:38:35.993931Z",
     "iopub.status.busy": "2026-10-08T09:38:35.993201Z",
     "iopub.status.idle": "2026-10-08T09:38:36.291953Z",
     "shell.execute_reply": "2026-10-08T09:38:36.289959Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "窗口 [0,6): ['a', 'b']\n",
      "窗口 [3,9): ['b', 'c']\n",
      "窗口 [6,12): ['c', 'd']\n",
      "窗口 [9,15): ['d']\n",
      "✅ 滑动窗口：同一数据属于多个窗口（重叠）\n"
     ]
    }
   ],
   "source": [
    "# 滑动窗口：长度+滑动步长，数据可属于多个窗口\n",
    "def sliding_window(events_with_ts, win_len, slide):\n",
    "    buckets = {}\n",
    "    for eid, ts in events_with_ts:\n",
    "        start = 0\n",
    "        while start <= ts:                       # 窗口起点不能晚于事件时间\n",
    "            if start <= ts < start + win_len:    # 事件落在窗口内\n",
    "                buckets.setdefault(start, []).append((eid, ts))\n",
    "            start += slide\n",
    "    return buckets\n",
    "\n",
    "stream2 = [('a', 2), ('b', 5), ('c', 7), ('d', 11)]\n",
    "buckets = sliding_window(stream2, 6, 3)\n",
    "for start in sorted(buckets):\n",
    "    print(f'窗口 [{start},{start+6}): {[e[0] for e in buckets[start]]}')\n",
    "assert sum(len(v) for v in buckets.values()) >= len(stream2), '滑动窗口数据可属于多个窗口'\n",
    "print('✅ 滑动窗口：同一数据属于多个窗口（重叠）')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f039c1c1",
   "metadata": {},
   "source": [
    "### 会话窗口（Session Window）补充\n",
    "\n",
    "会话窗口没有固定长度：以**活动间隔 gap** 切分——每来一条数据就更新\"最近活动时间\"，\n",
    "若相邻数据间隔超过 gap（如 15 分钟未操作），则认为会话结束，窗口关闭。\n",
    "典型用途：用户行为会话分析（一次会话内的浏览/点击合并统计）。\n",
    "对比记忆：**滚动=切片不重叠；滑动=固定步长重叠；会话=按活动间隙动态切**。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "2a00d146",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T09:38:36.300419Z",
     "iopub.status.busy": "2026-10-08T09:38:36.299714Z",
     "iopub.status.idle": "2026-10-08T09:38:37.461774Z",
     "shell.execute_reply": "2026-10-08T09:38:37.459848Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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f3EfYypYlAoCTUxMAKT/ok1NTX9ohYiIiIiIKP+KioqCg4ODGCNQwaNUECidAmpqasogkIiIiIiI+JpYAcZJvERERERERBqEQSAREREREZEGYRBIRERERESkQRgEEhERERERaRAGgURERERERBqEQSAREREREZEGYRBIRERERESkQRgEEhERERERaRAGgURERERERBqEQSAREREREZEGYRBIRERERESkQRgEEhERERERaRAGgURERERERBqEQSAREREREZEGYRBIRERERESkQRgEEhERERERaRAGgURERERERBqEQSAREREREZEGYRBIRERERESkQRgEEhERERERaRAGgURERERERBqEQSAREREREZEGYRBIRERERESkQRgEEhERERERaRAGgURERERERBqEQSAREREREZEGYRBIRERERESkQRgEEhERERERaRAGgURERERERBqEQSAREREREZEGYRBIRERERESkQRgEEhERERERaRAGgURERERERBqEQSAREREREZEGYRBIRERERESkQRgEEhERERERaRAGgURERERERBpEJ68rkJG06BAICdF5XQ0iUgNCSjK0dHTzuhpEpCZ4TyFNlxrNZ/SCLl8GgWnRIYjePwlIScjrqhBRASekpkCIDYPE2BKQaOd1dYiogOM9hQiIiU/O6ypQDuXLIFBIiAZSEqDn0hUSU+u8rg4RFWApn18i6Z9D0KvVGRJzu7yuDhEVcLynEAFJMbEA/srralAO5MsgUEpiag1tC/u8rgYRFWBpkYEAAIlpEd5PiCjHeE8hArR1OR20oOPCMERERERERBqEQSAREREREZEGYRBIRERERESkQRgEEhERERERaRAGgURERERERBqEQSAREREREZEGYRBIRERERESkQRgEEhERERERaRAGgURERERERBqEQSAREREREZEGYRBIRERERESkQRgEEhERERERaRAGgURERERERBqEQSAREREREZEGYRBIRERERESkQRgEEhERERERaRAGgURERERERBqEQSAREREREZEGYRBIRERERESkQRgEUp6buWgZajZtiyHjpwIA4uLi8dt8TzRo0wld+w+D18vXGV779v0HzF6yAis3bJM5nlEeW3btw/o/dv+4xhCRyp29dBU1m7ZFzaZtkZSUBAAIDQvHH3sPou/w8XLpdx04ghY/98JPnTxw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RERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGkQnryvwXympabj12A+fAqNgX9QUrtWLQ0f7x8SqqixL3ctT57apujx1bpuqy1Pntql7eercNlWXp85tU3V56tw2VZenzm3Li/KIsitfBYE+n8IwcuEZfA2NgURLC2mCgGKWxlg/3Q2l7S0KbFnqXp46t03V5alz21Rdnjq3Td3LU+e2qbo8dW6bqstT57apujx1bltelEf0PbQEQRCyShQVFQUzMzNERkbC1NT0h1QkJTUN7qP2ITg8Fqlp/6uStkQLRcyNcGpdr1z7BkWVZal7eercNlWXp85tU3V56tw2dS9Pndum6vLUuW2qLk+d26bq8tS5bXlRXl5RRWxAP1a+6YW3Hvvha2iMzB8MAKSmCfgaGoPbj/0KZFnqXp46t03V5alz21Rdnjq3Td3LU+e2qbo8dW6bqstT57apujx1bltelEf0vfJNEPgpMAoSLS2F5yRaWvAPjCqQZal7eercNlWXp85tU3V56tw2dS9Pndum6vLUuW2qLk+d26bq8tS5bXlRHtH3yjdBoH1RU6RlMDM1TRDgUDT3hppVWZa6l6fObVN1eercNlWXp85tU/fy1Lltqi5Pndum6vLUuW2qLk+d25YX5RF9r3wTBLpWL45ilsbQlsh+e6It0UIxS2M0qF68QJal7uWpc9tUXZ46t03V5alz29S9PHVum6rLU+e2qbo8dW6bqstT57blRXlE3yvfBIE62hKsn+6GIuZGACAOpRcxN8L66W65+hKtKstS9/LUuW2qLk+d26bq8tS5bepenjq3TdXlqXPbVF2eOrdN1eWpc9vyojyi75VvVgeVSklNw+3HfvAPjIJDUVM0+MF71KiqLHUvT53bpury1Lltqi5Pndum7uWpc9tUXZ46t03V5alz21Rdnjq3LS/KUzWuDlrw5bsgkIiIiIiI8i/GBgWf+nwlQURERERERFliEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGkRHmUSCIAAAoqKifmhliIiIiIgof5PGBNIYgQoepYLA6OhoAICDg8MPrQwRERERERUM0dHRMDMzy+tq0HfQEpQI4dPS0hAQEAATExNoaWn98EpFRUXBwcEB/v7+MDU1/eHlUcHEfkLKYD8hZbGvkDLYT0hZ6txXBEFAdHQ0bG1tIZHw7bKCSKmRQIlEAnt7+x9dFzmmpqZq90dDuY/9hJTBfkLKYl8hZbCfkLLUta9wBLBgY+hORERERESkQRgEEhERERERaZB8GQTq6+tj9uzZ0NfXz+uqUD7GfkLKYD8hZbGvkDLYT0hZ7CuUnym1MAwRERERERGph3w5EkhEREREREQ/BoNAIiIiIiIiDcIgkIiIiIiISIMwCCQiIiIiItIgDAKJiIiIiIg0CINAIiIiIiIiDZKtIDAmJuZH1YPoh0lNTUVycnJeV4OIiIiIKF9Qep9AQRBQv359DBgwAEOGDAEA+Pn5ISgoSGF6Q0NDVKpUSemKvHjxAsWKFYOlpaXS10RERKBw4cKZpgkPD4ePj4/SeTo5OcHMzEzp9IIg4NGjR6hcuTIMDAwUpklKSoIgCPlqs9A3b97AwsICRYoUyTRdfm3fmzdv8PXrV8THxyMuLg7R0dGIiIhAREQEQkNDERQUhMDAQPj7+8Pf3x9bt25F3759xev//fdfpKWlZVlOiRIlsvyMlBUXF4dChQohKSkJz58/R40aNQAAsbGxMDIyQkxMDEJDQ1GiRIkM22xtbQ1zc3N8+PABoaGhmZZXq1YtvH37FpGRkdmuq4mJCcqVK4eUlBQ8efJE6eskEonYrs+fP+PLly9KX2ttbY3ixYtnt6oypPUtWbJktu4lUvnhnkJERET0o2Vrs/jPnz+jYcOGmDJlCoYOHYphw4bhypUrcg9uUVFRiIuLw/PnzwEAaWlp+Pfff+Xy+zZQrFSpEqZOnYo+ffrIpImJicHr16/lrr1//z4mT56Mffv2wd7eXu58uXLlYGJigiNHjqBbt26wtbXNsn0BAQE4ceIE3N3ds0wrlZCQAENDQ3h5eaFy5cpy50+dOoUJEyZg6NChmDhxosI8UlJSEBAQkOEDcGRkJPz8/GBnZwcLCwul6yaVmpqKx48fo2rVqtDV1QUAuLq6onfv3hg2bFim135v+xITE+Hl5SWXPrNgMjM+Pj7Q1dUVP6MFCxbg7Nmz0NPTg76+PvT09KCjo4Njx45h1KhRKFOmDEqVKiX+z9DQUCa/mTNnZjg6mJaWhoMHDyIiIgIHDhxAmzZtsl3f/0pNTYWTkxPOnDkDAwMDlC9fHgkJCfjrr7/g6emJ+/fv448//sCBAwdw8eJFhXk0adIEw4YNQ48ePdC7d2/cvXsXNjY2Cut/9+5dCIKAXr164cqVK0rVMTg4GKamptDX10f9+vXx119/ISQkBLa2tujWrVuW1wuCgKNHjyIhIQEAMHv2bCxfvlwuXVxcHPT19aGtrS1zfNCgQVi1apXMMV9fX8TFxaFkyZJK9Ztly5Zh8uTJWLFiBcaPH68wTV7eU/z9/ZGUlITSpUtneS0RERHRj6KTncR2dna4cOECNm/eDGns6Obmht69e6dnpqODatWq4d69exg0aJB4XUJCArp06SKXX7ly5XD+/HkA6Q+QOjry1Xny5AkaNWqEsmXLisek39YXL14cU6dORXh4OMzNzcXz3t7euHLlCpo0aQIAMDU1xadPn7Jsn7GxsRKfQtbS0tJw6tQpLFq0CKmpqdi0aROaNWumMO3Hjx8xYMAAlCtXDps2bZLLZ/z48di4cSOSk5Ohra2NoUOHYt26ddDS0lK6PtHR0XBxcYG/v7/Mw62fnx8ePnwok9be3h7FihXLcfueP38OFxcXuWtfvXqF8uXLK113aV6NGzfG9evXAaR/Zq1bt0br1q1l0iUlJeHYsWPo2bMn9PT0AADx8fF48eIFAMDCwgKlSpUCADg6OuLp06coXbo0ypYtiwoVKqBEiRK4ceMGZs2ahc6dO2PIkCGwtbWFIAjZ+rwV0dbWRu/evTFhwgRs2LABQPqXJWPGjMHmzZsBAJcvX0a9evVkfidmZmbQ19dHUFAQoqOj8f79e3Fkbvz48Rg1apRcWTExMTAxMQEA7Nu3T+k6FitWDJs2bULHjh1ljuvr62PcuHFZXp+amoqjR4+KP8+dOxdz586VS2dvb49Vq1YpvCdIPX78GP3798ezZ88AAAYGBpgwYQIWLlyY4TV+fn6YM2cO+vXrh7lz56Jnz54K+3Je3lOio6PRqFEjXLt2TeGXKkRERESqoHQQGBcXB11dXZQpUwa///67ePzChQt49+4dEhIS8PDhQ0RERMhdW6hQIXz8+FHuuCAI4gNvfHw8fH19ZR6Ay5YtCxMTE7i6uuLatWu4fv06Nm3ahDNnzuDmzZuwsrKCrq4uypcvDxsbG/Tu3Rtdu3aFu7u7+BCsSl5eXjhy5Ah2796N0qVLY+bMmWjbtq3CtB8+fMCKFSuwbds2JCcno1y5cnJpli5diq1bt+LEiRNo3rw59u/fj/79+6NChQoKH/6za9u2bTh06JDMscmTJ2Po0KE5bl9ISAgAICgoSBx9BNIfnrNDEAR4eHhg2rRp4kPz8ePHcenSJbm00umdCxYsgEQi/7qrq6srpk6dCl9fX5QqVQpmZmZ48+YN9u3bh6ioKJQsWRK6urpi8Lpt2zZIJBLMmTMHhQoVyla9/+vLly9o2rQp7t69iydPnkAQBFy5cgW1a9dG6dKlER0djQsXLsDb2xtnzpxBSEgIQkJC8Msvv6Bw4cLYt28fPn/+jM+fP+PIkSOoWLGiwiAeSP9b+lZmUzpLlSqV5ehyYmKi3AhdRmrWrKlUuqwsX74c3bp1w/nz51GoUCHs2LED48aNQ/ny5eVmCwDpbe7cuTPc3d2xc+dOdOrUCUOGDMHx48fl+kJe3lMqVqyIadOmwcPDA0+ePMnxlwtERERE30PpIHDr1q1Yv349Fi1ahC5duuDRo0cIDg5Gy5Yt0bt3bwQFBaF79+54+PAhXr9+LQaFFStWzPABOikpSZwmFRISAk9PT/FhMzg4GBcuXICBgQEqVqwIOzs7WFpaol+/fli7di3Cw8Ph4OAAPz8/fPjwAadPn8bOnTsxYcIEtGvXTu5B+Ht8/vwZ5ubmSgcAf/31F7S0tHD+/HmZUQZFjh49iuvXr2PPnj2YM2eO3Pm0tDSsWrUKw4cPF0e8+vbtiwMHDmDr1q25EgTOmzcvy+mg38pO+0JCQmBmZpbj9+mOHTuGgIAAjBgxQjw2btw4jBs3Ti4ASkpKwtmzZzFjxgxxJFCqRo0akEgkiIuLQ2BgIExMTGBiYgJHR0e0atUKAODs7KxwCuubN29QvXr1HLXj4sWL2LJlCwBgwIABSE5OxrJlywAAK1euRIkSJVC8eHGxTUuXLsXNmzexZs0aAOm/q/9OBz169Cju3LkjV9Z/33UMCQmBi4sLnJycZAIiX19fbN26VRzJz0ihQoXg6ekJf39/pKSkICUlBUlJSUhKSkJycjISExORmJiI+Pj4bE2lzszq1atl3ukbO3Ystm/fjmvXrskFgampqejbty+SkpLEUdVNmzahbt26mDJlisyXVkD6SGle3VMAYMSIEVi6dCn++usvdO7cOVfyJCIiIsoOpYPAsWPHom7dutiyZQtatmyJOnXqoF69eoiMjMTUqVMBAHXq1BH/29HREa6urrh16xYsLCwQFhamMF8vLy8UKVIEjo6OWL9+vTiyZGFhAV1dXXz48AFpaWmYN2+e+CDu5+eHDRs2oHHjxnj//j2A9ClmM2bMwMCBA3Ht2jV4e3vD1dX1uz+YyMhIlC5dGu7u7jhy5IjceV9fXwQHByMpKQlA+sI20rpHRUUpHKEBAFtbW9ja2mLo0KGYNGkSACgMAr29vREYGIiffvpJ5njTpk0xdepUJCQkZPmOlL+/PwIDA8VVXZ89e4avX78CSH8QzmgkydraGoIg5Kh9ISEhMDU1xbNnz2Bubg57e/vvGvXYuXMnevTooTAQd3FxQa9evcR8pcHPunXrZIKd/fv3IzIyEsbGxoiKipJ7R+7kyZMICwvD3bt35UYY9+zZA0tLS9y4cSPbdf9Wt27dYGRkhJMnT6JPnz4YNmwYWrZsCQ8PD2hra6NKlSpITk5GamoqtLW14ePjk+F7Y7GxsQBkp4PGx8fj3bt3cHZ2Rnx8PBo2bCh33YMHD2QWPalVq5bS9ffy8sKuXbvEdzB1dXVx4cIF1KxZE05OTjA0NISBgYH4e3r37p3CWQEAkJycjPfv3yvsQ4ULF0aZMmUULuoSFRUlN5KcmJiInj174vHjx7h9+zb09fXx8OFDVK5cGWfOnEH9+vWho6ODRYsWif0kr+4pUoaGhujRowd27drFIJCIiIjyRLbeCaxTpw7q1KkDIP0B0tPTU27ERUpfXx9Tp06FkZERVq5ciZMnTyIpKQlfvnyRWf1w4cKF8PDwkHvAky4e0bt3bxgbG8PDwwNOTk7iubdv38LZ2Vnm3UMgfQGRjRs3Zjm6kRUTExOMHTsW9evXV3h++fLl2L17t/jz4MGDIZFIIAiC2BZFQc/kyZMxffr0LKeWSafP/nelSHt7e6SlpSEwMDDDVSSlduzYge3bt4v5fDua5uvrC19fX5l3xmJiYsTPOjo6OkftCw4Ohr+/P6pWrQoAKFq0KBYuXIiBAwdmWudvpaSk4Nq1a9i7d2+GacaMGSMuMJKUlIT9+/dj1KhRMv3y8OHD4n9bWVlBR0cHAQEBANLfNzQ3N8e5c+eQnJwMExMThIaGwszMDKdOnUKzZs2wevVqpeuckc2bNyMtLQ0bN27Eu3fvUKdOHaSkpGD8+PFo2bIlZs2ahdmzZ+P169eoVKkS/vnnH/FLAulnERcXh2XLlmHbtm2wtraWCeK9vb0xadIknDhxAkD6SJi3t3eWI7bK0NLSQuvWrVG+fHlxmi8AvH79Go0aNULt2rXFY9Lypk2bhrNnzyrMLy4uDrNnz8a8efPkzrVp00bm9yW1ceNG+Pr6olevXuKxz58/o2fPnoiKisKdO3dgY2Mjvosqfff0xo0bcHNzw5s3b7B582YUKVIkz+4p32rRogV69+4tBv1EREREqpStIFAQBERHR8PU1BT37t2Du7s73r17J7eSXmRkJIKDg8VAZu3atVi7di3WrFmDffv24d69ezLpExISEB4eLi7ikJaWhsTERJktB5ydnXHv3j1xypm5uTnWr18vk0+pUqWUWsVQGRKJBJ6enhmeX7NmDdasWSOunnnnzh1UrlwZaWlpcHFxQdeuXcVR0e8hnXr2320XpD+npKRkmcesWbMwa9Ys8efo6Ggx+HR0dMS6devE6XsBAQFo0KAB1q5dKx7LSfsmT56M8ePHQ0dHB+/evcPcuXMxaNAgWFlZoUOHDkp9Bl++fEF0dLTC9yWldu/eLQajqampANJH7759sJYeB9KDvri4OFhZWcHBwQGdO3dGYmIi3r59C2tra1SrVg22trZwcHBA+/btsWrVKjRp0gSenp6oV6+eUvVWpH379ggNDcXff/+NX375BSdPnoSZmRnat28PR0dHWFlZ4fz58zh06BAGDx6MZ8+eiYuQLFu2DL///jtCQ0Pxyy+/YOHChRgwYAAOHTokjmrGx8cjNDRUZnpvnTp15P5Gsis2NlYc3ZszZw4+f/4sjlB+/PgRZ8+eFRdvOX/+PDZu3IjWrVsrDOSklFkYRio1NRVz587F4sWLsW7dOvF9zWPHjmHQoEFo2rQpTp8+neGXKpUrV8bdu3fRs2dPODk5YeXKlRgwYAAA1d9TvuXk5ISoqCgEBwdnuRATERERUW7LVhD46tUr1KpVC/7+/uJ0rfbt28s9JD19+hTz58+Xu/6PP/7Ar7/+CkB2ape/vz+0tLTE5e7j4uIAQG5Zf29vb/Tq1QspKSkoXrw41q1bByA9WLh8+XKGIw+qJJFIsHbtWrRo0QLNmzdXuEKmMoyMjAD8b+qfVHR0NABkuZfZfy1ZsgSHDh3CgwcP5FZh9fb2hpubG5o1a5blO13Ktu/bfdFq1qyJI0eOwNHREYcPH1Y6CJTug2dlZZVhmr59+8qMBG7atAl9+vSRGQncunWr+N8VK1ZESkoKYmNj8erVK4XvAH57rHPnzmjXrp04YvS99u7di9OnT+P+/fuoWbMmZs+eDSB9pcr169ejX79+6Ny5M+bOnYukpCQ0adJE3IJAR0cHBw4cwNy5c9GsWTMUKVIEYWFhmDt3rrjFinQkULrCrK6urjgKK/XkyROZ1Sqlf2eZiYqKkvldNm3aFC1btgQAvH37Fm3atBFHAhVtu5ATnz59Qo8ePeDr64vz58/LrEArkUiwZMkSDB48OMt87OzscO3aNaxevRqOjo4y5/LqniJ9VzYkJIRBIBEREalctoLA27dvo0iRIjLv65w5cwYvX76USRceHi537bVr1xAaGopu3brBx8cHkyZNwrFjxwAAV69eRfXq1cUHVOnDqTQQkvr7778xYsQIuLq6YubMmfD394e5uTkMDAzw4MED1KhRI9PRO1WpX78+Vq9ejRYtWuD48eNo2rRptvOQjra8efMGzs7O4nHphuHZ2Qh7xYoV+OOPP3DlyhUxAKxSpQoKFy6MPXv2YPTo0Rg6dCiWLFmiVH7f0z49PT3Y2dnJBbVZXQNAfC/xv2rWrIm1a9eKP2f0TmDVqlXFQDE0NBRjx46Frq6uuOVEZpo3b474+HiF74Vmx8yZMyEIAtLS0nD//n1oaWnh0aNHaNWqlRgUDxgwAAsXLoSnp6fMXoHS7Rm+3W7h5cuXiImJQcOGDcUVOUuVKoVx48YhISEBHz9+lJm6CQBDhgyRWykzq03MX79+jZIlSwKAuLrptm3bAMiPBOrq6ubapug+Pj5o2LAhGjdujNOnT8vlq+wXCVISiUThvoF5dU+RjvT/94suIiIiIlXIVhB469YtNGrUSOaYm5ubUiOBCxYswKRJk/Dx40fMnDkT169fx6lTp+Du7o7Tp0/LbMidURA4efJkBAUF4cyZMwgKCoIgCJBIJHj16hUCAgJQo0aN7DQnS0lJSdDV1c32giZRUVHiO3QdOnRAnz59MH/+/Gxt9F66dGk4OTlh9+7d4rS5pKQkHDp0CJ06dRLTvXr1CsbGxnBwcJDLIy0tDZMnT8bly5dx48YNmY3FJ0+ejN9++w1v377Fnj170K5du1xt38ePH2VGXV69eoVnz56ha9euSpdjbW0NAAgMDJTbFN3Pz09uX8WM3gkE0reqKFGiBGxsbHD79m3cu3cPI0eOFFeTVGTQoEFYsmSJwgVUnj9/DktLS4WbtWekUaNGuHXrFn766Sf0798f06ZNw9q1a8VR3dTUVBQtWhQBAQGZ9rkXL14gMTER1apVg52dHW7duiVz/t27d6hbt674s66uLmrWrIlr165ley/M+/fvw8XFBREREahUqZI48gjIjwRKxcXF5XhLjYEDB6J+/frYv39/jvLJiqrvKVKBgYEA/tfHiYiIiFQpW0HgpUuX5FayVGYkcOnSpbh69SqMjY1x+/Zt9O3bFxs2bEDbtm3h6OiI8+fPY8WKFWJ66WjRtwvFxMbGYsuWLVi8eDEaN26M4cOHixt/P3v2DFOnToW2trY4XfJbqampGa5m+a1vl9aPjo6Go6Mjfv75Z3HkIzPR0dHYsWMHdu3aBYlEgitXrmDgwIFo3Lgxhg0bhhIlSqBTp04YNGiQwpUbFfH09ETnzp3Rq1cvNGjQAEeOHEFsbCxmzpwJIP0dzfr162PVqlXo16+f3PVBQUFISEjAzZs3YWJigk+fPuGvv/7Crl278P79e4wcOTLT96ly0r4RI0bA1NQUrq6u8PPzw9atW+Hs7CyzOE1WrKys4OjoiHv37qFatWoy5y5evCgzWgb87/e3atUquRGvZs2aYciQITLHwsPDFe43KJXR6pZJSUlwcXHBwYMH0b59eyVbAzRp0gQVKlRAnz59MHToUBgYGCA1NRUpKSlITk7Gzz//DF1dXYwZMwadOnXC5cuXFe67t2fPHrRu3Rr6+vpITEyU69v/3cTc0tJSqf6flJQkE3ympqZi//79OHfuHK5du4bx48eL22kAsiOB0undx44dw+nTpzNdeVQQhEzrERUVhRs3bsDd3R0LFiyQOz9jxows26IMVd9TvnX37l2UL18+T/YzJSIiIlI6CHz69CkCAgLkRgKHDRsmLlP/5s0bREdH49ixYzh58qSYpnLlypgxYwaGDh0qvucEANWrV8fw4cMxcOBAODg44OHDhxAEAXv27IGDg4PM4h7v37/Hhg0bYGZmhidPnshtfq2jo4Np06bBx8dHru6xsbHo2LFjlm1MSEgQ/9vAwABNmjTJcvPrBw8eAEgf5bGxsUG3bt1kVhEsU6YMLl26hMePH2P9+vUKHworV66scKXPn3/+GWfPnsXGjRuxf/9+VKlSBXv27BE/w5cvXyI6OjrD9/jCw8Ph5OSEcePG4datW/Dx8YGrqyuGDBkCDw8PpUaFvrd9bdq0wYkTJ/Dnn3/Czs4O8+fPx9ChQ2U2jleGm5sbzpw5I7Pgibe3N6pWrSr3zltSUhIOHz6McePGKVy19v379xAEAeHh4Xj9+jV0dHQyfbdSR0cHr169ApC+ZYk0QHj06BF0dHTEd+OU8ffff2P//v04ffo0unbtig8fPuDTp09Yt24d7O3tMXLkSJQoUQIXL16EsbExtLW10aBBA6xYsQJNmzZFcHAwvL29ERoaio0bN+LcuXMA0t8p+3YVUUB+s/iM3LhxAzdv3oShoSG8vb0RHh6O4sWLi+d///13VKxYEc7OzvDx8UHVqlWxePFieHl5ISYmBs+ePYOTkxMiIyOxf/9+3L9/H5cvX5YbxYyOjsabN28ApC9AFBQUlGnwExcXhxo1aiAgIADHjx+XO59bQaCq7ynfOnv2rLj/JxEREZGqZWsksHfv3jIrNTo5OclMZ/rzzz9x4cIFGBkZybxf5ubmBjc3N7n8tLS0EBISIn7b36pVK8TExMDc3FzcJBsAzM3N0a1bN+zYsSPLOo4cOVLufTlTU1O50RFFvg2KdHV1cfTo0SyvcXJyQt++fTFw4EA0bNgww2l81atXz3BE8cCBAxnm36pVK5nRl2/duXMHDRs2zPD9wLCwMFy9ehXOzs74/fff0ahRo2wvKPO97Rs9ejRGjx6drbIUGTt2LCpXrow3b96IfW/37t1yD+xSbdu2xaJFixSec3V1hZ2dHV68eAEgfZuT4cOHZ1i2h4cHXrx4gRcvXsDZ2VkMAm/duoU2bdpkuU/jt/z8/FClShX8/vvv4tRda2trbN++HVu3bhW/TJF+vsuWLUP9+vURHh6OQ4cOYeXKlahSpQrq16+P2bNno169enj16hVat24tvlsr9enTJ/Tv3z/LOsXFxYnXGhgYYNGiReK+eUD63510g3tzc3OUKVMGz58/R69evVC6dGlUqFABJiYmYuDv6uqKTp06oUKFCjLlfP78WVxASCKRoEGDBpmOhhcrVkypUTZFDA0NUbNmzSzftcuLe4rUy5cvcfHiRXERGiIiIiJV0xKympv1gwiCgLlz56Jv377iw/WPcOXKFcyfPx9Xr17NMm2jRo2waNGiXNkQWhUWL14MW1tbhVNB1cmoUaPg5+cn7oGX137//XdUrVo1WyOBmkwQBHz9+hVGRkYoVKiQ3Oq0BU1O7ylt27aFk5MTVq1a9QNrSURERJSxPAsCiZSVmJiIrl27YtSoUQy8qEA7c+YMNm/ejMOHDyucskxERESkCgwCiYiIiIiINIgk6yRERERERESkLhgEEhERERERaRAGgURERERERBpEqWX60tLSEBAQABMTkwy3CCAiIiIiIvUnCAKio6Nha2sLiYRjSgWRUkFgQECAuLcZERERERGRv78/7O3t87oa9B2UCgJNTEwApP+iTU1Nf2iFiIiIiIgo/4qKioKDg4MYI1DBo1QQKJ0CampqyiCQiIiIiIj4mlgBxkm8REREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBERERERkQZhEEhERERERKRBGAQSERERERFpEAaBREREREREGoRBIBER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suWcZNLcv/MA7X5uK3etdbEiKGohP7XT0NBA7gH+8vmrSIiPR/tO8vlQ/ufz9j3Gj/gV0+dOgVURSziWlJ9v/9k/ANZFi8gt+mNgoA/HSrLvlmprayvMIy42Dr8vXCVuPk7536N/HmP8iF+xdPVC6OqmbwliYmoi8+AtpaWlJffOzrPHz1GzblXo6qX/s5jVKnyK8ggKDMbOrXvw5187c9AS+tGmjJ2Orr06wfWbUbhyFZzk0tnYFlP42sDzJ6/Q5JeKANK/EChmk/GeXBnlMW/6IoyZNJJfFuRjfx3+GyEhoZj02zhUcq6YaVp9fX25540Hdx+iWetGEBAiHsusryjK4/6df/DB5yOWrln4HS0gVfDz80P//v0xZ84clCmT8ZfGEokEpUrJr28RERGB1NRUcconkL7dQ/ny5ZXOIykpCRMnThRXIlUWg0DKc9Nm/4qI8Ai5/VX+q2ff7uLUie9VplxpbN61jps4F0BVqlXGniN/AIC4SIcihc3NsHHnmhyVlZKSim1/bkDxEg45yodUo1mrJihXMf0h/r/vYSirTLnSmDhrFM7+e/C766Gjo40/j+7g+8b52MlLR5EmpOXod7Rg1XTcfn/mu69PS0vD4OEDUKGy/EMe5Q8jxw9FWGhYjhbuadexDWJTIvDX7V3fnYedvS12HtoqfrFF+Uu5cuVw5coVAFB6g/b/0tfXx5kz338/AdKDwH379mUahCrCIJDynL2DHeyVWHzDIRdeipbOsaeCx8jYKMtvY6Xpcvq+p6mZSaaBJuUvhQubyS3K8T15xCabZ50wExaWFlknojyVG4GXY+niuP3++6+XSCQMAPO5jEZws5WHnQ0+BydmnTAT9lw4KF8zNDREtWrVcpyHdEP572VsbJztABDg6qBEREREREQahUEgERERERGRBmEQSEREREREpEEYBBIREREREWkQBoFEREREREQahEEgERERERGRBmEQSEREREREpEEYBBIREREREWkQBoFEREREREQahEEgERERERGRBmEQSEREREREpEEYBBIREREREWkQBoFEREREREQahEEgERERERGRBmEQSEREREREpEEYBBIREREREWkQBoFEREREREQahEEgERERERGRBmEQSEREREREpEEYBBIREREREWkQBoFEREREREQahEEgERERERGRBmEQSEREREREpEEYBBIR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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 可视化：滚动 vs 滑动窗口（时间轴）\n",
    "fig, axes = plt.subplots(2, 1, figsize=(10, 5), sharex=True)\n",
    "ts = np.arange(0, 26)\n",
    "for ax, kind, fc, ec in [(axes[0], '滚动窗口: 长10, 步长=10（不重叠）', '#FBE5D6', '#ED7D31'),\n",
    "                          (axes[1], '滑动窗口: 长10, 步长5（重叠，数据可属于2个窗口）', '#E2EFDA', '#548235')]:\n",
    "    ax.set_ylim(0, 1.7); ax.set_yticks([])\n",
    "    ax.scatter(ts, [0.3] * len(ts), s=22, color='#2F5597', zorder=3)\n",
    "    step = 10 if kind.startswith('滚动') else 5\n",
    "    for s in range(0, 26, step):\n",
    "        ax.add_patch(plt.Rectangle((s, 0.7), 10, 0.6, fc=fc, ec=ec, alpha=0.8))\n",
    "        ax.text(s + 5, 1.0, f'[{s},{s+10})', ha='center', fontsize=8.5)\n",
    "    ax.set_title(kind, fontsize=11, loc='left')\n",
    "    ax.set_xlim(-1, 27)\n",
    "axes[1].set_xlabel('事件时间（秒）')\n",
    "fig.suptitle('蓝点=事件；滚动窗口每条事件只属 1 个窗口，滑动窗口可属多个', fontsize=12)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd03-5",
   "metadata": {},
   "source": [
    "## 5️⃣ Watermark：允许乱序的边界"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "bd03-watermark",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T09:38:37.473687Z",
     "iopub.status.busy": "2026-10-08T09:38:37.472215Z",
     "iopub.status.idle": "2026-10-08T09:38:37.527883Z",
     "shell.execute_reply": "2026-10-08T09:38:37.515240Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "到达时间 | 当前 watermark\n",
      "    10    |    7（=最新事件时间-3，窗口关闭判断依据）\n",
      "    12    |    9（=最新事件时间-3，窗口关闭判断依据）\n",
      "    11    |    9（=最新事件时间-3，窗口关闭判断依据）\n",
      "    15    |   12（=最新事件时间-3，窗口关闭判断依据）\n",
      "    14    |   12（=最新事件时间-3，窗口关闭判断依据）\n",
      "    20    |   17（=最新事件时间-3，窗口关闭判断依据）\n",
      "    19    |   17（=最新事件时间-3，窗口关闭判断依据）\n",
      "\n",
      "  判断：事件时间 >= watermark 的事件才允许进入窗口计算；\n",
      "  小于 watermark 的事件视为迟到 -> 侧输出/丢弃/重算。\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# Watermark = 当前\"已安全\"的事件时间下限\n",
    "# 含义：watermark = max(已见事件时间) - 允许乱序延迟\n",
    "def watermark_update(seen_max_ts, max_lateness):\n",
    "    return seen_max_ts - max_lateness\n",
    "\n",
    "events_ts = [10, 12, 11, 15, 14, 20, 19]   # 乱序到达\n",
    "allow_late = 3\n",
    "wm = 0\n",
    "print('到达时间 | 当前 watermark')\n",
    "for ts in events_ts:\n",
    "    wm = max(wm, watermark_update(ts, allow_late))\n",
    "    print(f'  {ts:>4}    | {wm:>4}（=最新事件时间-{allow_late}，窗口关闭判断依据）')\n",
    "print('''\n",
    "  判断：事件时间 >= watermark 的事件才允许进入窗口计算；\n",
    "  小于 watermark 的事件视为迟到 -> 侧输出/丢弃/重算。\n",
    "''')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "07d05d9a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T09:38:37.532419Z",
     "iopub.status.busy": "2026-10-08T09:38:37.531763Z",
     "iopub.status.idle": "2026-10-08T09:38:39.717833Z",
     "shell.execute_reply": "2026-10-08T09:38:39.714478Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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REQkwySBiIiIiIhkmCQQEREREZEMkwQiIiIiIpLRz85GycnJuHDhAuLj49GwYUMYGhrmdFxERERERJRHspwknD59Gl27doUQAmZmZihYsCBOnDiRC6EREREREVFeyFJzo2fPnqFVq1YYOnQoXrx4gfv376NHjx65FRsREREREeUBhRBC6Fr5hx9+wN27d3H69OlsHUytVsPS0hJRUVGwsLDI1j6IiIiIiEg32b3/ztKbhJ07d6JPnz548eIF9u/fDz8/vywHSkREREREHzed+yQEBgYiNDQU165dw7hx42Braws/Pz/069cPf/zxR4bbJCYmIjExUVpWq9UAAI1GA41G856hExERERHR22T3nlvnJCE8PBwAcO3aNTx69Ajm5uY4ePAg3N3d8fXXX6N169Za23h6esLDw0OrPCQkBAkJCdkKmIiIiIiIdBMdHZ2t7XTuk+Dn54fSpUtj69at6Nixo1Revnx5tGjRAnPnztXaJqM3CY6OjoiIiGCfBCIiIiKiXKZWq5EvX74s90nQ+U2Ck5MT9PT0oFAoZOUmJibILM9QqVRQqVRa5UqlEkol53EjIiIiIspN2b3n1nkrY2NjNGrUCFu2bJHKXrx4gZs3b6J27drZOjgREREREX18sjSZmpeXF+rWrYt27dqhUqVKWL9+vbRMRERERESfhyy9f6hcuTIuX74MZ2dn3L9/Hz///DP27t2r1QSJiIiIiIg+XVmaTO19cTI1IiIiIqIP54NMpkZERERERJ8/JglERERERCTDJIGIiIiIiGSYJBARERERkQyTBCIiIiIikmGSQEREREREMkwSiIiIiIhIhkkCERERERHJMEkgIiIiIiIZJglERERERCTDJIGIiIiIiGSYJBARERERkQyTBCIiIiIikmGSQEREREREMkwSiIiIiIhIhkkCERERERHJMEkgIiIiIiIZJglERERERCTDJIGIiIiIiGSYJBARERERkQyTBCIiIiIiktHPSuXExESEhITIykxMTGBtbZ2jQRERERERUd7J0puEQ4cOwdHRUfbnhx9+yK3YiIiIiIgoD2TpTUJkZCRKly6N8+fPS2WGhoY5HhQREREREeWdLCcJ+fLlg5WVVS6FQ0REREREeS1LzY0iIyNhYWGRW7EQEREREdFHIMtvEoyMjPDq1SvY2tpCT0/vrfUTExORmJgoLavVagCA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",
      "text/plain": [
       "<Figure size 950x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 可视化：Watermark 单调推进与迟到数据（阶梯线）\n",
    "arrive = [1, 4, 2, 7, 3]      # 按到达顺序的事件时间\n",
    "allow = 2\n",
    "wm, hist, late = 0, [], []\n",
    "for t in arrive:\n",
    "    new_wm = max(wm, t - allow)\n",
    "    hist.append(new_wm)\n",
    "    late.append(t < new_wm)\n",
    "    wm = new_wm\n",
    "fig, ax = plt.subplots(figsize=(9.5, 4))\n",
    "ax.step(range(len(arrive)), hist, where='post', color='#2F5597', lw=2,\n",
    "        label='Watermark = max(已见事件时间) - 2')\n",
    "ax.plot(range(len(arrive)), arrive, 'o', color='#548235', ms=8, label='事件时间(到达顺序)')\n",
    "for i, t in enumerate(arrive):\n",
    "    if late[i]:\n",
    "        ax.plot(i, t, 'X', color='#C00000', ms=13, mec='k', zorder=5)\n",
    "        ax.annotate('迟到->侧输出/丢弃', (i, t), textcoords='offset points', xytext=(-60, 16),\n",
    "                    fontsize=10, color='#C00000', arrowprops=dict(arrowstyle='->', color='#C00000'))\n",
    "    ax.annotate(f'{t}s', (i, t), textcoords='offset points', xytext=(0, 8), ha='center', fontsize=9, color='#548235')\n",
    "ax.set_xticks(range(len(arrive))); ax.set_xticklabels([f'第{i+1}条' for i in range(len(arrive))])\n",
    "ax.set_ylim(-0.5, 8.5); ax.legend(fontsize=9.5); ax.grid(axis='y', alpha=0.3)\n",
    "ax.set_title('Watermark 推进：第5条 t=3s 已低于水位线 5s -> 迟到', fontsize=12)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd03-6",
   "metadata": {},
   "source": [
    "## 6️⃣ 迟到数据处理策略（面试速答）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de9761be",
   "metadata": {},
   "source": [
    "### 状态、Checkpoint 与精确一次（面试深挖版）\n",
    "\n",
    "**状态（State）**：算子在处理流数据时要\"记住\"的中间结果（如窗口内累加值、去重集合）。\n",
    "分**算子状态**与**键控状态（Keyed State）**，存储在**状态后端**（堆内存 HashMap / RocksDB，\n",
    "后者支持超大状态）。\n",
    "\n",
    "**Checkpoint（一致性快照）**：基于 **Chandy-Lamport 异步屏障快照**——\n",
    "Checkpoint 协调器向源头注入**屏障（barrier）**，屏障随数据流向下游；\n",
    "算子收到全部输入的屏障后把当前状态**快照**到远程存储，然后继续处理数据（**几乎不阻塞计算**）。\n",
    "故障恢复：所有算子从最近一次成功快照恢复状态 + 重放源数据。\n",
    "\n",
    "**精确一次（Exactly-once）**＝ Checkpoint 恢复 + **Sink 端两阶段提交**：\n",
    "屏障到来时 Sink 把数据**预提交**（写入但不对外可见），Checkpoint 完成后**正式提交**。\n",
    "配合 Kafka 事务，可做到\"故障也不多算、不少算\"。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "bd03-late",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T09:38:39.742789Z",
     "iopub.status.busy": "2026-10-08T09:38:39.742102Z",
     "iopub.status.idle": "2026-10-08T09:38:39.795141Z",
     "shell.execute_reply": "2026-10-08T09:38:39.782300Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1) 允许迟到（allowedLateness）：窗口关闭后再等一段时间；\n",
      "2) 侧输出流（sideOutput）：迟到数据单独输出，离线补偿；\n",
      "3) 直接丢弃：最简粗暴，准确性差；\n",
      "4) 水印合并（多并行度）：取最小 watermark（最保守）；\n",
      "5) 面试要点：watermark 决定\"窗口何时关\"，allowedLateness 决定\"关了还能不能补\"。\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print('''1) 允许迟到（allowedLateness）：窗口关闭后再等一段时间；\n",
    "2) 侧输出流（sideOutput）：迟到数据单独输出，离线补偿；\n",
    "3) 直接丢弃：最简粗暴，准确性差；\n",
    "4) 水印合并（多并行度）：取最小 watermark（最保守）；\n",
    "5) 面试要点：watermark 决定\"窗口何时关\"，allowedLateness 决定\"关了还能不能补\"。\n",
    "''')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd03-7",
   "metadata": {},
   "source": [
    "## 7️⃣ Flink 与 Spark Streaming 对比"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "bd03-cmp",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T09:38:39.800150Z",
     "iopub.status.busy": "2026-10-08T09:38:39.799365Z",
     "iopub.status.idle": "2026-10-08T09:38:40.112083Z",
     "shell.execute_reply": "2026-10-08T09:38:40.095082Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "| 维度 | Flink | Spark Streaming |\n",
      "|---|---|---|\n",
      "| 模型 | 真正的流（每条处理） | 微批次（秒级攒批） |\n",
      "| 延迟 | 毫秒-秒 | 秒级（批延迟） |\n",
      "| 状态 | 原生状态管理（checkpoint） | 有状态但较粗 |\n",
      "| 精确一次 | Exactly-once（两阶段提交） | 有（2.0+ 结构化流） |\n",
      "| 适用 | 实时风控/实时大屏 | 近实时批处理 |\n",
      "\n",
      "结论：新增实时项目普遍选 Flink；Spark 流适合\"批+流一体\"需求。\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print('''| 维度 | Flink | Spark Streaming |\n",
    "|---|---|---|\n",
    "| 模型 | 真正的流（每条处理） | 微批次（秒级攒批） |\n",
    "| 延迟 | 毫秒-秒 | 秒级（批延迟） |\n",
    "| 状态 | 原生状态管理（checkpoint） | 有状态但较粗 |\n",
    "| 精确一次 | Exactly-once（两阶段提交） | 有（2.0+ 结构化流） |\n",
    "| 适用 | 实时风控/实时大屏 | 近实时批处理 |\n",
    "\n",
    "结论：新增实时项目普遍选 Flink；Spark 流适合\"批+流一体\"需求。\n",
    "''')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd03-8",
   "metadata": {},
   "source": [
    "## 📝 自测清单\n",
    "\n",
    "- [ ] 能对比批/流、Lambda/Kappa\n",
    "- [ ] 能解释事件时间 vs 处理时间与乱序\n",
    "- [ ] 能手写滚动/滑动窗口\n",
    "- [ ] 能解释 watermark 的作用与计算\n",
    "- [ ] 能说出迟到数据三种处理策略"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
