简单的事件驱动设计
總覽
開發(fā)人員經(jīng)常詢問系統(tǒng)或其代碼的性能或效率。 這到底是什么意思?
- 我的代碼是如此高效,只有編碼神能理解它的工作原理。
- 我的代碼確實(shí)很聰明,但是卻難以維護(hù)。 下一位開發(fā)人員將繼續(xù)重寫它。
- 我的代碼對機(jī)器確實(shí)很有效,但對開發(fā)人員卻沒有效率。
- 我的代碼很容易理解,這意味著開發(fā)人員會更高效,并且代碼不僅足夠快而且容易修復(fù)(如果沒有的話)。
因此,與其問自己可以編寫代碼有多快以及可以放入多少技巧,不如問自己。 我能做到多簡單,而且速度還不夠快?
簡單的事件處理。
對我來說,最簡單的事件處理是不返回任何內(nèi)容的方法調(diào)用。 這很容易轉(zhuǎn)換為異步消息傳遞,例如
public interface EventProcessor {void event(MyEventData data);void eventTwo(MyEventData2 data); }這非常簡單,一個組件通過調(diào)用方法來產(chǎn)生事件,另一個組件通過提供實(shí)現(xiàn)來消耗或處理該事件。
有多簡單?
您可以使用一個按鈕從調(diào)試器中的生產(chǎn)者組件升級到消費(fèi)者組件。
與生產(chǎn)者(調(diào)用您的消費(fèi)者)建立單元測試需要兩行代碼。
MyConsumer mc = new MyEventProcessor(); MyProducer mp = new MyProducer(mc);您可以使用任何模擬工具模擬事件處理器,并檢查生產(chǎn)者是否創(chuàng)建了您期望的事件。 您可以通過在單元測試中調(diào)用使用者上的方法來模擬生產(chǎn)者。
效果如何?
您可能會認(rèn)為這幾乎沒有開銷,一個組件只調(diào)用另一個。 但是,即使方法調(diào)用也有開銷,這就是JIT支持內(nèi)聯(lián)的原因。 這可能意味著開銷是名義上的,甚至比方法一起優(yōu)化時的開銷要少(即,這可能比兩種方法的總和要快得多)
我想念什么嗎?
實(shí)際上確實(shí)有很多遺漏,但與業(yè)務(wù)需求無關(guān);
- 運(yùn)輸工具。
- 監(jiān)控
- 序列化
- 故障轉(zhuǎn)移
- 服務(wù)發(fā)現(xiàn)
- 安全
這些是單獨(dú)的問題,通常不是應(yīng)用程序本質(zhì)復(fù)雜性的一部分。
我可以使用什么交通工具?
有太多選擇,不可能知道將來所有情況下都適用。 因此,運(yùn)輸?shù)倪x擇(或缺乏運(yùn)輸)應(yīng)為配置詳細(xì)信息。 設(shè)計的唯一基本部分應(yīng)該是可以輕松更換運(yùn)輸裝置,而不必觸碰您的業(yè)務(wù)邏輯。
運(yùn)輸?shù)囊粋€例子?
低延遲,高吞吐量的解決方案是使用Chronicle Queue。 重復(fù)自己; 您只需要在合理的情況下使用它,否則就可以使用任何其他交通工具。
編年史隊(duì)列做什么?
- 保留每條消息的重播功能并檢查錯誤修復(fù)。
- 低延遲序列化,支持模式更改,并具有可讀性以進(jìn)行驗(yàn)證
- 記錄和監(jiān)視。
最后一點(diǎn)很重要。 如果您已經(jīng)堅(jiān)持了組件要執(zhí)行的每個動作以及每個狀態(tài)都發(fā)生了變化,則在正常操作中不需要任何其他日志記錄。 任何下游組件都可以重新創(chuàng)建其感興趣的狀態(tài),而無需接觸產(chǎn)生該信息的組件。
編年史隊(duì)列如何做到這一點(diǎn)?
編年史隊(duì)列使用兩個組件;
- 實(shí)現(xiàn)您的界面的作家。 每個方法調(diào)用都會寫入一條消息。
- 一個讀取器,調(diào)用您的接口的實(shí)現(xiàn)。 每個消息都調(diào)用相應(yīng)的方法。
注意:這種策略幾乎可以用于任何運(yùn)輸。 編年史隊(duì)列為您提供的是低延遲記錄或用于重播和替換日志的所有消息。
這一切表現(xiàn)如何?
如果您使用諸如YAML,Binary YAML或JSON之類的靈活序列化,并且您的組件沒有做太多事情,那么您可以期望獲得每秒約100,000條消息的吞吐量,而無需進(jìn)行大量調(diào)整。 如果使用較低級別的二進(jìn)制協(xié)議,短消息和多個線程,則每秒可以獲得超過1000萬條消息。
您可以選擇免費(fèi)使用所有這些GC,但這會使您的設(shè)計復(fù)雜化,因此很可能會產(chǎn)生一些垃圾,但是您可以選擇根據(jù)需要減少垃圾。
其他值得注意的交通工具。
Aeron是一種基于UDP的低延遲傳輸。
Chronicle Queue Enterprise支持通過TCP進(jìn)行復(fù)制和遠(yuǎn)程訪問。
Chronicle Websocket Jetty支持通過websocket訪問JSON,消息速率約為100K / s
結(jié)論
您應(yīng)該開始設(shè)計和測試,著重于實(shí)際需要的關(guān)鍵組件。 您應(yīng)該允許您的設(shè)計適用于任何運(yùn)輸方式,并可以選擇用一種替代另一種。
在單元測試和調(diào)試中,不進(jìn)行傳輸以表明組件仍可以以最小的復(fù)雜度運(yùn)行是很有用的。
我們能幫你什么嗎?
Chronicle Software在現(xiàn)場研討會上運(yùn)行了一個星期,我們會訓(xùn)練/指導(dǎo)您的團(tuán)隊(duì)使用這些設(shè)計方法來構(gòu)建原型系統(tǒng)。 解決方案的選擇取決于您,因此這可能是啟動新項(xiàng)目并進(jìn)行培訓(xùn)的好方法,這將立即有用。 有關(guān)更多詳細(xì)信息,請聯(lián)系sales@chronicle.software 。
翻譯自: https://www.javacodegeeks.com/2016/03/simple-event-driven-design.html
總結(jié)
- 上一篇: ddos攻击怎么防(ddos怎么防打)
- 下一篇: jit即时编译_热点中的即时编译器(JI