SpikeArrest中的FaultRule无法正常工作?

时间:2014-02-28 09:58:22

标签: apigee

我正在尝试在SpikeArrest策略中代理超过其速率时返回自定义错误消息,但SpikeArrest似乎没有触发分配用于处理错误的策略:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SpikeArrest async="false" continueOnError="false" enabled="true"     name="SpikeArrest.BurstProtection">
    <DisplayName>SpikeArrest.BurstProtection</DisplayName>
    <FaultRules>
        <FaultRule>
            <Policy>
                <Name>RaiseFault.BurstProtection</Name>
            </Policy>
        </FaultRule>
    </FaultRules>
    <Properties/>
    <Identifier ref="request.header.sender-id"/>
    <MessageWeight ref="1"/>
    <Rate>1pm</Rate>
</SpikeArrest>

我以前在其他地方使用过这个构造(主要是在VerifyAPIKey中)并且它总是工作正常,但不是在这个。

我错过了什么吗?

我们正在运行Apigee Edge(安装包为14.01.0.0)

2 个答案:

答案 0 :(得分:1)

之前我没有在策略中使用<FaultRules>配置,但我知道如果违反了速率,SpikeArrest策略本身会在消息流中引发错误。这会将消息发送到故障流<FaultRules>,然后您可以在其中定义类似RaiseFault.BurstProtection的策略以设置自定义故障响应。在此处查看更多信息:http://apigee.com/docs/api-services/content/fault-handling

大多数策略在执行时确定应该引发错误(速率限制,xml / json注入策略,oauth v2策略等)时会引发错误。

我不确定您为RaiseFault.BurstProtection使用的政策类型,但是当您使用在ProxyEndpoint或TargetEndpoint中定义的Apigee <FaultRules>的方法时,您可以使用AssignMessage策略覆盖响应消息,设置自定义故障响应。

我喜欢使用Apigee中的故障规则流来设计代理,以构建更多的故障处理框架和故障规则的每策略配置。

答案 1 :(得分:0)

不久之前,在政策中弃用了

<FaultRules>功能。

如果要为SpikeArrest引发自定义错误,请首先确保在SpikeArrest策略中设置continueOnError="true"属性。这允许您忽略系统的通用响应输出。其次,您可以在后续政策中检查以下条件,利用ratelimit.<spike_arrest_policy_name>.exceed.count变量:

...
            <!-- Spike Arrest policy -->
            <Step>
                <Name>SpikeArrest.BurstProtection</Name>
            </Step>
            <!-- RaiseFault for Spike Arrest violation -->
            <Step>
                <Condition>(ratelimit.SpikeArrest.BurstProtection.exceed.count > 0)</Condition>
                <Name>RaiseCustomFault</Name>
            </Step>
...

满足条件后,您可以提出自己的自定义故障信息。

值得注意的是,SpikeArrest并不是真的有计数。有关SpikeArrest的其他SO问题,请参阅here

重要编辑 ratelimit.<spike_arrest_policy_name>.exceed.count>0检查此时无效。正如迈克尔所建议的那样,一个好的选择是离开continueOnError="true"(默认值)。让Spike Arrest出错,然后在Proxy文件的顶部,利用FaultRules部分。您可以按如下方式检查正确的FaultRule条件:

    <FaultRules>
      <FaultRule name="FaultHandling">
        <Step>
            <Condition>(fault.name = "SpikeArrestViolation")</Condition>
            <Name>RaiseSpikeCustomFault</Name>
        </Step>
      </FaultRule>
    </FaultRules>

fault.name值列在每个主题下的公共文档网站上,因此SpikeArrest是here。请参阅“特定于策略的错误代码”。