9. 메시징패턴

메시징 패턴

  • 메시지란 무엇인가

  • 요청과 응답

  • 발행 구독

  • 데드 레터 큐

  • 메시지 재생

  • 파이프와 필터

1. 메시지란 무엇인가

메시지 -> 데이터 -> 정보를 주고 받게 하는 매개체

  • 명령 A->B로 전달하는 하나의 지시문

  • 이벤트 1:M으로 발생하는 사건 -> 비동기의 한 예

2. 요청 응답

비동기적인 동작.

A <-> B 요청 A -> B 데이터를 보내서 응답 A <- B 데이터 처리 결과

  // 요청 응답 패턴
  // 중간자
  var CrowMailBus = (function () {
    function CrowMailBus(requestor) {
      this.requestor = requestor;
      this.responder = new CrowMailResponder(this);
    }

    CrowMailBus.prototype.send = function (message) {
      var _this = this;
      if (message._from == 'requestor') {
        this.responder.processMessage(message);
      } else {
        this.requestor.processMessage(message);
      }

      // 웹워커와의 통신형태
      // if (message._from == 'requestor') {
      //   process.nextTick(function () {
      //     return _this.responder.processMessage(message);
      //   });
      // } else {
      //   process.nextTick(function () {
      //     return _this.requestor.processMessage(message);
      //   });
      // }
    };
    return CrowMailBus;
  })();

  // 요청
  var CrowMailRequestor = (function () {
    function CrowMailRequestor() {
    }

    CrowMailRequestor.prototype.request = function () {
      var message = {
        _messageDate: new Date(),
        _from: "requestor",
        _corrolationId: "Aaa",
        body: "Invade Moat Cailin"
      };

      // return message;
      var bus = new CrowMailBus(this);
      bus.send(message);
    };

    CrowMailRequestor.prototype.processMessage = function (message) {
      console.dir(message);
    };
    return CrowMailRequestor;
  })();

  // 응답
  var CrowMailResponder = (function () {
    function CrowMailResponder(bus) {
      this.bus = bus;
    }

    CrowMailResponder.prototype.processMessage = function (message) {
      var response = {
        _messageDate: new Date(),
        _from: "responder",
        _corrolationId: message._corrolationId,
        body: "Okey, invaded"
      };
      this.bus.send(response);
    };
    return CrowMailResponder;
  })();

  var requestor = new CrowMailRequestor();
  var bus = new CrowMailBus(requestor);
  var responder = new CrowMailResponder(bus);
  requestor.request("request Send");
  requestor.request("request Send");

3. 발행과 구독

구독 발행을 통해 메시지를 주고 받으면서 관리 기본적인 옵저버패턴의 응용 redux, vuex, RxJS, RxJava 등 비동기 라이브러리의 근간 개념

    CrowMailBus.prototype.publish = function (message) {
      for (let i = 0; i < this.responders.length; i++) {
        // 메시지를 등록한 핸들러 -> 호출
        if (this.responders[i].messageName == message._messageName) {
          (function (b) {
            process.nextTick(function () {
              return b.subscriber.processMessage(message);
            });
          })(this.responders[i]);
        }
      }
    };

4. 팬아웃과 팬인

분산 병렬 멀티 웹워커 단일스레드의 장점 -> 멀티 스레드의 경합조건을 생각할 필요 없음

병렬처리 후 최종 결합 -> 포크/조인 개념

Last updated