并发处理服务

Concurrent processing service

我有从不同进程调用的方法,有时是同时调用的。我想在该方法的某处计算折扣。为此,我创建了一个 DiscountService,它从数据库中读取信息并计算给定客户编号的折扣。如上所述,可能会同时从具有不同客户编号的不同位置调用 main 方法。

主要方法:

// this may be called simultaneously
public void Handle(IDocument document)
{
  // document contains customer number
  ...
  // update document discount property
  this._discountService.Process(document);
  // continue processing

折扣服务:

public class DiscountService : IDiscountService
{
    private readonly IDiscountDataAccess discountDataAccess;

    private readonly ILog logger;

    public DiscountService(ILog logger, IDiscountDataAccess discountDataAccess)
    {
        this.discountDataAccess = discountDataAccess;
        this.logger = logger;
    }

    public void Process(IDiscountDocument discountDocument)
    {
        this.ProcessDiscount(discountDocument);
        discountDocument.Update();
    }

    private void ProcessDiscount(IDiscountDocument discountDocument)
    {
        Discount discount = this.GetAvailableDiscount(discountDocument);
        ...
    }
    private Discount GetAvailableDiscount(IDiscountDocument discountDocument)
    {
        // Stored proc 
        return this.discountDataAccess.GetAvailableDiscount(
            discountDocument.CustomerNumber, 
            discountDocument.StartDate, 
            discountDocument.EndDate);
    }
    ...
}

我的问题是我的 DiscountService 应该是线程安全的吗?如果是这样,我将如何处理这种情况。或者我是否需要某种类型的管理器来为每个主要方法调用 "new" DiscountService?还是这个就够了?

谢谢

编辑: 有没有做这样的事情的模式。拥有一项可以(同时)运行的服务?

有没有书、pluralsight 视频讨论 designs/patterns 这样的东西?举个例子?

一般来说,如果您从数据库中读取给定 ID 的一些内容,并且从您检索的数据中可以计算出您需要的所有内容,那么就不需要线程安全,因为您没有共享内存访问。

您的 post 不清楚所提供的 discountDocument 是否从多个线程访问,或者它是否仅在请求处理超时时存在。

据我所知,我假设 discountDocument 需要线程安全(在对象内,但这只是一个猜测,因为我不知道它还会发生什么),但是服务很好。

根据您的代码,您正在使用 discountDataAccess 进行依赖注入:

public DiscountService(ILog logger, IDiscountDataAccess discountDataAccess)
{
    this.discountDataAccess = discountDataAccess;
    this.logger = logger;
}

然后你可以像这里一样使用这个注入的服务:

private Discount GetAvailableDiscount(IDiscountDocument discountDocument)
{
    // Stored proc 
    return this.discountDataAccess.GetAvailableDiscount(
        discountDocument.CustomerNumber, 
        discountDocument.StartDate, 
        discountDocument.EndDate);
}

所以对我而言,结论是 discountDataAccess 必须是线程安全的,或者至少是 getavailablediscount。您创建或重用现有连接的可能性非常高,如果没有保护机制,将会 运行 出现问题。

DiscountDocument 通过请求进入,我假设每个请求都有不同的文档,因此问题不太可能出现在 DiscountDocument 中。

但是如果 discountDocument 确实也是一个共享资源,那么它可能需要自己的一些锁定,然后问题会变得越来越大,因为您 运行 在这种情况下有死锁的风险。