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