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

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


회원로그인

IT Tip&Tech

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

페이지 정보

작성자 책읽는아이 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일19-10-11 12:21 조회3,525회 댓글1건

본문

이전에 만들었던 코드는 Manager 클래스에서 메시지 큐처리를 맡고 단일 스레드에서 처리하기 때문에 어느 한 객체에서 메시지 처리에 지연이 발생하면 모두 영향을 받게 됩니다.

메시지 전송에는 동시성이 확보되지만 해당 메시지를 처리하는 부분에서는 동시성이 확보되질 못 합니다.

따라서 메시지 큐처리를 개별 구독 객체 단위로 처리하도록 바꿔 줍니다.

이렇게 하면 객체 단위로 지연 확산이 격리가 되고 동시성을 확보할 수 있습니다.

 

abstract class SubscribeBase : IDisposable

{

bool disposed = false;

    readonly ConcurrentQueue<IMessage> messageQ = new ConcurrentQueue<IMessage>();

    readonly EventWaitHandle msgEvent = new EventWaitHandle(false, EventResetMode.AutoReset);

    CancellationTokenSource cts;

    Task msgProc;

 

    protected SubscribeBase()

    {

cts = new CancellationTokenSource();

msgProc = Task.Factory.StartNew(MsgProc);

    }

~SubscribeBase()

{

Dispose(false);

}

........

void MsgProc()

{

while (cts.IsCancellationRequested == false)

{

msgEvent.WaitOne();

if (cts.IsCancellationRequested)

{

return;

}

while (messageQ.TryDequeue(out var m))

{

......

}

}

}

.........

 

}

Manager 클래스는 Send 호출시 바로 Map 을 뒤져서 해당 구독객체의 메시지 큐에 메시지를 밀어넣습니다.

public void Send(IMessage message) 

{

if (MsgSubscriptionMap.ContainsKey(message.ID))

{

var subIds = MsgSubscriptionMap[message.ID];

foreach (var id in subIds)

{

if (Subscribers.ContainsKey(id))

{

Subscribers[id].Receive(message);

}

}

}

 

 

  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글목록

리틀캔들님의 댓글

리틀캔들 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

아~ 구독이라는 개념이 뭔가 아해가 안갔었는데 이글을 보고서 좀 이해가 갔습니다.
좋은정보 감사해요^^

IT Tip&Tech 목록

Total 138건 1 페이지
IT Tip&Tech 목록
번호 제목 글쓴이 날짜 조회
138 Grafana 세션 로그인 풀리는 문제 책읽는아이 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 03-03 12
137 Phabricator 에서 gitlab repo 가져올 때 ca 인증 에러나는 경우 책읽는아이 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 02-17 70
136 [JAVA]스프링 부트 1.4.2 이상에선 jar 파일로 빌드시 JSP안됩니다! 리틀캔들 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 10-22 782
135 [arduino]Arduino UNO WiFi Rev2 에서 LiquidCrystal_I2C 사용할때 주의점 리틀캔들 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 10-18 795
134 [JAVA]이클립스에서 자바스크립트 syntax coloring 이 되지 않을때 리틀캔들 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 10-17 766
133 [유니티]Resources.Load 가 안되는 황당한 이유 리틀캔들 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 10-10 706
132 아이폰에서 블루투스 키보드로 앱간전환하기 댓글1 인기글첨부파일 리틀캔들 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 09-01 1040
131 [JAVA]전체경로에서 파일명 얻기 리틀캔들 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 08-31 867
130 Visual Studio Code - Java 빌드 환경 설정 댓글1 인기글첨부파일 책읽는아이 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 07-24 1243
129 [java] java 의 integer 비교 댓글1 인기글 리틀캔들 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 02-20 2514
128 Xbox 무선 어뎁터 드라이버 입니다. 댓글3 인기글첨부파일 책읽는아이 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 02-14 2359
127 우클릭 context 메뉴에서 CMD 창 열기 / VSCode 열기 메뉴 추가 레지스트리 댓글1 인기글첨부파일 책읽는아이 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 11-21 2876
126 Redmine 다음 메일 smtp 설정 인기글 책읽는아이 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 11-19 3520
열람중 [Tip,C#] 간단히 만들어보는 메시지 처리 구조 2 댓글1 인기글 책읽는아이 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 10-11 3526
124 [Tip,C#] 간단히 만들어보는 메시지 처리 구조 인기글 책읽는아이 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 10-01 3581
게시물 검색

접속자집계

오늘
495
어제
599
최대
3,675
전체
1,034,948
회사소개 개인정보취급방침 서비스이용약관
Copyright © LittleCandle All rights reserved.
문의메일 : littlecandle99@gmail.com
상단으로
모바일 버전으로 보기