AxonFramework,Saga的基础设施

事件需要被重定向到适当的saga实例。为此,一些基础设施类是必需的。最重要的组件是SagaManager和SagaRepository。

Saga Manager

与处理事件的任何组件一样,processing也是由事件处理器完成的。然而,因为saga不是单例实例处理事件,但是有独特的生命周期,它们需要管理。

Axon通过AnnotatedSagaManager来支持生命周期管理,这是提供给一个事件Processor来执行处理器的实际的调用。它的初始化使用saga的类型来管理,也使用可以存储和恢复的SagaRepository这种saga类型。一个AnnotatedSagaManager只能管理一个saga类型。

当使用配置API时,Axon将对大多数组件使用合理的默认设置。不管怎样,强烈建议定义一个SagaStore的实现使用。SagaStore是在某处物理存储saga实例的机制,AnnotatedSagaRepository(默认)要求它们使用SagaStore去存储和检索saga实例。

Configurer configurer = DefaultConfigurer.defaultConfiguration();
configurer.registerModule(
        SagaConfiguration.subscribingSagaManager(MySagaType.class)
                         // Axon defaults to an in-memory SagaStore, defining another is recommended
                         .configureSagaStore(c -> new JpaSagaStore(...)));

// alternatively, it is possible to register a single SagaStore for all Saga types:
configurer.registerComponent(SagaStore.class, c -> new JpaSagaStore(...));

saga存储库和saga存储

SagaRepository负责存储和检索saga,使用SagaManager。它能够通过标识符和关联值检索特定的saga实例。然而,有一些特殊的要求。因为在saga中的并发处理是一个非常微妙的过程,存储库必须确保每个概念的saga实例(具有相同的标识符)只有一个实例存在于JVM。

Axon提供了 AnnotatedSagaRepository 实现,允许saga实例的查找,同时保证在同一时间只有一个saga实例被访问。它使用一个SagaStore执行saga实例实际的持久化。

实现的选择主要取决于应用程序使用的存储引擎。Axon提供了JdbcSagaStore、InMemorySagaStore JpaSagaStore 和MongoSagaStore。

在某些情况下,应用程序受益于缓存Saga实例。在这种情况下,有一个CachingSagaStore包装另一个实现添加缓存行为。
请注意,CachingSagaStore 是一 个write-through 缓存,这意味着保存操作总是立即转发到后备存储器,以确保数据安全。

JpaSagaStore

JpaSagaStore使用JPA来存储状态和关联saga的值。saga本身并不需要任何JPA注解;Axon将使用序列化器序列化saga(类似于事件序列化,你可以使用JavaSerializer或XStreamSerializer)。

JpaSagaStore通过EntityManagerProvider来配置,它提供对EntityManager实例的访问。这种抽象允许使用应用程序管理和容器管理EntityManagers。根据情况,你可以定义序列化器去序列化saga实例。Axon默认为XStreamSerializer。

JdbcSagaStore

JdbcSagaStore使用原来的JDBC存储saga实例及其关联值。类似于JpaSagaStore,saga实例不需要知道他们是如何存储的。序列化使用序列化器。

用DataSource 或ConnectionProvider初始化JdbcSagaStore 。虽然不是必需的,用ConnectionProvider初始化时,建议在UnitOfWorkAwareConnectionProviderWrapper包装实现。它将检查已经打开的数据库连接的当前工作单元,以确保工作单元中的所有活动都是在单个连接上完成的。

不像JPA,JdbcSagaRepository使用普通的SQL语句,存储和检索信息。这可能意味着某些操作依赖于数据库特有的SQL方言。情况也可能是这样,某些数据库供应商提供了你希望使用的非标准特性。允许这个,你可以提供自己的SagaSqlSchema。SagaSqlSchema接口定义的存储库的所有操作要在底层数据库上执行。它允许你定制为它们执行的SQL语句。默认是GenericSagaSqlSchema。其他可用的实现是PostgresSagaSqlSchema,Oracle11SagaSqlSchema 和HsqlSagaSchema。

MongoSagaStore

MongoSagaStore存储saga实例和它们的关联到MongoDB数据库中。MongoSagaStore存储在单个集合中的所有saga到MongoDB数据库中。每个saga实例创建一个文档。

MongoSagaStore还确保在任何时候,在单个JVM中任何唯一的saga只有一个saga实例存在。这样可以确保不因并发问题而丢失任何状态更改。

使用MongoTemplate和一个可选的序列化器初始化MongoSagaStore。MongoTemplate提供了一个对集合的引用存储Sagas。Axon 提供了DefaultMongoTemplate,DefaultMongoTemplate获取MongoClient实例,还获取数据库名称和集合的名称存储Sagas。数据库名称和集合的名称可以省略。在这种情况下,他们分别默认为“axonframework”和“sagas”。

缓存
如果使用一个支持的saga存储的数据库,保存和加载Saga 实例可能是相对昂贵的操作。特别是在很短的时间段内多次调用同一个saga实例的情况下,缓存对应用程序的性能是有利的。

Axon 提供了CachingSagaStore实现。这个SagaStore包装实际的存储。加载saga或关联值时,CachingSagaStore将首先查阅其缓存,优于委托给包装的存储库。当存储信息时,所有调用总是被委托,以确保后备存储器总是有一个与saga的状态一致的视图。

配置缓存,简单包装任何SagaStore到CachingSagaStore中。CachingSagaStore的构造函数接受三个参数:分别是,包装的存储库、用于关联值的缓存和saga的实例。后两个参数可以引用相同或不同的缓存。这取决于你的具体的程序的逐出需求。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容