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
Was this helpful?