[Tip,C#] 간단히 만들어보는 메시지 처리 구조 > IT Note

본문 바로가기
사이트 내 전체검색

IT Note

[Tip,C#] 간단히 만들어보는 메시지 처리 구조
0

View 9,252  | 작성일2019.10.01 17:12

본문

전체코드 : 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 을 호출하면 종료됩니다.

 

 

 

 

댓글목록

등록된 댓글이 없습니다.

IT Tip&Tech 목록

게시물 검색

접속자집계

오늘
245
어제
901
최대
6,399
전체
660,604
Copyright © LittleCandle All rights reserved.
문의메일 : littlecandle99@gmail.com
모바일 버전으로 보기