반응형

Job queue 7

Part 4-5-7. Job Queue : JobTimer

Job Queue 지난 시간에는 GameRoom 스크립트에서 BroadCast 메서드가 foreach문을 통해 Send를 계속했을 때 나타나는 문제점을패킷 모아보내기라는 기법을 활용하여 처리하는 시간을 가졌다. 그렇지만 GameRoom과 같이 무슨무슨 룸들이 점차 많아지고, 각각의 룸들이 서로 다른 대기시간을 가지며 실행이 된다고 하면 지금과 같은 방법으로는 처리할 수 없기 때문에 일감 관리를 도와주는 Timer를 통해 이를 해결해보는 시간을 가진다. 🏃 틱을 사용한 처리 현재 시간과 roomTick이라는 변수를 통해 두 변수의 시간을 비교하며 실행할지, 말지 결정하는 방법이다. 위와 같은 방법으로 코드를 구성한다면 각 룸에 따라 메인 루프에서 틱에 맞춰서 동작하도록 구성할 수 있다. 다만 메인 메서드의..

Part 4-5-6. Job Queue : 패킷 모아보내기

Job Queue 지난 시간에는 GameRoom 스크립트에서 BroadCast 메서드가 foreach문을 통해 Send를 계속했을 때 나타나는 문제점에 대해서 알아보았다. 따라서 오늘은 이를 해결하기 위해서 패킷 모아보내기 라는 개념을 학습하여 코드를 보완하는 시간을 가져본다. 😁 🌼 모아보내기를 하기 위해 패킷을 저장할 위치 선정 그렇다면 패킷 모아보내기를 어디에서 처리해야할까? 이는 크게 엔진 영역과, 컨텐츠 영역으로 나뉘어져 있는데, 여기에서는 컨텐츠 영역에서 이를 진행하도록 한다. 만약 엔진 영엑에서 이를 하고자 한다면, ServerCore 프로젝트 내 Session - Send 메서드에서 할 수 있다. 기존 Send 메서드에서는 Enqueue()를 통해 바로 넣고, RegisterSend를 하는..

Part 4-5-5. Job Queue : Job Queue #2

Job Queue 지난 시간에는 Action과 람다식을 이용해 함수를 직접적으로 실행하는 것이 아닌, 스레드에게 일감을 주는 형태로 변경하는 시간을 가졌다. 오늘은 똑같이 동작하지만 수동적으로 Task를 만들어주는 수동적인 방법에 대해서 알아보도록 한다. 📧 Task Queue Task Queue라는 새로운 클래스를 서버 프로젝트 밑에 새롭게 생성하고 interface ITask를 새롭게 생성해준다. 이 후 Excute()라는 메소드를 생성해준다. 일 처리가 필요한 함수(Enter, Leave, BroadCast 등)에 맞도록 클래스를 새롭게 만들어준다. 예시로는 BroadCast를 만들어 볼것이다. 아래와 같이 작성하여 필요한 변수와 값들을 담아주도록 하자. 이전 시간처럼 실행시켰던 BroadCast ..

Part 4-5-4. Job Queue : Job Queue #1

Job Queue 지난 시간에는 디자인 패턴 중 커맨드 패턴에 대해서 학습하는 시간을 가지었다. 커맨드 패턴은 사용자의 요구사항을 객체로 캡슐화하여 일감을 처리하는 스레드에게 던져준다고 이해하면 될 것같다. 오늘은 학습한 커맨드 패턴을 활용하여 Job Queue를 마저 구현해보자. 🧱 JobQueue 우선 Server 영역에 JobQueue 라는 클래스를 새롭게 만들어준다. 해당 클래스를 다른 곳에서도 사용하기 위하여 Public 으로 변경해주고, IJobQueue 라는 Interface를 만들어 해당 인터페이스를 상속 받도록 설정해준다. 📏 Interface 일감을 밀어 넣기 위한 함수 Push()를 새롭게 만들어주고, 이 행위 자체를 넘겨주기 위해 Action을 매개변수로 이용하여 사용한다. 📏 Jo..

Part 4-5-3. Job Queue : Command 패턴

Job Queue 지난 시간에는 채팅 테스트를 인원 수(1, 10, 100명)를 설정한 후 직접 실행해보는 시간을 가졌다. 이 때 인원이 늘어남에 따라 나타나는 부하의 문제점을 확인하였다. 이를 처리하기 위한 기능이 Job, Task인 것을 알았으니 오늘은 이를 학습해보는 시간을 가져보자. 😎 🖥️ Command Pattern 지금 작성한 스크립트의 문제점은 쓰레드가 일감을 받으면, 아래 이미지와 같이 다른 사람에게 일을 시키는 것이 아닌 일감을 받음과 동시에 이를 처리까지 모두 하고 있는 것이 문제되는 것이다. 이 때 lock의 특성까지 더 해져 한번에 하나의 쓰레만을 이용하여 일을 진행하다보니, 대기하는 쓰레드들이 쌓이는 것이다. 그래서 이를 해결하기 위해서는 아래 이미지와 같이 다른 쓰레드들은 Qu..

Part 4-5-2. Job Queue : 채팅 테스트 #2

Job Queue 지난 시간에는 채팅 테스트를 위한 GameRoom을 만들고, 입장, 나가기, 전송하기 등의 기능을 구현해주었다. 또한 SessionManager를 새롭게 만들어, 이를 통해 세션을 생성해주고 관리해주도록 하였다. ⛈️ Client Session 현재 클라이언트에서는 한 명의 유저만 접속하고 있는 상황이므로, 이를 다수의 유저들이 접속하는 상황으로 가정하고 변경할 것이다. 🐦‍⬛ Server Session 서버쪽과 동일하게 클라이언트 세션에도 Manager를 만들어주어 직접적으로 세션을 생성하는 것이 아닌 Manager를 통해 제작하고 넘겨주는 방식을 통해 작동하도록 하자. 변경 전, 후 🐦‍⬛ SessionManager 제작 서버에서 작업했던 것과 동일한 방식으로, 싱글톤 형식을 이용해..

Part 4-5-1. Job Queue : 채팅 테스트 #1

Job Queue 지난 시간에는 드디어 Packet Generator의 작업이 모두 끝났다. 🤯 자동화 과정이 조금 지루하긴 했지만, 코드 그 자체를 string 변수에 담아 패킷 별로 구분하여 {0}, {1}을 이용해 생성해주는 방식은 정말 듣도 보도 못한 과정이었다. 이걸 보니 취준생일 때 부터 지금까지 꾸준하게 날 가르쳐주고 있는 루키스님이 새삼 대단하고 느껴지네. 😂 ⛳ 추가 개선 예전에 작성해두었던 ServerCore 프로젝트 내 Session 클래스 안에 RegisterSend(), OnSendComplete() 메서드를 다시 확인해보자. 해당 메서드는 중간에 접속이 끊겼을 때에 대한 처리가 없어 위와 같이 진행된다면 틀림없이 문제가 생길 것이다. 🚦 RegisterSend() Register..

반응형