使用FUTURE 中的訊息避免計劃排程的批處理作業 - CodeOpinion

banq發表於2022-07-05

有些人稱它為cron作業,計劃任務,或批處理作業。不管你怎麼稱呼它,它是一個定期執行的程式,檢視資料庫的狀態,以確定對它發現的各種記錄採取的一些具體行動。
如果你處理過這個問題,你可能知道這可能是一場噩夢,尤其是失敗的情況。

避免批處理工作
你可以避免批量作業,並通過告訴你的系統在FUTURE 做一些事情,來擁有較小的工作單位的隔離。利用支援延遲交付的佇列就是一個例子,你可以完成這個任務。

工作負載將在不同的時間段被平滑化,並提供隔離,因此你可以在單個工作層面上處理故障。

在下面的線上訂單的例子中,這意味著一旦訂單被預訂,並且物品被從貨架上取走,我們就會發出一個 "過期預訂 "的訊息,並延遲7天交貨。7天后,我們將處理該 "過期預訂 "資訊。如果訂單已經完成,這個過程只是提前退出。如果還沒有完成,它就會進行信用卡退款,並更新資料庫,將訂單設定為取消。

public class ReserveOrderHandler : IHandleMessages<ReserveOrder>
{
    private readonly Reservation _reservation;

    public ReserveOrderHandler(Reservation reservation)
    {
        _reservation = reservation;
    }

    public async Task Handle(ReserveOrder message, IMessageHandlerContext context)
    {
        if (_reservation.Reserve(message.OrderId))
        {
            var expireOptions = new SendOptions();
            expireOptions.DelayDeliveryWith(TimeSpan.FromDays(7));
            await context.Send(new ExpireReservation { OrderId = message.OrderId }, expireOptions);

            await context.Publish(new OrderReserved { OrderId = message.OrderId });
        }
    }
}

詳細點選標題

相關文章