WCF 서비스가 높은 병렬 상황에서 목표의 적극적인 거부를 알리는 이상 처리 정보

2952 단어
최근에 wcf 모니터링 서비스를 만들었는데 가끔 모니터링을 하면 목표를 적극적으로 거부하는 오류를 보고합니다.처음에는 서비스가 멈춘 줄 알고 서버에 올라가 목표 서비스가 잘 살아 있는지 검사했다.그래서 원인을 조사하기 시작했다.
일반적으로 목표 적극 거부(TCP 10061)의 예외는 크게 2가지 가능성입니다.
1: 서버 종료 또는 서비스 종료
2: 클라이언트가 호출한 포트 오류나 서버 방화벽이 해당 포트를 열지 않았습니다.
그러나 우리의 서비스 자체는 호출할 수 있다. 단지 간혹 이 오류를 보고했을 뿐, 이것은 이 두 가지 문제로 인한 것이 아니라는 것을 설명한다.계속 구글, 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는 tcp 차원의 요청 대기열입니다. socket을 호출하여 요청을 할 때 서비스 측은 하나의 대기열로 배열됩니다. 높은 병렬 상황에서 서비스 측이 요청을 처리하지 못하면 일부 요청은 바로 버려집니다. 그래서 목표를 보고하여 TCP10061의 이상을 적극적으로 거절했습니다.
백로그가 생겨서 구글 키워드인'WCF 백로그'를 계속해 보니 wcf binding 설정에 listen 백로그 항목이 하나 있는데 기본값이 10입니다. 그래서 서비스의listen 백로그를 100으로 바꾸었습니다.
참, listenBacklog 속성을 추가할 때 주의할 점은 기본 endpoint를 제거해야 한다는 것입니다. 이 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

좋은 웹페이지 즐겨찾기