一個典型的後臺軟體系統的設計復盤——(二)打通任督二脈-context

来源:http://www.cnblogs.com/syjkfind/archive/2017/03/12/6538266.html
-Advertisement-
Play Games

武俠小說練功講究打通任督二脈。程式設計練到一定程度也講究打通任督二脈。好奇心強的同學可以搜搜“打通任督二脈有什麼感覺”。 spring的任督二脈ApplicationContext 最經典的任督二脈莫過於java中spring中的ApplicationContext。用慣spring的都會覺得,這裡 ...


武俠小說練功講究打通任督二脈。程式設計練到一定程度也講究打通任督二脈。好奇心強的同學可以搜搜“打通任督二脈有什麼感覺”。

spring的任督二脈ApplicationContext

最經典的任督二脈莫過於java中spring中的ApplicationContext。用慣spring的都會覺得,這裡是這個各種實例的起源。概念解釋就不搬磚了,見官網 http://spring.io/understanding/application-context
於是乎,以前創建個jdbc需要 Class.forname() 一大堆反射出工廠類再 getConn() 得到個連接,現在只需要 context.getBean("配置名") 就能得到,還能有datasource各種實現以及高級的事務封裝。而實際使用時更方便只需要個 @Autowired 。spring興起之時大家都是在熱議其實現了IoC控制反轉原則,現在看來不僅如此,更重要的是,構造了整個bean管理體系BeanFactory,並用ApplicationContext打通了應用的任督二脈。

曾見過一個稍微複雜的應用,Oracle一主一從一物理從,可是稍微用起來就資料庫連接數不足。排查原因竟是ApplicationContext新建了三處,也就是說相應的連接池創建了三個。這裡延伸出另一個概念,叫容器。官方的說法是,BeanFactory就是一個容器,ApplicationContext則是前者的擴展,也是個容器。在這個容器里,任督二脈是打通的,bean是創建好的、管理好的、相應依賴關係是清晰的。但現在的應用伺服器多種多樣,比如spring容器、spring boot容器、tomcat容器、dubbo容器,想清楚它們之間是否打通,可以避免一些很幽靈的坑。

scoping和lifecycle-作用範圍和生命周期

應用1能不能通過ApplicationContext訪問到應用2的類或對象?正常情況下不可以,這就是作用範圍。而生命周期,則是指對象什麼時候創建什麼時候銷毀什麼時候變換狀態。

對這兩個概念更好的理解是資料庫事務。比如某用戶賬上有10元,操作1給他存入20元還沒提交,操作2查詢他當前賬戶餘額,若兩個操作在同個事務則查到結果為30元,若兩個操作是不同事務則查到結果為10元,事務隔開了兩者的作用範圍。而操作1什麼時候生效則是生命周期:開啟事務-更新餘額-提交資料庫-成功關閉或失敗回滾。

復盤業務場景的任督二脈

這裡的場景是商品-訂單-調度任務的打通。首先訂單分彙總order和商品項detail,detail記錄商品快照和批次也是很常識的。然後detail觸發個調度任務job去執行。
然而job開始結束成功失敗都應該回來通知訂單啊。job-detail有關聯,沒毛病。
然後需求變更了,有的job是單個detail,有的job是若幹detail。依然可以detail指向job,沒毛病。

又需求變更了,完成一個detail會有若幹個job。。。第一反應當然是多對多。可是要按訂單列出哪批detail做完了,order-detail-job並group by job未免太繞,於是建了一層訂單拆分detailGroup。然而,真實的需求是,商品按貨架歸集,貨架1的是若幹個detail一起做,貨架2的是單個detail,又引入一層實體為detailByShelf。

場景是:對於貨架1,detailByShelf近似於detailGroup。對於貨架2,detailByShelf用於呈現,按貨架列出詳情;detailGroup僅有單個detail且用於job。
job要回來更新訂單狀態,通過detailGroup即可。查詢要按貨架列出,則查詢detailByShelf即可。用detailGroup把job和detail串起來放進job execution context,任督二脈算是打通了。

然而需求並沒有就這樣停止。job會拆解成多個step,某些step會更新對應的detail。也就是說,step要和detail掛鉤。然而特定的step是要更新整個detailGroup的狀態的。。。

所以,更精細的設計是:step-step context根據不同類型掛鉤不同的訂單項-detail或detailGroup。而狀態更新通知是:

step狀態彙總到job
step狀態更新到detailGroup或detail,都彙總到detailGroup
detail彙總到detailByShelf再彙總到order

