【发布时间】:2018-08-08 20:21:27
【问题描述】:
我正在研究ICommunicationClient 的实现以及用于 HTTP 协议通信的相关内容,这些内容应该与 SF 反向代理兼容。对我来说最微妙的部分是重试策略。根据 Azure docs for 404 errors,反向代理在决定是否应重试时依赖于从 Web 服务返回的 X-Service-Fabric 标头。
ASP.NET Core 提供 middleware 用于与反向代理集成,该反向代理向每个 404 响应添加 X-Service-Fabric 标头。
假设我们有这样的场景:ServicePartitionClient 为侦听端口 3001 的无状态服务缓存端点。在某些时候,该服务可能会移动到另一个节点。在第一个节点上,Service Fabric 运行时分配具有自己的终结点的不同服务,但使用相同的中间件并侦听相同的 3001 端口。
当客户端尝试在其旧(缓存)地址调用原始服务时,它将收到包含 X-Service-Fabric 标头的 404 响应。根据反向代理策略,它不应该重试,但对我来说,客户端似乎会永远保持连接到错误的服务,并且不会尝试重新解析端点。
我在文档中找不到有关此案例的任何信息,我在这里遗漏了什么吗?依赖此标准中间件并且不对带有 X-Service-Fabric: ResourceNotFound 标头的 404 错误进行重试尝试是否安全?
【问题讨论】:
-
您是否可能将 您的 应用程序发出的 404 与假定驻留在您迁移节点中的任何服务发出的 404 混为一谈?我假设您无法控制您的应用程序不再运行的节点
-
@JoshE:我无法控制服务结构如何管理服务生命周期、故障转移、端口分配等。服务可以在节点周围随机移动,最终不同的 SF 服务可能会开始监听该地址以前被其他服务使用过
-
对,SF 有责任确保通过结构正确路由请求。客户端有责任使自己的缓存失效,例如,当它从缓存的端点接收到 404 时。您无法控制节点迁移,但(如果您是客户端)您可以控制响应它的操作
-
@JoshE: 确切地说,客户端提供基于错误响应的重试机制,反向代理行为是仅在响应不包含“X-Service-Fabric: ResourceNotFound”标头时重试 404 并解析新端点,但在我描述的场景中,客户端可能会从另一个结构服务接收此标头,并认为它保持连接到正确的提供程序,对我来说,似乎唯一安全的选择是重试每个 404 响应,即我要避免的事情
标签: c# azure asp.net-core azure-service-fabric