java - 大小有限的分布式池

标签 java message-queue connection-pooling distributed

有一个系统可以访问各种效率不高的服务。这些服务是由于处理某些消息而调用的。 由于这种低效率,系统被限制为每个节点 1 个消息消费者 - 以避免重载特定服务“A”。处理的消息各不相同,可能会同时处理多条消息,所有消息都需要调用服务“A”——因此存在限制。假设服务“A”可以处理 3 个并发连接,系统有 3 个节点,因此每个节点允许的最大消费者数为 1。

其他服务也有它们的容量,从所说的 3 个到基本无限制不等。

问题是 - 引入此类限制的最佳方式是什么?如果只有一个节点,那么引入一个服务客户端池就很容易了。当然,在客户端可用之前,它会阻塞消息消费者,但人们可以接受它。但这也意味着每个节点的池大小为 1(因为所有 3 个节点都可以开始调用服务“A”)。 对于多个节点,将需要某种分布式客户端池。有这样的吗?

(我知道如果单个消息处理被拆分成更小的消息,每个服务调用 1 个,它只允许使用例如 JMS 队列来做到这一点,但它是不可行的,例如由于消息处理的事务性质)。

最佳答案

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

简单的代理解决方案

在效率不高的服务前面创建您自己的中间件代理。代理将维护到后端服务的有限连接池。然后当到后端服务的出站连接被阻塞时,简单地阻止或拒绝(而不是排队)。否则只需将请求从入站系统节点转发到后端服务,然后用服务的响应响应系统节点。这样后端服务永远不会重载。它允许您的节点由于其交易性质而需要的同步通信。

系统架构师解决方案

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

关于java - 大小有限的分布式池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24501048/

相关文章:

php - 数据库连接池真的那么重要吗?

mysql - Node.js 应用程序的 node-mysql 连接池 "No connections available"

java - 如何为通过java代码动态创建的listview设置高度?

java - 使用 Java AWT 生成带有辅助 block 的单色 1bitpp PNG

queue - 在 SQS 队列中使用多个消费者

c - msgrcv() 函数在子进程中失败

azure - 消息队列: Multiple Topics vs Generic Topics with Filters

transactions - 多次使用 TransactionScope

java - 使用 spring jdbcTemplate 将数据插入到多个表中

java - 无法将预测映射到 JavaRDD