AxonFramework,事件序列化器調優 轉

XStream序列化器

XStream是完全可配置和可擴展的。如果你只使用一個無格式XStreamSerializer,有一些速效方案隨時取用。XStream允許你爲包名稱和事件類名稱配置別名。別名通常更短(特別是如果你有長包名),使事件的序列化形式更小。由於我們討論的是XML,所以每個字符從XML中移除是兩次(一個開始標記,一個結束標記)。

在XStream中一個更高級的話題創建自定義轉換器。默認的基於反射的轉換器是簡單的,但不會生成最緊湊的XML。總是仔細觀察生成的XML,看看是否真正需要重建原始實例的所有信息。

如果有可能避免upcasters的使用。XStream允許別名用於字段,當他們已經改變了名字。想象版本爲0事件,使用一個名爲“clientId”字段。業務更喜歡“客戶”一詞,所以版本1使用被稱爲“customerId”的字段創建。在XStream中這個使用字段別名完全可以配置。你需要配置兩個別名,按照以下順序:別名“customerId”到“clientId”然後別名“customerId”到“customerId”。這將告訴XStream,如果遇到一個叫做“customerId”字段,它將調用相應的XML元素“customerId”(第二個別名覆蓋第一個)。但如果XStream遇到一個XML稱爲“clientId”的元素,這是一個已知的別名,將解析爲字段名稱“customerId”。查看XStream文檔瞭解更多信息。

對於終極性能,沒有基於反射機制的alltogether你可能更好。在這種情況下,創建一個自定義的序列化機制,這可能是最明智的。DataInputStream和DataOutputStream允許你容易將事件的內容寫入輸出流。ByteArrayOutputStream和ByteArrayInputStream允許寫入和讀取字節數組。

防止重複序列化

特別是在分佈式系統中,事件消息需要在多個場合進行序列化。Axon的組件檢測這個並支持SerializationAware消息。如果檢測到SerializationAware消息,其方法用來序列化一個對象,而不是簡單地傳遞載荷到序列化器。這允許對性能進行優化。

當你序列化你自己消息時,希望受益於SerializationAware優化,使用MessageSerializer類序列化消息的有效負載和元數據。所有優化邏輯是在這個類中實現。更多細節請參考MessageSerializer的JavaDoc。

自定義標識符生成器

AxonFramework使用IdentifierFactory生成所有的標識符,不論它們是事件或命令。默認情況下,IdentifierFactory隨機生成基於java.util.UUID的標識符。儘管它們使用起來非常安全,但生成它們的過程的性能並出色。

IdentifierFactory是一個抽象工廠,使用Java的ServiceLoader(從Java 6)機制找到實現來使用。這意味着你可以創建自己的工廠的實現,將實現的名稱放在一個叫做“/META-INF/services/org.axonframework.common.IdentifierFactory”文件中。Java的ServiceLoader機制將檢測到文件並嘗試創建名爲inside類的實例。

IdentifierFactory有幾個的需求。必須實現:

  • 在類路徑中讓它的完全限定類名作爲/META-INF/services/org.axonframework.common.IdentifierFactory文件的內容,
  • 有一個可訪問的無參數構造函數,
  • 擴展IdentifierFactory,
  • 通過應用程序的類加載器上下文或類加載器加載IdentifierFactory類來訪問,並且必須的
  • 是線程安全的。



作者:勇赴
鏈接:http://www.jianshu.com/p/801dade37318
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章