【发布时间】:2014-08-21 11:15:53
【问题描述】:
有一个系统可以访问各种效率不高的服务。服务被调用作为处理一些消息的结果。 由于这种低效率,系统被限制为每个节点 1 个消息消费者 - 以避免使特定服务“A”过载。处理的消息会有所不同,并且可能会同时处理多条消息,所有消息都需要调用服务“A” - 因此存在限制。假设服务“A”可以处理 3 个并发连接,系统有 3 个节点,因此每个节点允许的最大消费者数为 1。
其他服务也有自己的容量,从说的3到基本无限制。
问题是 - 引入此类限制的最佳方式是什么?如果只有一个节点,只需引入一个服务客户端池就很容易了。当然,它会阻止消息消费者,直到客户端可用,但可以忍受它。但这也意味着每个节点大小为 1 的池(因为所有 3 个节点都可以开始调用服务“A”)。 对于多个节点,需要某种分布式客户端池。有这样的吗?
(我知道,如果将单个消息处理拆分为较小的消息,每个服务调用 1 个,则允许使用 JMS 队列来执行此操作,但由于消息处理的事务性质,它不可行)。
【问题讨论】:
-
阿帕奇骆驼? EIP 框架实施。节流模式或许能解决您的问题 - camel.apache.org/throttler.html
-
您要归档的内容不是很清楚。据我所知,您需要 2 个信号量,每个服务一个“全局”限制服务的连接总数,一个限制每个节点的连接数量?
-
只是一个全局“信号量”,限制每个服务的传出连接数
标签: java message-queue connection-pooling distributed