如何驗證這個任督二脈是否完整打通了呢?可以套三個場景。
1.step的狀態(比job更精細)能更新到detail的所有層級。
2.某一步step正在執行,可以追蹤到整個訂單以及其中的哪一項,比如 step - detail/detailGroup - order。
3.按貨架列出可以找到當前正在執行的是那一步以後,比如detailByShelf-detail-step-job
再者,哪些job是服務於同個detailGroup,也要能串起來。

所以,整個完整的打通是:
job-detailGroup,若幹個調度任務來完成一批商品
step-detail和step-detailGroup,一個步驟操作對應的整批或這批中的一個商品項
至此,整個任督二脈算是打通了,任務可以找到對應訂單或商品,訂單商品可以找到對應任務和步驟。

 

整個場景非常混淆的兩個點是:
1.detailByShelf只是查詢場景要用,不能混入context。因為對於貨架2,一個job只做一個detail項,detailByShelf根本不能表達相應的關係。
2.step什麼時候關聯detailGroup?不是整批或單個商品項的區別,而是這個step本身的不同。

 

如果問我,程式打通任督二脈是什麼感覺?我會回答,應該是,程式中想要的關聯信息都能取到,資料庫中想要的信息用幾個簡單查詢就能撈出來 的感覺吧。


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

-Advertisement-
Play Games
更多相關文章
  • 前述: 在學習單例模式後,對老師課上佈置的課後作業,自然要使用單例模式,但是不是一般的單例,要求引起我的興趣,案例是用伺服器。 老師佈置的要求是:伺服器只有一個,但是使用這個伺服器時候可以有多個對象(原版的)和備份資料庫,也就是至少要兩個對象,因為有可能伺服器對象會垮掉,所以要用備份的,所以這裡要考 ...
  • 本視頻為activiti工作流的web流程設計器整合視頻教程 整合Acitiviti線上流程設計器(Activiti-Modeler 5.21.0 官方流程設計器) 本視頻共講了兩種整合方式 1. 流程設計器和其它工作流項目分開部署的方式 2. 流程設計器和SSM框架項目整合在一起的方式 視頻大小 ...
  • 很多人都需要與微信的api對接。 今天我這裡就分享全套的企業微信api介面的代碼。 關於微信api,網上已經有很多實現的了。 但是我今天之所以還寫這個,是因為網上基本上找不到面向對象的api介面實現的編程,幾乎都是“面向過程”的。 本文章的代碼,也許能帶給你極大的方便,以及非常方便的擴展和應用。 ...
  • 需求分析: 有個廠家,下麵有很多代理商(商戶或門頭等),之前商戶進貨、庫存、銷售、客戶資料等記錄在excel表格中 或者無記錄,管理比較混亂,盈利情況不明。不能有效瞭解店鋪經營情況和客戶跟蹤記錄 廠家也不能實時瞭解下麵代理商的經營狀況和庫存情況 解決方案: 本系統角色主要分兩個層級:總管理(廠家), ...
  • 功能概要:數據定時更新,可查詢歷史數據。詳細說明:1、現在有個排行榜需要幾分鐘更新一次,所以我使用了windows服務定時運行;一次的數據量在30萬左右,這樣可能到下次更新時本次的任務沒有運行完成,所以遇到這種情況就等待下次任務觸發時再運行更新。 2、當運行更新時,不斷有數據插入到榜單表,為了不影響 ...
  • 閉包是一個比較抽象的概念,尤其是對js新手來說.書上的解釋實在是比較晦澀,對我來說也是一樣. 但是他也是js能力提升中無法繞過的一環,幾乎每次面試必問的問題,因為在回答的時候.你的答案的深度,對術語的理解以及js內部解釋器的運作方式的描述,都是可以看出你js實際水平的.即使你沒答對,也能讓考官對你的 ...
  • 世界上本來沒有設計模式。用的人多了,也就成了設計模式。所以,我們不是嚴格按照它的定義去執行,可以根據自己的實際場景、需求去變通。領悟了其中的思想,實現屬於自己的設計模式。 你肯定有過這樣的體會。某某時候,聽人說起**模式。這麼牛逼,回去得看看。結果仔細一看原來自己早就是這麼用了,只是不知道它還有個這... ...
  • 一、Java的起源 最初是為家用電器設計的,因為其特點適合於internet, 於是通過internet成為一種計算語言,一個平臺,一個網路計算的架構。 二、Java平臺分類 ①JavaSE適用於普通PC及筆記本電腦,為其他JAVA程式的開發和運行提供了最基本的技術支持。 ②JAVAEE適用於企業級 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...