代码之家  ›  专栏  ›  技术社区  ›  Leonel

我可以限制分布式应用程序的请求吗?

  •  10
  • Leonel  · 技术社区  · 14 年前

    我的应用程序发出Web服务请求;提供程序将处理的请求的最大速率,因此我需要限制它们。

    当应用程序在一台服务器上运行时,我常常在应用程序级别执行:一个跟踪到目前为止已发出多少请求的对象,并等待当前请求是否超出了允许的最大负载。

    现在,我们要从一个服务器迁移到一个集群,所以有两个应用程序副本在运行。

    • 我不能一直检查应用程序代码的最大负载,因为这两个节点的组合可能超过了允许的负载。
    • 我不能简单地减少每台服务器上的负载,因为如果另一个节点空闲,第一个节点可以发送更多的请求。

    这是一个Javaee 5环境。限制应用程序发出的请求的最佳方法是什么?

    6 回复  |  直到 10 年前
        1
  •  5
  •   Arjan Tijms Mike Van    11 年前

    由于您已经在JavaEE环境中,您可以创建一个MDB,它处理基于JMS队列的所有对WebService的请求。应用程序的实例可以简单地将它们的请求发布到队列中,MDB将接收它们并调用WebService。

    实际上,可以为队列配置适当数量的会话,以限制对WebService的并发访问,因此可以通过队列配置来处理限制。

    结果可以通过另一个队列(甚至每个应用程序实例的队列)返回。

        2
  •  2
  •   Joel Bender    14 年前

    我建议使用 beanstalkd 周期性地将一组请求(作业)泵入一个管道(队列),每个都有适当的延迟。任何数量的“工作”线程或进程都将等待下一个请求可用,如果工作人员提前完成,则可以接收下一个请求。缺点是,工作人员之间没有任何显式的负载平衡,但是我发现队列外请求的分布已经得到了很好的平衡。

        3
  •  1
  •   Remus Rusanu    14 年前

    n个节点需要通信。有多种策略:

    • 广播:每个节点都会向其他人广播它正在进行呼叫,其他所有节点都会考虑到这一点。节点是相等的,并保持独立的全局计数(每个节点都知道其他节点的调用)。
    • 主节点:一个节点是特殊的,它的主节点和所有其他节点在调用前都需要得到主节点的许可。主机是唯一知道全局计数的主机。
    • 专用主机:与主机相同,但“主机”不在其LEF上进行呼叫,它只是一种跟踪呼叫的服务。

    根据您预计以后扩展到多高,一种或另一种策略可能是最好的。对于2个节点,最简单的一个是广播,但是随着节点数量的增加,问题开始增加(您将花费更多的时间广播和响应Broadcats,而不是实际执行WS请求)。

    节点如何通信,由您决定。你可以打开一个TCP管道,你可以Broadcats-UDP,你可以单独为这个目的做一个完全成熟的WS,你可以使用一个文件共享协议。不管你做什么,你现在已经不在一个过程中了,所以 fallacies of distributed computing 申请。

        4
  •  1
  •   jldupont    14 年前

    实现这一点的许多方法:您可能有一个“协调代理”,负责将“令牌”传递给服务器。每个“令牌”代表执行任务等的权限。每个应用程序需要请求“令牌”才能进行调用。

    一旦一个应用程序耗尽了它的令牌,在再次访问Web服务之前,它必须请求更多的令牌。

    当然,当每个应用程序由于对Web服务的并发性而对每个调用的时间有要求时,这一切就会变得复杂起来。

    你可以依靠 拉比麦克 作为消息传递框架:Java绑定是可用的。

        5
  •  1
  •   skaffman    14 年前

    这是一个有趣的问题,解决方案的难度在某种程度上取决于您对节流的要求有多严格。

    我通常的解决办法是 JBossCache 一部分是因为它与JBossAppServer打包在一起,另一部分是因为它处理好了任务。您可以将它用作一种分布式哈希图,以不同的粒度记录使用统计信息。它的更新可以异步完成,这样不会减慢速度。

    jbosscache通常用于重型分布式缓存,但我更喜欢它用于这些重量较轻的作业。它是纯Java的,不需要与JVM(不像TealaCoTa)混在一起。

        6
  •  1
  •   Cameron    10 年前

    Hystrix 是为你描述的场景设计的。您可以为每个服务定义一个线程池大小,这样您就有了一个设置的最大并发请求数,并且当池满时,它会将请求排队。您还可以为每个服务定义一个超时,当一个服务开始超过它的超时时,Hystrix将在短时间内拒绝对该服务的进一步请求,以便给该服务一个重新开始的机会。还可以通过 Turbine .