Multithreading 设计问题:当多个操作需要服务时,从单个操作或管理器调用服务
Multithreading 设计问题:当多个操作需要服务时,从单个操作或管理器调用服务,multithreading,caching,Multithreading,Caching,我有一个执行a、B、C的操作列表(这个列表可以增长),它执行完全不同的操作。每个操作都由单独的java类执行。有一位经理坐在最上面,叫a、B、C
执行操作(A、B、C)的类需要为此调用不同的服务X1、X2、X3、X4、X5。我们有包装类WX1、WX2、WX3、WX4、WX5来调用服务。我们从A、B、C发出的一些呼叫是常见的(比如WX3、WX4)。(可以是A、B、C中的两个,也可以是其中的三个)
现在我们应该从哪里调用X1,X2,X3,X4,X5。理想情况下,A、B、C中的每一个都应该调用所需的服
我有一个执行a、B、C的操作列表(这个列表可以增长),它执行完全不同的操作。每个操作都由单独的java类执行。有一位经理坐在最上面,叫a、B、C
执行操作(A、B、C)的类需要为此调用不同的服务X1、X2、X3、X4、X5。我们有包装类WX1、WX2、WX3、WX4、WX5来调用服务。我们从A、B、C发出的一些呼叫是常见的(比如WX3、WX4)。(可以是A、B、C中的两个,也可以是其中的三个)
现在我们应该从哪里调用X1,X2,X3,X4,X5。理想情况下,A、B、C中的每一个都应该调用所需的服务。但对于所有A、B、C共享的服务,从MngrY调用并将服务调用的输出发送给A、B、C中的每一个是否有意义(这在效率方面是有意义的,但在设计方面是有意义的,因为MngrY不应该知道A、B、C是如何运行的)
所以选择是
从MngrY调用公共服务调用(WX3、WX4),并从单个组件单独调用。设计好吗
拨打MngrY经理的所有服务电话。它会扩大吗?我们将来可能不得不提出大量的服务请求,为了其他人,我们正在阻止每个模块,并且在设计方面使MnagrY了解每个模块的需求
根据需要从单个组件(根据需要)进行所有服务调用,并通过缓存使包装器处理重复的请求。依靠缓存不进行两次调用是否好?服务必须在几毫秒内返回结果,并且不能总是进行两次调用
或者我们应该在WX1,WX2,WX3,。。。确保同一个呼叫不会重复两次
此外,将来我们可能希望从MngrY并行调用A、B、C,因此在这种情况下,缓存可能会产生问题。同一个请求可能不止一次。嗯
在那些必须执行复杂且多变的操作序列的情况下,我通常求助于具有某种“请求/命令/结果”类的状态机,称之为“OpClass”。管理器加载一个类实例,其中包含定义A、B或C操作、数据、命令枚举、链接、其他类实例以及批所需的所有内容。通过这种方式,OpClass实例拥有以正确顺序执行必要的X1..X5操作所需的所有状态和其他信息(如果顺序重要),并确保操作不会不必要地重复—A、B或C被封装。然后将OpClass发送给A、B或C,这些代理可以根据需要调用X1..X5以完成请求的操作。OpClass应包含用于存储任何结果和错误报告的成员,例如错误消息字符串和/或异常对象,以便在出现问题时使操作返回“早期”,并包含记录错误或稍后重试所需的所有信息
TBH,我可能也会将A、B和C聚合到OpClass中,从而形成一种“超级”OpClass,只需要加载数据和命令,然后提供执行,例如通过run()方法。之后,使用队列、线程和/或线程池进行并行操作会变得更加简单,实际上几乎是微不足道的:)
这是相关的还是有意义的