荷兰群组/事件源

此包已被废弃,不再维护。未建议替代包。
此包的最新版本(0.1.0)没有可用的许可信息。

0.1.0 2015-12-24 10:44 UTC

README

broadway之上提供多个组件。

并发

同时更新聚合根可能会导致并发问题。为了解决这个问题,我们提供了一个 CommandGateway 和一个 LockingRepository,灵感来自 Axon Framework

当调用 load() 方法后,LockingRepository 将阻止对存储库的访问。当调用 save() 方法时,将释放锁。在锁定状态下尝试访问存储库将导致抛出 ConcurrencyException

然后,CommandGateway 将捕获 ConcurrencyException,并尝试重新调度命令,直到满足特定条件(取决于使用的 Scheduler 实现),否则将抛出 ConcurrencyException

重放事件

EventSourcingBundle 包含了一些命令,在执行几个简单步骤后可以方便地进行事件的重放。

标记可重放的项目

此包需要知道哪些项目是可重放的以及相应的存储库。

项目使用 'projector.replayable' 标记,使用 'repository attribute' 定义存储库。

例如

sim.read_model.projector.municipality_hostname:
        class: SIM\Settings\ReadModel\MunicipalityHostnameProjector
        arguments: [@sim.read_model.repository.municipality_hostname]
        tags:
            - { name: broadway.domain.event_listener }
            - { name: projector.replayable, repository: sim.read_model.repository.municipality_hostname}

测试项目是否已正确标记为可重放

在标记项目后,您可以使用以下命令测试结果:(别忘了清除 symfony 缓存。)

vagrant@dev:/var/www/someproject-api$ php ./app/console  simgroep:eventsourcing:projectors:list

The following projectors are available for rebuilding:
- sim.read_model.repository.municipality_hostname

您可以直接看到项目是否被标记为重建投影。

重放时间

现在到了有趣的部分 ... 重放!有三种重放形式

  • 非交互式重放(多线程)
  • 重放特定事件流
  • 交互式重放
非交互式重放

非交互式重放很简单。

php ./app/console simgroep:eventsourcing:events:replay --threads 4 all
  • 您可以定义一个特定的项目(例如:php ./app/console simgroep:eventsourcing:events:replay municipality_hostname)。
  • 您也可以定义多个项目(例如:php ./app/console simgroep:eventsourcing:events:replay 'projector1,projector2')。
  • 第三种方法是定义所有项目(例如:php ./app/console simgroep:eventsourcing:events:replay all)。

使用 "--threads" 可以定义线程数。最大线程数是 CPU 核心数乘以 2。

注意:"--threads" 不能与交互模式或重放特定流一起使用

重放特定事件流

如果您只想重放特定流的事件,那么

php ./app/console simgroep:eventsourcing:events:replay --stream 00000000-0000-0000-0000-000000000000 all
交互式重放

当时间旅行对调试目的变得重要时,您可以选择对事件存储进行交互式重放。

交互式重放包含一个额外的参数 (--interact) 和一个包含流 ID 的值。

php ./app/console simgroep:eventsourcing:events:replay --interact 00000000-0000-0000-0000-000000000000 all

如果事件存储中的事件包含提供的流 ID 并触发了所选的项目之一,则将重放每个事件

  1. 事件将首先重放,并更新第一次投影。
  2. 如果提供选项,重放将暂停,您可以选择继续或停止重放。
  3. 如果多个投影器受到此事件的影响,则将更新下一个投影器,并返回步骤 2。