Spike arrest with 2 rate limit populated dynamically is not working as expected

surekapoppy
Participant II

We have a requirement where based on a variable the rate limit has to be set dynamically.

For spikeIdentifier as A = 2pm

For spikeIdentifier as B =10pm

When 1 st request with (spikeIdentifier as A) reaches proxy at 12th sec . It is success ,but when 2nd request with (spikeIdentifier as B) reaches proxy at 20th sec . It is getting rejected. Below is code snippet

Please help !. If it is expected scenario , Please suggest any alternate.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArrest">
    <DisplayName>SpikeArrest</DisplayName>
    <Properties/>
    <Rate ref="spikearrestRate"/>
    <Identifier ref="spikeIdentifier"/>
</SpikeArrest>				
0 1 209
1 REPLY 1

abhinabanag92
Participant III

If you are having only 2 rate limits, you can use 2 Spike Arrest Policies, and put condition in both of them and this way, each call will hit one policy based on condition and skip the other one:

First Policy:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SpikeArrest async="false" continueOnError="false" enabled="true" name="Spike-Arrest-1">
    <DisplayName>Spike Arrest-1</DisplayName>
    <Properties/>
    <Identifier ref="request.header.some-header-name"/>
    <MessageWeight ref="request.header.weight"/>
    <Rate>10pm</Rate>
</SpikeArrest>
Second Policy:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SpikeArrest async="false" continueOnError="false" enabled="true" name="Spike-Arrest-2">
    <DisplayName>Spike Arrest-2</DisplayName>
    <Properties/>
    <Identifier ref="request.header.some-header-name"/>
    <MessageWeight ref="request.header.weight"/>
    <Rate>2pm</Rate>
</SpikeArrest>

Proxy Endpoints - default:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
    <Description/>
    <FaultRules/>
    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Name>Spike-Arrest-1</Name>
                <Condition>(request.queryparam.a == 1)</Condition>
            </Step>
            <Step>
                <Name>Spike-Arrest-2</Name>
                <Condition>(request.queryparam.a == 2)</Condition>
            </Step>
        </Request>
        <Response/>
    </PreFlow>
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
    <Flows/>
    <HTTPProxyConnection>
        <BasePath>/spikedemo</BasePath>
        <Properties/>
        <VirtualHost>default</VirtualHost>
        <VirtualHost>secure</VirtualHost>
    </HTTPProxyConnection>
    <RouteRule name="default">
        <TargetEndpoint>default</TargetEndpoint>
    </RouteRule>
</ProxyEndpoint>