如何在 Java EE 环境中实现请求限制?

Posted

技术标签:

【中文标题】如何在 Java EE 环境中实现请求限制?【英文标题】:How do I implement Request throttling in a Java EE environment? 【发布时间】:2012-04-23 01:36:11 【问题描述】:

我们的一个应用程序通过消息队列接受请求,并为每个请求拨打电话。

拨打电话时涉及 2 个电话系统。一个系统对可以在一秒钟内发起的调用数量有限制,但对并行调用没有限制,而其他系统对可以在任何时间点处于活动状态的并发调用有限制。

后面的需求在 Java EE 层中处理,方法是让消息队列具有预定义的 MDB 数量不超过限制。

谁能建议我如何在 Java EE 层(weblogic 10.3)中实现第一个限制(调用启动)?

【问题讨论】:

2 个问题:1. 消息排序重要吗? 2. 是否要支持集群环境(每个 JVM 都存在 MDB 池)? 消息排序在一定程度上很重要(比如在 20 分钟到期之前以任何顺序处理)。我不需要支持集群。 【参考方案1】:

我想出的唯一想法是让 MDB 的数量等于启动限制,并让它们在呼叫启动后休眠 1 秒,然后再收到下一条消息。

在队列提供程序中可能有一种方法可以做到这一点,但不一定可以通过 JMS 获得。您必须检查文档。

【讨论】:

谢谢。参与系统中有 2 个约束,一个是调用启动(例如 2 次调用在 sec 中),另一个是最大并行调用(100 次调用任何时间),我已将 MDB 的大小设置为等于最大并行调用,因为我们需要最大吞吐量减少呼叫发起的数量将导致资源利用率不足。 根据我的建议,您将有 2 个 MDB 用于启动。每个人都会发起一个呼叫,并休眠 1 秒钟。保证一秒钟内永远不会超过 2 个。 这么说吧,我的应用程序通过 Queue 接收消息,需要为收到的每个 msg 拨打一个电话。电话系统对任何时候的活动呼叫数量没有限制,但对呼叫发起有限制。例如,我在一秒钟内只能发起 2 个呼叫,但一旦发起,就可以激活尽可能多的呼叫。通过将 MDB 限制为 2,我限制了系统的容量。我正在寻找可以在 J2EE 上下文中安全使用的解决方案。请帮助(MDB 将在调用的整个生命周期内处于活动状态,范围从 10 秒到 200 秒) 好的,我在想只使用 MDB 来启动呼叫,他们会委托给呼叫处理程序。调用处理程序将在必要的 10-200 秒内运行,让 MDB 只启动调用处理程序。调用处理程序本身可以是 MDB、EJB 或 pojo。

以上是关于如何在 Java EE 环境中实现请求限制?的主要内容,如果未能解决你的问题,请参考以下文章

如何在函数计算中实现无入侵全局网络代理

如何在java中实现负载均衡器

在 Java EE 中实现 Amazon Web Services 的在线照片处理服务示例

在 Eclipse 中使用 J2EE Preview 运行时在 Java EE 中实现 RESTful 服务

你将如何在 Java 中实现 LRU 缓存?

过滤器或阶段列表器是在 Java EE 6 中实现安全性的好方法吗?