使用FUTURE 中的消息避免计划调度的批处理作业 - CodeOpinion


有些人称它为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 });
        }
    }
}

详细点击标题