我将解释我想要做什么,并想知道它是否是一个非首发,需要一个完全不同的方法,或者有一个我想念的简单解决方案 .

我有一个带有观察者的Laravel模型,在创建模型实例时将模型抛入队列 . 观察者是这样的:

class PaymentObserver { public function created(Payment $payment) { MyPaymentProcessingJob::dispatch($payment); } }

因此,当创建新的付款时,会将其添加到队列中进行处理 .

我在事务中创建了一堆付款,因为它们必须全部作为一个组提交或回滚 .

DB::transaction(function () use ($details) { foreach ($details as detail) { // Some other slower stuff in here... $payment = Payment::create($detail); $payment->save(); } });

这些新付款中的每一个都将在队列中调度作业以进行处理 . 但是,该工作将立即发送 . 该事务可能需要几秒钟才能完成 . 当它完成并提交时,由于无法看到承诺的付款,一些工作可能已经运行并且失败了 .

我想到的一些解决方法:

  • 对每个已分派的作业设置延迟 . 延迟会有些随意,并会减慢速度,所以我不会继续这样做 .

  • 从观察者中调出,并将其放入创建模型实例的过程中 . 也不是那么热衷于此,因为创建支付的过程并不直接了解观察者的行为,而这些行为是指支付创建者不依赖的包 .

  • 坚持使用laravel database 作业队列,因此作业将作为同一事务的一部分提交 . 除了在开发过程中作为快速解决方案之外,猜测这个队列方法的内容并不敏感 .

  • 最好将 save() 留到交易中的最后一个操作,但付款包括需要提前保存的子记录 .

  • 以某种方式捕获作业执行模型的"hydrating",如果数据库记录尚不存在,则重新安排作业几秒钟 . 即继续尝试以任意次数运行作业,每次之间有延迟 .

我可能缺少任何其他明显的方法?