有一个系统可以访问各种不那么高效的服务。由于处理某些消息而调用服务。 由于效率低,系统每个节点限制为1个消息使用者 - 以避免使特定服务“A”过载。处理过的消息各不相同,可能会发生同时处理多个消息,所有消息都要求呼叫服务“A” - 因此限制。假设服务“A”可以处理3个并发连接,系统有3个节点,因此每个节点允许的最大消费者数量为1。
其他服务也有其容量,从所述3到基本无限制。
问题是 - 引入此类限制的最佳方式是什么?如果存在单个节点,则很容易引入一组服务客户端。当然它会阻止消息使用者,直到客户端可用,但人们可以忍受它。但它也意味着每个节点大小为1的池(因为所有3个节点都可以开始调用服务“A”)。 对于多个节点,将需要某种分布式客户端池。有什么类似的吗?
(我知道如果将单个消息处理拆分为较小的消息,每个服务调用1个,它将允许使用例如JMS队列来执行此操作,但是由于消息处理的事务性质,它不可行。)
答案 0 :(得分:3)
我看到两种可能的解决方案。两者都基于问题的中间件方法,简单的解决方案可以解决您的具体问题,更先进的解决方案需要更多的投资,以获得更大的灵活性和额外的好处。
在效率不高的服务面前创建自己的中间件代理。代理将维护有限的连接池到后端服务。然后,当阻塞到后端服务的出站连接时,只需阻塞或拒绝(而不是队列)。否则只需将请求从入站系统节点转发到后端服务,然后使用服务的响应响应系统节点。这样,后端服务永远不会过载。并且它允许节点因其事务性质而需要的同步通信。
使用功能齐全的ESB(企业服务总线)。允许您对特定端点的并发连接设置限制,并允许异步和同步消息处理。然后,ESB成为您的环境范围的流量控制器,可以配置为在不那么有效的端点被阻塞时阻止或拒绝消息。为了获得额外的好处,请查找允许服务质量配置的ESB,以防止在使用有限资源时系统节点不足,或者自动重试连接尝试到不稳定的端点。