2017-01-07 2 views
1

우리는 내부적으로 public (mobile app)으로부터의 단일 요청이 내부적으로 다른 서비스에 4 개의 HTTP 호출을 야기하는 마이크로 서비스 아키텍처를 가지고 있습니다.마이크로 서비스 아키텍처 | 요청한 주소를 할당 할 수 없음

내가보기에 부작용 중 하나는 과부하 상태에서 "요청 된 주소를 할당 할 수 없습니다"오류가 발생한다는 것입니다.

Running netstat -tunp | wc -l은 약 60k의 카운트를 나타내지 만 일반적으로 3k를 가리 킵니다.

나는 포트 소진에 빠져있는 것 같습니다. 내 응용 프로그램은 Apache HTTP 클라이언트를 사용하여 Java로 작성됩니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 나는 마음에 몇 가지 솔루션을 가지고 있지만, 나는 그것의 올바른 방법으로 갈 경우되지 확신 : 사용

모든 아이디어는 아파치 HTTP 풀을 사용하여

  • 살아 유지?

  • +0

    'netstat' 출력의 소켓 상태는 무엇입니까? TIME_WAIT 상태입니까? 그렇다면 Linux 커널 설정을 구성하는 다른 방법이있을 수 있습니다. 다음을보십시오 : [tcp_tw_reuse] (https://ihazem.wordpress.com/2012/02/07/reducing-time_wait-socket-connections-recyclereuse), tcp_max_tw_buckets. 물론, 가장 좋은 방법은 연결 유지 (필요할 경우) 연결을 사용하는 것입니다. 이렇게하면 연결 관리 방법에 대한 모든 측면을 제어 할 수 있습니다. – tysonite

    답변

    2

    사용 가능한 포트가 고갈 될 수있는 몇 가지 이유가 있습니다. (혼동을 피하기 위해, 나는 당신의 사용자 대면 서버 "응용 프로그램"을 부를 것이다.) :

    1. 당신은 단지 하나 개의 IP 주소를 하나 개의 응용 프로그램 인스턴스가있는 경우, 최대 연결 수를 그 하나의 시스템에서 모든에 4 개의 마이크로 서비스 중 하나는 임시 포트의 수로 제한됩니다. 기본 임시 포트 범위는 OS에 따라 다르지만 65535로 설정할 수 있습니다 (매우 일반적인 경우 라하더라도 emphemeral 포트로 사용할 수있는 모든 포트).
    2. 마이크로 서비스의 응답이 Connection: close 인 경우 또는 응용 프로그램이 연결 유지를 지원하지 않는 경우 응용 프로그램은 각 요청 후에 TCP 연결을 닫습니다. TCP 연결이 닫히면 닫는 쪽은 2xMSL 동안 TIME_WAIT이됩니다 (RFC 1122 section 4.2.2.13 참조). 기본 MSL은 다시 OS에 따라 다르지만 빈번한 기본값은 30 초입니다. 즉, 응용 프로그램은 해당 포트를 사용하여 60 초 동안 동일한 마이크로 서비스와 통신 할 수 없습니다.
    3. 대신 microservices가 연결을 닫는 경우 (응용 프로그램이 Connection: close을 전송하고 있기 때문에) TIME_WAIT으로 이동하게되고 마이크로 서비스 측에서 포트 고갈로 끝날 수 있습니다.

    포트 고갈에 대한 해결책은 위의 상황 중 어떤 것이 발생하는지에 따라 다릅니다. 다음은 내가 시도 할 사항입니다.

    • 응용 프로그램과 마이크로 서비스간에 연결 유지를 활성화하고 연결 풀을 사용하십시오. 이렇게하면 응용 프로그램과 마이크로 서비스 간의 열린 연결 및 닫힌 연결 수가 크게 줄어들어 TIME_WAIT로 인한 포트 고갈을 피할 수 있습니다.
    • 단일 응용 프로그램 인스턴스와 단일 마이크로 서비스 간의 65k + 동시 연결은 많습니다. 이 제한을 초과하는 경우 가상 응용 프로그램 인스턴스가 가상 IP 주소를 추가하여 요청할 때 사용할 수있는 IP 주소의 수를 늘려야 할 수 있습니다. 응용 프로그램 인스턴스를 추가하여로드 밸런서 뒤에 배치 할 수도 있습니다.
    • 마이크로 서비스를 사용할 수있는 IP 주소의 수를 늘리고 DNS 라운드 로빈과 같은 시스템을 사용하여 IP 주소 간의로드 균형을 조정할 수 있습니다.
    • 응용 프로그램 및/또는 마이크로 서비스의 OS 수준에서 MSL을 조정하여 TIME_WAIT의 소켓 수를 줄일 수 있습니다. 나는 이것을 추천하지 않을 것이다. 잠재적으로 부정적인 부작용이 있으며, 거의 모든 경우에 이것이 문제의 유일한 해결책 인 경우 응용 프로그램이나 아키텍처가 잘못되었습니다.

    먼저 연결 유지 및 연결 풀부터 시작하는 것이 좋습니다.

    관련 문제