alkee-allm / k2proto

grpc service sample
6 stars 2 forks source link

Push service thread safety 문제 #46

Closed alkee-allm closed 4 years ago

alkee-allm commented 4 years ago

RequestStream.WriteAsync 함수가 thread-safe 하지 않기 때문에, backend 로부터 전달받은 push request 가 thread-safe 하지 않을 수 있다.

따라서, 이를 확인하고 수정이 필요하다.

alkee-allm commented 4 years ago

RequestStream.WriteAsync is not safe for multi-threading. Only one message can be written to a stream at a time. Sending messages from multiple threads over a single stream requires a producer/consumer queue like Channel\<T> to marshall messages.

별도의 queue(channel)까지 두기보다 간단히 user 수준(`user.Stream)의 lock 이면 되지 않을까? lock 중에는 같은 thread 에서 동작 해야하는 task 가 모두 지연이 될 수 있겠지만, 가장 간단한 수정으로 진행하고 추후에 문제가 있다면 추가 진행할 것.

alkee-allm commented 4 years ago

문제

            lock (responseStream) // 
            {
                await responseStream.WriteAsync(new PushResponse
                {
                    Type = PushResponse.Types.PushType.Config,
                    Message = "jwt",
                    Extra = newJwt
                });
            }

와 같이 사용하면 CS1996: lock 문의 본문에서 await를 사용할 수 없습니다. 빌드 오류. lock 이 걸려있는 상태에서는 Task 중(다른 thread) deadlock 이 발생하기 쉽기 때문일 것. 역시 producer/consumer queue 를 사용해야할까..

예시