ASP.NET 核心 404 响应中的 Service Fabric 反向代理集成
Servce Fabric Reverse Proxy Integration in ASP.NET Core 404 Response
我正在研究 ICommunicationClient
的实现以及用于 HTTP 协议通信的相关内容,它应该与 SF 反向代理兼容。对我来说最微妙的部分是重试策略。根据 404 错误的 Azure 文档,反向代理在决定是否应重试时依赖 X-Service-Fabric header 从 Web 服务返回。
ASP.NET Core 提供 middleware 用于与反向代理集成,反向代理将 X-Service-Fabric header 添加到每个 404 响应。
假设我们有这样的场景 ServicePartitionClient
为监听端口 3001 的无状态服务缓存端点。在某些时候,该服务可能会移动到另一个节点。在第一个节点上,Service Fabric 运行时使用自己的端点分配不同的服务,但使用相同的中间件并侦听相同的 3001 端口。
当客户端尝试在其旧(缓存)地址调用原始服务时,它将收到包含 X-Service-Fabric
header 的 404 响应。根据反向代理策略,它不应该重试,但对我来说,似乎客户端将永远保持连接到错误的服务并且不会尝试 re-resolve 端点。
我在文档中找不到关于这个案例的任何信息,我是不是漏掉了什么?依赖此标准中间件是否安全并且不要使用 X-Service-Fabric 重试 404 错误:ResourceNotFound header?
在您给定的场景中,当您的客户端遇到 404 时,X-Service-Fabric:ResourceNotFound
header 并不是您的代码在决定是否重试某些操作时可以检查的唯一属性。
为了简单地解决您的问题,即您的客户将无法分辨 "friendly" 节点和 "newly arrived" 节点之间的区别,并且由于您已经在使用 http headers,您可以将自定义 HTTP header 添加到传出响应中,以识别请求来自您的应用程序。
当客户端收到 404 时,您可以简单地检查是否存在您的自定义 header 来回答是否是 "legit" 重试的问题。当然,仅仅为了验证检查而添加自定义 HTTP header 可能更像是针对局部问题的全局解决方案。 Ed:不言而喻,这不应该被应用程序用来做出安全决定
实现相同目的的更优雅和复杂的方法是使用 HTTP headers 和响应属性的不同组合来推断相同的结果(例如,查看是否有其他 headers是 expected/unexpected),但这也可能是问题的 hyper-local 解决方案。
在上述情况下,通信客户端将因保持连接到错误的服务而失效。 recommended by Microsoft 为具有 dynamically-assigned 端口的服务使用唯一的 URL 前缀来处理这些情况。
在 ASP.NET 中,核心程序员可以利用 ServiceFabricMiddleware
检查 URL 前缀和 returns 410 如果它们不匹配则消失。然后,ICommunicationClient
的 HTTP 实现可以仅针对 410 响应使用 re-resolving 端点进行重试,如果启用了反向代理集成,则不会对使用 X-Service-Fabric: ResourceNotFound
header 的 404 响应进行任何重试。
我正在研究 ICommunicationClient
的实现以及用于 HTTP 协议通信的相关内容,它应该与 SF 反向代理兼容。对我来说最微妙的部分是重试策略。根据 404 错误的 Azure 文档,反向代理在决定是否应重试时依赖 X-Service-Fabric header 从 Web 服务返回。
ASP.NET Core 提供 middleware 用于与反向代理集成,反向代理将 X-Service-Fabric header 添加到每个 404 响应。
假设我们有这样的场景 ServicePartitionClient
为监听端口 3001 的无状态服务缓存端点。在某些时候,该服务可能会移动到另一个节点。在第一个节点上,Service Fabric 运行时使用自己的端点分配不同的服务,但使用相同的中间件并侦听相同的 3001 端口。
当客户端尝试在其旧(缓存)地址调用原始服务时,它将收到包含 X-Service-Fabric
header 的 404 响应。根据反向代理策略,它不应该重试,但对我来说,似乎客户端将永远保持连接到错误的服务并且不会尝试 re-resolve 端点。
我在文档中找不到关于这个案例的任何信息,我是不是漏掉了什么?依赖此标准中间件是否安全并且不要使用 X-Service-Fabric 重试 404 错误:ResourceNotFound header?
在您给定的场景中,当您的客户端遇到 404 时,X-Service-Fabric:ResourceNotFound
header 并不是您的代码在决定是否重试某些操作时可以检查的唯一属性。
为了简单地解决您的问题,即您的客户将无法分辨 "friendly" 节点和 "newly arrived" 节点之间的区别,并且由于您已经在使用 http headers,您可以将自定义 HTTP header 添加到传出响应中,以识别请求来自您的应用程序。 当客户端收到 404 时,您可以简单地检查是否存在您的自定义 header 来回答是否是 "legit" 重试的问题。当然,仅仅为了验证检查而添加自定义 HTTP header 可能更像是针对局部问题的全局解决方案。 Ed:不言而喻,这不应该被应用程序用来做出安全决定
实现相同目的的更优雅和复杂的方法是使用 HTTP headers 和响应属性的不同组合来推断相同的结果(例如,查看是否有其他 headers是 expected/unexpected),但这也可能是问题的 hyper-local 解决方案。
在上述情况下,通信客户端将因保持连接到错误的服务而失效。 recommended by Microsoft 为具有 dynamically-assigned 端口的服务使用唯一的 URL 前缀来处理这些情况。
在 ASP.NET 中,核心程序员可以利用 ServiceFabricMiddleware
检查 URL 前缀和 returns 410 如果它们不匹配则消失。然后,ICommunicationClient
的 HTTP 实现可以仅针对 410 响应使用 re-resolving 端点进行重试,如果启用了反向代理集成,则不会对使用 X-Service-Fabric: ResourceNotFound
header 的 404 响应进行任何重试。