交易系統使用storm,在消息高可靠情況下,如何避免消息重覆

来源:http://www.cnblogs.com/intsmaze/archive/2016/12/26/6219878.html
-Advertisement-
Play Games

概要:在使用storm分散式計算框架進行數據處理時,如何保證進入storm的消息的一定會被處理,且不會被重覆處理。這個時候僅僅開啟storm的ack機制並不能解決上述問題。那麼該如何設計出一個好的方案來解決上述問題? 現有架構背景:本人所在項目組的實時系統負責為XXX的實時產生的交易記錄進行處理,根 ...


概要:在使用storm分散式計算框架進行數據處理時,如何保證進入storm的消息的一定會被處理,且不會被重覆處理。這個時候僅僅開啟storm的ack機制並不能解決上述問題。那麼該如何設計出一個好的方案來解決上述問題?

  現有架構背景:本人所在項目組的實時系統負責為XXX的實時產生的交易記錄進行處理,根據處理的結果向用戶推送不同的信息。實時系統平時接入量每秒1000條,雙十一的時候,最大幾十萬條。

原文和作者一起討論:http://www.cnblogs.com/intsmaze/p/6219878.html

可接網站開發,java開發。

新浪微博:intsmaze劉洋洋哥

微信:intsmaze

  架構設計:

  storm設置的超時時間為3分鐘;kafkaspout的pending的長度為2000;storm開啟ack機制,拓撲程式中如果出現異常則調用ack方法,向spout發出ack消息;每一個交易數據會有一個全局唯一性di。

  處理流程:

  交易數據會發送到kafka,然後拓撲A去kafka取數據進行處理,拓撲A中的OnceBolt會先對從kafka取出的消息進行一個唯一性過濾(根據該消息的全局id判斷該消息是否存儲在redis中,如果有,則說明拓撲A已經對該消息處理過了,則不會把該消息發送該下游的calculateBolt,直接向spout發送ack響應;如果沒有,則把該消息發送該下游的calculateBolt。),calculateBolt對接收到來自上游的數據進行規則的匹配,根據該消息所符合的規則推送到不同的kafka通知主題中。

  拓撲B則是不同的通知拓撲,去kafka讀取對應通知的主題,然後把該消息推送到不同的客戶端(微信客戶端,支付寶客戶端等)。

  架構設計的意義:

  通過借用redis,來保證消息不會被重覆處理,對異常的消息,我們不讓該消息重發。

  因為系統只是對交易成功後的數據通過配置的規則進行區分來向用戶推送不同的活動信息,從業務上看,系統並不需要保證所有交易的用戶都一定要收到活動信息,只需要保證交易的用戶不會收到重覆的數據即可。

  但是線上上運行半年後,還是發現了消息重覆處理的問題,某些用戶還是會收到兩條甚至多條重覆信息。

  通過對現有架構的查看,我們發現問題出在拓撲B中(各個不同的通知拓撲),原因是拓撲B沒有添加唯一性過濾bolt,雖然上游的拓撲對消息進行唯一性過濾了(保證了外部系統向kafka生產消息出現重覆下,拓撲A不進行重覆處理),但是回看拓撲B,我們可以知道消息重發絕對不是kafka主題中存在重覆的兩條消息,且拓撲B消息重覆不是系統異常導致的(我們隊異常進行ack應答),那麼導致消息重覆處理的原因就一定是消息超時導致的。ps:消息在storm中被處理,沒有發生異常,而是由於集群硬體資源的爭搶或者下游介面瓶頸無法快速處理拓撲B推送出去的消息,導致一條消息在3分鐘內沒有處理完,spout就認為該消息fail,而重新發該消息,但是超時的那一條消息並不是說不會處理,當他獲得資源了,仍然會處理結束的。

   解決方案:在拓撲B中添加唯一性過濾bolt即可解決。

  個人推測:當時實時系統架構設計時,設計唯一性過濾bolt時,可能僅僅是考慮到外部系統向kafka推送數據可能會存在相同的消息,並沒有想到storm本身tuple超時導致的消息重覆處理。

  該系統改進:雖然從業務的角度來說,並不需要保證每一個交易用戶都一定要收到活動信息,但是我們完全可以做到每一個用戶都收到活動信息,且收到的消息不重覆。

我們可以做到對程式的異常進行控制,但是超時導致的fail我們無法控制。

  我們對消息處理異常控制,當發生異常信息,我們在發送fail應答前,把該異常的消息存儲到redis中,這樣唯一性過濾的bolt就會對收到的每一條消息進行判斷,如果在redis中,我們就知道該消息是異常導致的失敗,就讓該消息繼續處理,如果該消息不在redis中,我們就知道該消息是超時導致的fail,那麼我們就過濾掉該消息,不進行下一步處理。

這樣我們就做到了消息的可靠處理且不會重覆處理。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 軟體開發 軟體,即一系列按照特定順序組織的電腦數據和指令的集合。有系統軟體和應用軟體之分。 系統軟體:系統軟體系統軟體是負責管理電腦系統中各種獨立的硬體,使得它們可以協調工作。系統軟體使得電腦使用者和其他軟體將電腦當作一個整體而不需要顧及到底層每個硬體是如何工作的。比如我們講的wind ...
  • 使用java 中的Ftpclient 完成一個圖片上傳的服務,並且使用Nginx 作為代理伺服器進行圖片展示 ...
  • (1)在瀏覽器輸入地址,瀏覽器先去查找hosts文件,將主機名翻譯為ip地址,如果找不到就再去查詢dns伺服器將主機名翻譯成ip地址。 (2)瀏覽器根據ip地址和埠號訪問伺服器,組織http請求信息發送給伺服器。 (3)伺服器收到請求後首先根據Host請求頭判斷當前訪問的是哪台虛擬主機。 (4)服 ...
  • org.apache.commons.pool2.ObjectPool提供了對象池,開發的小伙伴們可以直接使用來構建一個對象池 使用該對象池具有兩個簡單的步驟: 1、創建對象工廠,org.apache.commons.pool2.BasePooledObjectFactory已經對工廠有抽象實現,所 ...
  • 靈魂寶石(1s 128MB)soulgem 【問題描述】 “作為你們本體的靈魂,為了能夠更好的運用魔法,被賦予了既小巧又安全的外形······” 我們知道,魔法少女的生命被存放於一個稱為靈魂寶石(Soul Gem)的裝置內。而有時,當靈魂寶石與軀體的距離較遠時,魔法少女就無法控制自己的軀體了。 在傳 ...
  • 用php截取中文字元串會出現各種問題,做一簡單彙總,文中的問題暫時還未解決,有大神解決了問題歡迎指教 ...
  • 今日問題: 請問主程式輸出結果是什麼?(點擊以下“【Java每日一題】20161226”查看20161223問題解析) 題目原發佈於公眾號、簡書:【Java每日一題】20161226,【Java每日一題】20161226 註:weknow團隊近期開通並認證了分答,歡迎大家收聽,有問題也歡迎到分答來咨 ...
  • Stanford University ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...