远程处理时 Service Fabric 上的重复请求

Posted

技术标签:

【中文标题】远程处理时 Service Fabric 上的重复请求【英文标题】:Duplicate Requests on Service Fabric When Remoting 【发布时间】:2018-12-06 22:54:00 【问题描述】:

我在 Service Fabric (ASP.NET Core) 上有一个无状态服务,它将调用一个 Actor,并且根据场景,Actor 可能在内部也调用其他 Actor 和/或有状态服务。

我的问题是,由于系统的远程处理方面,我们是否需要考虑重复请求?

在我们早期的 Akka.Net 实现中,由于 TCP/IP 网络拥塞等原因,Actor 有可能收到重复的请求,我们通过给每条消息一个唯一的 Correlation Id 来处理这种情况。我们会将请求及其结果以状态存储在参与者上,如果再次返回相同的关联 ID,我们将假设它是重复的并发送较早的结果,而不是重新处理请求。

我曾在微软的一个示例项目中看到过类似的方法,但我似乎再也找不到了(Github 上的死链接)。

有谁知道这是否需要在 Actor 和/或有状态服务中处理?

【问题讨论】:

【参考方案1】:

您可以在远程调用中添加custom headers,方法是创建IServiceRemotingClientFactoryIServiceRemotingClient 的自定义实现。

在操作RequestResponseAsyncSendOneWay 中添加自定义标头。

Peter Bons 的另一个例子here.:

var header = requestRequestMessage.GetHeader();
var customHeaders = customHeadersProvider.Invoke() ?? new CustomHeaders();
header.AddHeader(CustomHeaders.CustomHeader, customHeaders.Serialize());

在接收端,您可以在自定义ActorServiceRemotingDispatcher 中从IServiceRemotingRequestMessageHeader 获取自定义标头。

【讨论】:

这是一个非常有趣的方法。如果我有任何问题,我将对此进行审查并回复您。谢谢!

以上是关于远程处理时 Service Fabric 上的重复请求的主要内容,如果未能解决你的问题,请参考以下文章

Service Fabric 对无状态服务的远程调用未返回、卡住

如何为远程 Service Fabric 集群创建 Actor 代理

Service Fabric TCP 反向代理

Service Fabric Api Gateway 上的 Application Insights 端到端中断

Azure上的Service Fabric Cluster创建失败,错误代码为“VMInstanceCountAllowsBetterReliabilityLevel”

在 Service Fabric 中运行 Azure DevOps 自托管生成代理时出现“无法解析远程名称”