【问题标题】:Can this cause a race condition in Event Sourcing这会导致事件溯源中的竞争条件吗
【发布时间】:2022-09-23 15:58:38
【问题描述】:

我们正在使用事件溯源(特别是 PHP、Laravel 和 Spatie 的 EventSourcing 库,但我认为我的问题一般与事件溯源有关)

我们有两个投影仪 - (即“监听器”,代码将运行)

ProjectorA::onEnrollmentCreated(){
    // does a db update to set status to \'pending\'
}

ProjectorB::onEnrollmentCreated(){
    // does some own code, AND THEN records event `onEnrollmentApproved`,
    // which does a db update to set status to \'approved\'
}

对于这个问题,我认为这是足够的代码来展示。期望的效果是注册最终状态为“已批准”

我的问题是:

对我来说,这些监听器似乎是异步运行的函数,因此 ProjectorA 中可能会出现打嗝,这会导致它最后完成并将状态设置回“待定”

我的队友说投影仪的工作方式,onEnrollmentCreated 将始终在 onEnrollmentApproved 允许启动之前完成。这对我来说毫无意义,所以我的问题是:

您能否向我解释一下,或者给我一些链接,我可以更深入地了解事件溯源的这一特定方面?

蒂亚!

    标签: php event-sourcing


    【解决方案1】:

    你说的对。不能真正保证ProjectorB 总是在ProjectorA 之后运行。尽管默认情况下事件确实以同步方式运行(除非经过调整),但投影仪不会监听它们。

    要管理订单,您可以将weight 属性添加到您的投影仪类并确保您的投影仪类没有实现docs 中提到的ShouldQueue 接口。

    从那里引用:

    您可以将权重属性添加到投影仪以调整顺序 投影仪运行。重量较轻的投影仪首先运行。什么时候 没有提供明确的权重,权重被认为是 0。

    namespace App\Projectors;
    
    use Spatie\EventSourcing\EventHandlers\Projectors\Projector;
    
    class MyProjector extends Projector
    {
        public int $weight = 5;
        
        //
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      相关资源
      最近更新 更多