AxonFramework,高級定製 轉

參數解析器

你可以配置額外的ParameterResolvers,通過擴展ParameterResolverFactory類和創建一個名爲/META-INF/service/org.axonframework.common.annotation.ParameterResolverFactory的文件,包含實現類的完全限定名稱。

警告
此時,OSGi支持僅限於在清單文件中被提到的所需的頭這一事實。ParameterResolverFactory實例的自動檢測在OSGi上工作,但由於類加載器的侷限性,它可能需要複製/META-INF/service/org.axonframework.common.annotation.ParameterResolverFactory 文件的內容到OSGi包,包含用於解析參數的類(即事件處理程序)。

Meta Annotations

TODO

Customizing Message Handler behavior

TODO

性能調優

待辦事項:更新Axon3
本章包含一個清單和在爲生產級性能做準備時需要考慮的一些指導方針。現在,你可能已經使用了測試固件測試你的命令處理邏輯和sagas。然而,生產環境不像測試環境那麼寬容。聚合往往存活得更久,更頻繁地和併發的使用。對於額外的性能和穩定性,你最好調整配置滿足你的具體需求。

數據庫索引和列類型

SQL DatabasesSQL數據庫

如果你使用你的JPA實現自動生成表(例如Hibernate),你可能沒有把所有正確的索引設置在你的表上。爲獲得最佳性能,事件存儲的不同用法需要不同的索引設置。該列表顯示,爲默認EventStorageEngine實現使用的不同類型的查詢添加不同類型的索引:

  • 標準操作使用(存儲和加載事件):
    Table 'DomainEventEntry', columns aggregateIdentifier and sequenceNumber (unique index)
    Table 'DomainEventEntry', eventIdentifier (unique index)
  • 快照:
    Table 'SnapshotEventEntry', aggregateIdentifier column.
    Table 'SnapshotEventEntry', eventIdentifier (unique index)
  • Sagas
    Table 'AssociationValueEntry', columns associationKey and sagaId,

默認生成的列長度可以工作,例如Hibernate,但不會是最優的。例如,一個UUID總是有相同的長度。而不是可變長度列255個字符,你可以爲聚合標識符使用一個固定長度36個字符的列。

“時間戳”列在DomainEventEntry表只儲存ISO 8601時間戳。如果所有時間存儲在UTC時區,他們需要一個長度爲24個字符的列。如果你使用另一個時區,這可能高達28位。使用可變長度列通常是沒有必要的,因爲時間戳總是具有相同的長度。

警告
強烈建議所有時間戳以UTC格式存儲。在夏令時的國家,用當地時間存儲時間戳,在時區轉換時可能會導致事件生成的順序錯誤。使用UTC時不會發生這種情況。有些服務器配置爲始終使用UTC。另外你應該在存儲它們之前配置事件存儲將時間戳轉換成UTC。

在DomainEventEntry中的“type”列存儲聚合的標識符類型。一般來說,這些都是聚合的簡單的名稱。在Spring中事件臭名昭著的“AbstractDependencyInjectionSpringContextTests”只算45個字符。在這裏,再一次,一個長度較短(但可變)的字段應該足夠了。

MongoDB

默認情況下,MongoEventStore只會爲正確的操作生成它需要的索引。這意味着當事件存儲被創建時,所需的惟一索引在“聚合標識符”、“聚合類型”和“事件序列號”上也被創建。然而,當爲某些操作使用MongoEventStore時,可能是值得添加一些額外索引的。

注意,在查詢優化和更新速度之間的總有一個平衡點。負載測試最終是發現哪些索引提供最佳性能的最好方法。

  • 正常操作使用:
    在“aggregateIdentifier”上自動創建一個索引,“type”和“sequenceNumber”在領域事件(缺省名稱:“domainevents”)集合中。
  • Snapshotting:
    在事件快照(缺省名稱:“snapshotevents”)集合中把(unique)索引放“aggregateIdentifier”,“type”和“sequenceNumber“上。
  • Replaying events:
    在領域事件(缺省名稱:“domainevents”)集合中,把非唯一索引放在“timestamp”和“sequenceNumber”上。
  • Sagas:
    在saga(默認名稱:“sagas”)集合中把(唯一)索引放到“sagaIdentifier”上。
    在saga(默認名稱:“sagas”)集合中把索引放到”sagaType”、“associations.key”和“associations.value“屬性上。

Caching

一個設計良好的命令處理模塊當實現緩存時應該不會構成任何問題。尤其是當使用事件溯源時,從事件存儲中加載一個聚合是一項昂貴的操作。用正確配置的緩存,加載一個聚合可以轉化爲一個純粹的in-memory過程。

下面是一些幫助您最大限度地利用緩存解決方案的指導原則:

  • 確保工作單元永遠不需要爲功能原因執行回滾。
    回滾意味着一個聚合已經達到了一個無效的狀態。Axon會自動將相關的緩存項失效。下一個請求將迫使聚合從事件中重建。如果你使用異常作爲一個潛在的(功能的)返回值,你可以在命令總線上配置一個RollbackConfiguration。默認情況下,當運行時異常時這個工作單元將回滾。

  • 單個聚合的所有命令必須到達在緩存中具有該聚合的機器上。
    這意味着命令應該始終被路由到同一臺機器,只要這臺機器是“健康”的。路由命令總是阻止緩存過期。命中一個過期緩存將導致一個命令被執行,並且事件存儲在事件存儲中會失敗。

  • 配置一個合理的生存時間/閒置時間
    默認情況下,緩存傾向於有一個相對較短的生存時間,即幾分鐘。對於具有一致的路由的命令處理組件,一個較長的閒置時間和生存時間通常是更好的。這可以防止需要初始化一個基於它的事件的聚合,僅僅因爲它的緩存條目過期了。緩存的生存時間應該與你的聚合的預期壽命相匹配。

Snapshotting

快照刪除需要重載和重放大量的事件。單個快照代表在在某一特定時刻整個聚合狀態。然而,快照的處理本身也需要處理時間。因此,在構建快照時所花費的時間和阻止許多事件被讀取節省的時間應該保持平衡。

對所有類型的應用程序都沒有默認行爲。一些將指定一些事件之後將創建一個快照,而其他應用程序需要一個基於時間的快照間隔。無論你選擇何種方式爲您的應用程序,如果你有long-living聚合,確保快照就位。



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

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