首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

即時運算核心原理:從傳統批處理到流式計算的演進

     編輯:Java 相關知識

什麼是即時運算?簡單說,就是資料產生的那一刻就被處理、分析並產出結果,無需等待離線批次作業。本文以「20 分鐘內熱銷商品 Top 10」為例,剖析傳統架構的痛點,並示範如何用 Storm 實現滑動窗口計數,揭開流式計算的神祕面紗。

傳統批處理的三大困境

  1. 水平擴展難: 交易資料綁定關聯式資料庫事務,難以遷移至 NoSQL;分表後的 Join 與聚合在 20 分鐘窗口內幾乎無法完成。
  2. 效能瓶頸: 頻繁落地、跨節點聚合導致延遲飆升,業務層單點計算能力成為短板。
  3. 業務擴展受限: 若需同時統計廣告點擊、用戶畫像等,業務邏輯會指數級膨脹。

流式計算新範式

核心思想:世界發生的事是即時的,計算模型也應該是即時的。 採用 Storm 等流式引擎,具備原生水平擴展、容錯與低延遲特性,免去手動分片與一致性煩惱。

滑動窗口實戰:Storm 實現 20 分鐘熱門微博話題

1. 資料來源與建模

  • 資料流:微博長連接推送的原始文本。
  • 話題定義:以 # 包裹的字串,如 #世界#、#微博#。

2. 時間語義與 Tick 機制

Storm 內建 TOPOLOGY_TICK_TUPLE_FREQ_SECS,Executor 定期發送 System Tick Tuple,下游 Bolt 收到即觸發窗口滾動與結果發射。

public static boolean isTick(Tuple tuple) {
    return tuple != null
        && Constants.SYSTEM_COMPONENT_ID.equals(tuple.getSourceComponent())
        && Constants.SYSTEM_TICK_STREAM_ID.equals(tuple.getSourceStreamId());
}

3. 拓撲結構

builder.setSpout("wordGenerator", new TestWordSpout(), 5);
builder.setBolt("counter", new RollingCountBolt(9, 3), 4)
       .fieldsGrouping("wordGenerator", new Fields("word"));
builder.setBolt("intermediateRanker", new IntermediateRankingsBolt(TOP_N), 4)
       .fieldsGrouping("counter", new Fields("obj"));
builder.setBolt("totalRanker", new TotalRankingsBolt(TOP_N))
       .globalGrouping("intermediateRanker");

4. 關鍵 Bolt 邏輯

  • RollingCountBolt: 收到 Tick 時輸出當前窗口計數並滾動窗口;普通 Tuple 則累加計數。
  • IntermediateRankingsBolt / TotalRankingsBolt: 分層聚合排序,Tick 到來時發射 Top-N,其餘時間合併更新排名。

最終輸出即為 t0 - t1 時段內的熱門話題榜單,完美解決「這個世界正在發生什麼」的即時洞察需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved