alkee-allm / k2proto

grpc service sample
6 stars 2 forks source link

분리된 server instance 테스트 #53

Closed alkee-allm closed 4 years ago

alkee-allm commented 4 years ago

backend 장애처리(#38)작업을 위해 일부 instance 를 분리해 실행(각 서비스별로 process 를 별도로 실행)해보았을 때 다양한 문제가 발생했음.

따라서, 분리된 instance 에서 테스트할 수 있는 환경을 구성하고, 발생하는 문제를 수정해야할 것.

alkee-allm commented 4 years ago

테스트 환경 설정을 위해 각 instance 별로 폴더에 배포(publish)된 서버들을 각각 서로다른 appsettings.json 을 이용해 실행하려 했으나 크래시(#55)

alkee-allm commented 4 years ago

ASPNETCORE_ENVIRONMENT를 이용해 각각 분리된 서비스 구성. 이 때, 공통의 appsettings.jsonservermanager address와 모든 service 들을 disable 하도록 하고, 개별 환경에서 사용하는 service 들만 enable 하여 사용.

IF NOT EXIST appsettings.json (
    ECHO appsettings.json NOT FOUND in %CD%
    PAUSE
    EXIT /B
)
SET ASPNETCORE_ENVIRONMENT=servermanager
C:\work\local\K2\K2svc\bin\Release\netcoreapp3.1\publish\K2svc.exe
PAUSE
alkee-allm commented 4 years ago

세 개의 procsess 로 분리된 환경에서, k2client console 이용해 테스트.

환경 구성 : k2svcTestEnv.zip

alkee-allm commented 4 years ago

broadcast 테스트중 frontend1 에서 오류 발생.

info: Grpc.AspNetCore.Server.ServerCallHandler[7]
      Error status code 'Unavailable' raised.
Grpc.Core.RpcException: Status(StatusCode=Unavailable, Detail="empty channel address")
   at K2svc.Net.GrpcClients.GetClient[T](String backendAddress)
   at K2svc.Frontend.PushSampleService.Broadacast(BroadacastRequest request, ServerCallContext context)
   at Grpc.Shared.Server.UnaryServerMethodInvoker`3.ResolvedInterceptorInvoker(TRequest resolvedRequest, ServerCallContext resolvedContext)
   at Grpc.Shared.Server.UnaryServerMethodInvoker`3.ResolvedInterceptorInvoker(TRequest resolvedRequest, ServerCallContext resolvedContext)
   at Grpc.Shared.Server.InterceptorPipelineBuilder`2.<>c__DisplayClass5_0.<<UnaryPipeline>b__1>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at Grpc.Shared.Server.InterceptorPipelineBuilder`2.<>c__DisplayClass5_0.<<UnaryPipeline>b__1>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at Grpc.AspNetCore.Server.Internal.CallHandlers.UnaryServerCallHandler`3.HandleCallAsyncCore(HttpContext httpContext, HttpContextServerCallContext serverCallContext)
   at Grpc.AspNetCore.Server.Internal.CallHandlers.ServerCallHandlerBase`3.<HandleCallAsync>g__AwaitHandleCall|8_0(HttpContextServerCallContext serverCallContext, Method`2 method, Task handleCall)

remoteConfig.ServermanagerAddress 가 empty string이다.

alkee-allm commented 4 years ago

재현이 되지 않는다... 코드에서 확인하더라도 register 될 때 값이 대입되기 때문에, 공백의 ServerManagementAddress 가 발생하는 상황이라고 유추해볼 수 있다.

이는, ServerManager 가 시작되면 스스로 register 를 통해 serverManagerAddress 변수를 활성화(대입)하는 과정이 있는데, 이 변수가 활성화 되기 전에 Register 되는 서버들은 모두 공백의 ServerManagerAddress를 갖을 수 있는 문제.

해결을 위한 방법을 생각해보면..

  1. ServerManager 가 Self-Register 되기 전까지는 다른 서버들의 Register 거부
  2. Register 시에 전송될 값을 internal state 를 사용하지 않고, localconfig 를 이용하는 방법.

아무래도, ServerManager 가 self-registering 되고나서 온전한 서비스가 진행되는 것이, 추후에 다른 상태들이 register 에서 관리되더라도 올바르게 확장될 수 있을 것 같아 1안이 좋겠다.

alkee-allm commented 4 years ago

수정 후 모든 protocol 정상확인 확인. frontend 를 두개로 쪼개고 두개의 client 를 이용해 테스트.

별 문제 없는 듯.