有一个系统可以访问各种效率不高的服务。服务被称为处理某些消息的结果。
由于这种低效率,系统被限制为每个节点1个消息使用者-以避免过载特定服务“ A”。处理的消息各不相同,可能会同时处理多个消息,所有这些都需要呼叫服务“ A”,因此是限制。假设服务“ A”可以处理3个并发连接,系统有3个节点,因此每个节点允许的使用者数量上限为1。

其他服务也有其容量,从上述3种到基本无限制。

问题是-引入此类限制的最佳方法是什么?如果只有一个节点,那么引入一个服务客户端池将很容易。当然,它将阻止消息使用方,直到客户端可用为止,但是一个人可以忍受它。但这也意味着每个节点的大小为1的池(因为所有3个节点都可以开始调用服务“ A”)。
对于多个节点,将需要某种分布式客户端池。有没有类似的东西?

(我知道如果将单个消息处理拆分为较小的消息,每个服务调用1个,则可以使用例如JMS Queue来做到这一点,但是由于消息处理的事务性,这是不可行的)。

最佳答案

我看到两种可能的解决方案。两者都基于中间件解决问题的方法,其中简单的解决方案可以解决您的特定问题,而更高级的解决方案则需要更多的投资才能获得更大的灵活性和额外的好处。

简单代理解决方案

在效率不是很高的服务之前创建自己的中间件代理。代理将维护与后端服务的有限连接池。然后,当阻塞到后端服务的出站连接时,只需阻塞或拒绝(而不是队列)即可。否则,只需将请求从入站系统节点转发到后端服务,然后使用服务的响应来响应系统节点。这样,后端服务就不会过载。并且由于节点的事务性,它允许您的节点需要同步通信。

系统架构师解决方案

使用功能齐全的ESB(企业服务总线)。一种允许您设置到特定端点的并发连接的限制,并允许异步和同步消息处理。然后,ESB成为您环境范围内的流量控制器,可以将其配置为在效率不太高的端点阻塞时阻止或拒绝消息。为了获得更多好处,请寻找一种ESB,该服务允许配置服务质量,在使用有限的资源时防止系统节点出现饥饿现象,或者自动重试连接尝试以终结端点。

10-08 20:13