在 Azure API 管理中,您如何在 3 个不同的后端上进行负载平衡和故障转移?

问题描述 投票:0回答:1

我正在想办法让 API 管理在多个后端上进行故障转移。

问题与ff非常相似:

区别在于我有三个后端,而不是两个后端。即

  1. 如果 backend1 失败,尝试 backend2
  2. 如果 backend2 仍然失败,请尝试 backend3
  3. 如果 backend3 仍然失败,请再次尝试 backend1。

我最好的猜测是如果可能的话,以某种方式获得

<retry>
counter。像这样的东西:

<backend>
    <retry condition="@(context.Response.StatusCode == 500" count="9" interval="10" first-fast-retry="true">
        <choose>
            <when condition="@(int.Parse(context.RetryCount) % 3 == 0)">
                <set-backend-service backend-id="backend2" />
            </when>
            <when condition="@(int.Parse(context.RetryCount) % 3 == 1)">
                <set-backend-service backend-id="backend3" />
            </when>
            <otherwise>
                <set-backend-service backend-id="backend1" />
            </otherwise>
        </choose>

        <forward-request />
    </retry>
</backend>

但这不行,因为没有

context.RetryCount
,有这样的变量吗?或者有其他建议吗?

理想情况下,除了重试之外,我还希望能够对后端进行循环负载平衡。但我现在会采取任何解决方案。

azure-api-management
1个回答
0
投票

弄明白了,张贴在这里,因为它可能会帮助某人。另外,如果这里有人知道更好的方法,请分享。

<policies>
    <inbound>
        <base />
        <cache-lookup-value key="backend-counter" variable-name="backend-counter" />
        <choose>
            <when condition="@(!context.Variables.ContainsKey("backend-counter"))">
                <set-variable name="backend-counter" value="0" />
                <cache-store-value key="backend-counter" value="0" duration="100" />
            </when>
        </choose>
        <choose>
            <when condition="@(int.Parse((string)context.Variables["backend-counter"]) == 0)">
                <set-backend-service backend-id="backend1" />
                <set-variable name="backend-counter" value="1" />
                <cache-store-value key="backend-counter" value="1" duration="100" />
            </when>
            <when condition="@(int.Parse((string)context.Variables["backend-counter"]) == 1)">
                <set-backend-service backend-id="backend2" />
                <set-variable name="backend-counter" value="2" />
                <cache-store-value key="backend-counter" value="2" duration="100" />
            </when>
            <otherwise>
                <set-backend-service backend-id="backend3" />
                <set-variable name="backend-counter" value="0" />
                <cache-store-value key="backend-counter" value="0" duration="100" />
            </otherwise>
        </choose>
    </inbound>
    <backend>
        <retry condition="@(context.Response.StatusCode >= 500 || context.Response.StatusCode >= 400)" count="6" interval="10" first-fast-retry="true">
            <choose>
                <when condition="@(context.Response.StatusCode >= 500 || context.Response.StatusCode >= 400)">
                    <when condition="@(int.Parse((string)context.Variables["backend-counter"]) == 0)">
                        <set-backend-service backend-id="backend1" />
                        <set-variable name="backend-counter" value="1" />
                        <cache-store-value key="backend-counter" value="1" duration="100" />
                    </when>
                    <when condition="@(int.Parse((string)context.Variables["backend-counter"]) == 1)">
                        <set-backend-service backend-id="backend2" />
                        <set-variable name="backend-counter" value="2" />
                        <cache-store-value key="backend-counter" value="2" duration="100" />
                    </when>
                    <otherwise>
                        <set-backend-service backend-id="backend3" />
                        <set-variable name="backend-counter" value="0" />
                        <cache-store-value key="backend-counter" value="0" duration="100" />
                    </otherwise>
                </when>
            </choose>
            <forward-request buffer-request-body="true" />
        </retry>
    </backend>
    <outbound>
        <base />
        <!-- Uncomment for debugging, this outputs the next backend-counter in the JSON response body. -->
        <!--
        <set-body>@{ 
            JObject body = context.Response.Body.As<JObject>(); 
            body.Add(new JProperty("backend-counter", ((string)context.Variables["backend-counter"])));
            return body.ToString(); 
        }</set-body>
        -->
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>
© www.soinside.com 2019 - 2024. All rights reserved.