并发处理服务
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 确实也是一个共享资源,那么它可能需要自己的一些锁定,然后问题会变得越来越大,因为您 运行 在这种情况下有死锁的风险。
我有从不同进程调用的方法,有时是同时调用的。我想在该方法的某处计算折扣。为此,我创建了一个 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 确实也是一个共享资源,那么它可能需要自己的一些锁定,然后问题会变得越来越大,因为您 运行 在这种情况下有死锁的风险。