关于WCF服务在高并发情况下报目标积极拒绝的异常处理

最近弄了个wcf的监控服务,偶尔监控到目标服务会报一个目标积极拒绝的错误。一开始以为服务停止了,上服务器检查目标服务好好的活着。于是开始查原因。

一般来说目标积极拒绝(TCP 10061)的异常主要是2种可能:

1:服务器关机或者服务关闭

2:Client调用的端口错误或者服务器防火墙没开相应的端口

但是我们的服务本身是可以调用的,只是偶尔报这个错误,说明并不是这2个问题造成的。继续google,在stackoverflow上看到这样一篇:传送门

If this happens always, it literally means that the machine exists but that it has no services listening on the specified port, or there is a firewall stopping you.

If it happens occasionally - you used the word "sometimes" - and retrying succeeds, it is likely because the server has a full 'backlog'.

When you are waiting to be accepted on a listening socket, you are placed in a backlog. This backlog is finite and quite short - values of 1, 2 or 3 are not unusual - and so the OS might be unable to queue your request for the 'accept' to consume.

The backlog is a parameter on the listen function - all languages and platforms have basically the same API in this regard, even the C# one. This parameter is often configurable if you control the server, and is likely read from some settings file or the registry. Investigate how to configure your server.

If you wrote the server, you might have heavy processing in the accept of your socket, and this can be better moved to a separate worker-thread so your accept is always ready to receive connections. There are various architecture choices you can explore that mitigate queuing up clients and processing them sequentially.

Regardless of whether you can increase the server backlog, you do need retry logic in your client code to cope with this issue - as even with a long backlog the server might be receiving lots of other requests on that port at that time.

There is a rare possibility where a NAT router would give this error should it's ports for mappings be exhausted. I think we can discard this possibility as too much of a long shot though, since the router has 64K simultaneous connections to the same destination address/port before exhaustion.

大概意思就是如果这个错误是一直发生的那么可能是服务器或者防火墙的问题,如果这个问题是“Sometime”发生的,那么可能是backlog的问题。backlog是tcp层面的请求队列,当你调用socket发起请求的时候服务端会排成一个队列,在高并发情况下服务端来不及处理请求,那么有些请求就被直接被丢弃,于是就报了目标积极拒绝TCP10061的异常。

有了backlog于是继续google关键字“WCF backlog”发现wcf binding配置确实有一个listenBacklog的项目,默认值是10,于是把服务的listenBacklog改成100,问题搞定。

对了添加listenBacklog属性的时候有个注意的是一定要移除一个默认的endpoint      <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" />这个endpoint是用来给vs等发现元数据用的,如果这个不移走启动服务的时候会报端口已经被监听的错误。

参考:http://stackoverflow.com/questions/2972600/no-connection-could-be-made-because-the-target-machine-actively-refused-it

https://msdn.microsoft.com/en-us/library/ee377061(v=bts.10).aspx

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linux运维学习之路

day6、Linux下如何找出7天以前的文件删除

有些时候,由于系统产生的日志文件,使服务器的磁盘空间紧张,所以怎么删除7天以前的日志文件及让系统只保留7天以内的日志文件 方法一 使用命令:find + |xa...

1879
来自专栏从零学习云计算

kubernetes工作记录(2)——基于release工程的kubernetes1.7.3 rpm包的编译生成

使用release工程编译的方式,生成kubernetes1.7.3的rpm包。 虚拟机环境为Centos7.2。 安装git # yum -y install...

2280
来自专栏软件测试经验与教训

session与cookie的区别详解

由于HTTP协议是无状态的,在WEB系统中,怎么识别请求来自于哪里呢?是哪一个用户发起的请求呢?

791
来自专栏惨绿少年

linux中必会的目录

第1章 find命令扩展 1.1 方法一 |xargs 通过|xargs将前面命令的执行结果传给后面。 [root@znix ~]# find /oldboy/...

2680
来自专栏性能与架构

Redis3 集群中删除节点

image.png 删除节点有两种情况: (1)删除master节点,需要先把目标节点中的slot移动到其他节点中,然后执行删除节点操作 (2)删除slave节...

2636
来自专栏实战docker

rancher下的kubernetes之一:构建标准化vmware镜像

学习kubernetes的时候,我们需要在kubernetes环境下实战操作,然而kubernetes环境安装并不容器,现在通过rancher可以简化安装过程,...

2725
来自专栏运维小白

2.18 特殊权限set_uid

set_uid 例子 -rwsr-xr-x.中的s的权限 [root@hf-01 ~]# which passwd /usr/bin/passwd [root@...

2175
来自专栏运维小白

10.21 firewalld关于zone的操作

Linux防火墙-firewalld firewall-cmd --set-default-zone=work //设定默认zone firewall-cmd ...

19510
来自专栏Script Boy (CN-SIMO)

PowerShell:因为在此系统上禁止运行脚本

在安装chocolatey(官网)的时候,不能运行chocolateyInstall.pal脚本文件。 ? 查阅资料后,得出如下解决办法: 首次在计算机上启动 ...

2370
来自专栏别先生

EasyUI之Hello world(EasyUI的入门学习)

1:创建一个动态web工程:     去官网http://www.jeasyui.net/download/下载官网文档     我去官网下载的最新版本,个人根...

19310

扫码关注云+社区