[Tip,C#] 간단히 만들어보는 메시지 처리 구조
관련링크
본문
전체코드 : https://github.com/sysroad/Samples/tree/master/Patterns/Message%20Subscribes
메시지 구독 구조로 등장한지 꽤 된 개념입니다.
유니티도 기본적으로는 이런 처리 방식을 사용하는 것으로 보이고요.
(Subscriber 가 아니라 Listener 라는 표현을 쓰는군요)
메시지 발신자가 특정 수신자를 지정하여 메시지를 발송하는 것이 아니라
발신자는 그저 메시지를 처리 센터?로 발송하고 센터에서는 해당 메시지를 구독한 구독자에게
메시지를 일괄 발송하는 형태입니다.
작성해본 샘플코드에서는 메시지의 인터페이스는 Google.Protobuf.IMessage 를 쓰고
(이건 요즘 json 이나 msgpack 버리고 protobuf 로 작업중이라 썼습니다.. 별다른 이윤없어요;;)
구독자에 대한 인터페이스는
public interface ISubscriber
{
int ID { get; }
void Dispatcher(IMessage message);
}
로 정의하고 몇가지 기본적인 코드를 작성해둔 추상클래스로 SubscriberBase 를 만들었습니다.
SubscriberBase 를 상속하고 유효한 ID 를 부여한 후 생성자 또는 초기화 메서드에서
구독자 ID 등록과 메시지 구독을 해주면 됩니다.
class MySubscriber : SubscriberBase
{
public override int ID { get { return 100; } }
public MySubscriber()
{
MessageManager.Instance.Register(ID, this);
Subscribe("Testing", RecvTesting);
Subscribe("Printing", RecvPrinting);
}
}
메시지 처리 센터? 격인 MessageManager 는 Singleton 으로 만들고 내부에 다음과 같이
발신자 id 와 메시지를 묶은 객체를 담는 큐를 두어 처리하게 했습니다.
class InternalMessage
{
internal int Sender { get; set; }
internal IMessage Message { get; set; }
}
구독자는 메시지 구독을 위해 자신의 ID 를 먼저 등록하고 메시지에 대한 구독 요청을 해야합니다.
( 위에 적은 MySubscriber 처럼 .. )
발신자가 메시지를 발송하면 이 메시지는 큐에 담기게 되고 Event 를 Set() 하여
큐에 쌓인 메시지 처리가 진행되도록 합니다.
sendEvent.WaitOne();
while (MessageQ.TryDequeue(out var msg))
{
.....
MessageManager.Start 를 호출하면 메시지 처리 프로세스가 작동하게 되고
MessageManager.Stop 을 호출하면 종료됩니다.