摘要:典型場景二上游不關心執行結果上游需要關注執行結果時要用調用,上游不關注執行結果時,就可以使用了。
【典型場景一:數據驅動的任務依賴】
什么是任務依賴,舉個栗子,互聯網公司經常在凌晨進行一些數據統計任務,這些任務之間有一定的依賴關系,比如:
1)task3需要使用task2的輸出作為輸入
2)task2需要使用task1的輸出作為輸入
這樣的話,tast1, task2, task3之間就有任務依賴關系,必須task1先執行,再task2執行,載task3執行。
對于這類需求,常見的實現方式是,使用cron人工排執行時間表:
1)task1,0:00執行,經驗執行時間為50分鐘
2)task2,1:00執行(為task1預留10分鐘buffer),經驗執行時間也是50分鐘
3)task3,2:00執行(為task2預留10分鐘buffer)
這種方法的壞處是:
1)如果有一個任務執行時間超過了預留buffer的時間,將會得到錯誤的結果,因為后置任務不清楚前置任務是否執行成功,此時要手動重跑任務,還有可能要調整排班表
2)總任務的執行時間很長,總是要預留很多buffer,如果前置任務提前完成,后置任務不會提前開始
3)如果一個任務被多個任務依賴,這個任務將會稱為關鍵路徑,排班表很難體現依賴關系,容易出錯
4)如果有一個任務的執行時間要調整,將會有多個任務的執行時間要調整
無論如何,采用“cron排班表”的方法,各任務耦合,誰用過誰痛誰知道(采用此法的請評論留言)
優化方案是,采用MQ解耦:
1)task1準時開始,結束后發一個“task1 done”的消息
2)task2訂閱“task1 done”的消息,收到消息后第一時間啟動執行,結束后發一個“task2 done”的消息
3)task3同理
采用MQ的優點是:
1)不需要預留buffer,上游任務執行完,下游任務總會在第一時間被執行
2)依賴多個任務,被多個任務依賴都很好處理,只需要訂閱相關消息即可
3)有任務執行時間變化,下游任務都不需要調整執行時間
需要特別說明的是,MQ只用來傳遞上游任務執行完成的消息,并不用于傳遞真正的輸入輸出數據。
【典型場景二:上游不關心執行結果】上游需要關注執行結果時要用“調用”,上游不關注執行結果時,就可以使用MQ了。
舉個栗子,58同城的很多下游需要關注“用戶發布帖子”這個事件,比如招聘用戶發布帖子后,招聘業務要獎勵58豆,房產用戶發布帖子后,房產業務要送2個置頂,二手用戶發布帖子后,二手業務要修改用戶統計數據。
對于這類需求,常見的實現方式是,使用調用關系:
帖子發布服務執行完成之后,調用下游招聘業務、房產業務、二手業務,來完成消息的通知,但事實上,這個通知是否正常正確的執行,帖子發布服務根本不關注。
這種方法的壞處是:
1)帖子發布流程的執行時間增加了
2)下游服務當機,可能導致帖子發布服務受影響,上下游邏輯+物理依賴嚴重
3)每當增加一個需要知道“帖子發布成功”信息的下游,修改代碼的是帖子發布服務,這一點是最惡心的,屬于架構設計中典型的依賴倒轉
優化方案是,采用MQ解耦:
1)帖子發布成功后,向MQ發一個消息
2)哪個下游關注“帖子發布成功”的消息,主動去MQ訂閱
采用MQ的優點是:
1)上游執行時間短
2)上下游邏輯+物理解耦,除了與MQ有物理連接,模塊之間都不相互依賴
3)新增一個下游消息關注方,上游不需要修改任何代碼
【典型場景三:上游關注執行結果,但執行時間很長】有時候上游需要關注執行結果,但執行結果時間很長(典型的是調用離線處理,或者跨公網調用),也經常使用回調網關+MQ來解耦。
舉個栗子,微信支付,跨公網調用微信的接口,執行時間會比較長,但調用方又非常關注執行結果,此時一般怎么玩呢?
一般采用“回調網關+MQ”方案來解耦:
1)調用方直接跨公網調用微信接口
2)微信返回調用成功,此時并不代表返回成功
3)微信執行完成后,回調統一網關
4)網關將返回結果通知MQ
5)請求方收到結果通知
這里需要注意的是,不應該由回調網關來調用上游來通知結果,如果是這樣的話,每次新增調用方,回調網關都需要修改代碼,仍然會反向依賴,使用回調網關+MQ的方案,新增任何對微信支付的調用,都不需要修改代碼啦。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72789.html
摘要:而每個文件系統又可以設置不同的調度算法,另外,還有虛擬內存缺頁中斷帶來的性能毛刺良心的提供了調優的腳本,這點做的不錯跑題了。測試環境核線程內存磁盤讀寫左右虛擬內存未關閉,大小測試注意點為了防止緩存的影響,每次都生成一個新的文件進行讀取。 前言 Java 在 JDK 1.4 引入了 ByteBuffer 等 NIO 相關的類,使得 Java 程序員可以拋棄基于 Stream ,從而使用基...
本文是公眾號讀者jianfeng投稿的面試經驗恭喜該同學成功轉型目錄:毅然轉型,沒頭蒼蠅制定目標,系統學習面試經歷毅然轉崗,沒頭蒼蠅首先,介紹一下我的背景。本人坐標廣州,2016年畢業于一個普通二本大學,曾經在某機構培訓過Android。2018年初的時候已經在兩家小公司工作干了兩年的android開發,然后會一些Tomcat、Servlet之類的技術,當時的年薪大概也就15萬這樣子。由于個人發展...
摘要:已預留擴展,可以實現自己的模塊你想好了嗎你是否真的需要這樣的一個工具,到底是異步還是同步,什么樣的才可以稱的上任務。異步分布執行雖然可以提高系統吞吐量,但它是在高于一定得計算量請求量的情況下才可以顯現出來這一特點。 Task系統設計與使用 Task是一個輕量級的分布式任務計算系統,他可以幫助你快速編寫一個可以在集群環境下運行的分布式方法,而這只需要你使用一行代碼就可以在你原有的方法上做...
閱讀 1625·2023-04-25 14:12
閱讀 1097·2021-08-27 16:24
閱讀 2548·2019-08-30 15:44
閱讀 2927·2019-08-30 13:16
閱讀 1683·2019-08-29 14:10
閱讀 978·2019-08-29 13:54
閱讀 1311·2019-08-29 13:09
閱讀 1824·2019-08-26 18:37