Pub-Sub 패턴 및 메시지 브로커, 모든 구독자가 이벤트 작업을 완료했는지 확인하는 방법

보울 라

우선, NATS와 같은 좋은 (그리고 가벼운) 메시지 브로커가 있다는 것을 알고 있습니다. 이것이 직업이라면, 나는 확실히 입증 된 해결책을 가지고 갈 것입니다. 이것은 호기심과 이해하려는 의지에 관한 것입니다.

CRM과 같은 시스템을 구축하고 마이크로 서비스를 기반으로 쉽게 확장 할 수 있고 워크로드에 맞게 조정할 수 있다고 가정 해 보겠습니다. 마이크로 서비스는 분리되어야하기 때문입니다. pub-sub가 들어옵니다. pub-sub가 의도 한대로 작동하려면 (게시자와 구독자의 분리) 메시징 시스템이 필요합니다. node.js로 이것을 실현하고 싶다고 가정 해 봅시다 (이 작업을 수행하는 데 훨씬 더 빠른 방법이 있음을 완전히 알고 있음).

내 "문제"또는 잠재적으로인지 장애는 모든 구독자가 구독 한 주제에서 메시지를 받았는지 확인하는 방법에 대해 머리를 감는 것입니다.

클라이언트 / 프런트 엔드는 이벤트 요청을 브로커에 보냅니다. 브로커는 잠재적으로 메시지를 확인하고 의도 한 대기열에 넣습니다. 이 대기열에는 2 개의 마이크로 서비스가 구독됩니다. 브로커는 이제 두 마이크로 서비스에 대한 콜백과 함께 대기열에서 가장 오래된 이벤트를 전송하고 있습니다.

마이크로 서비스 중 하나가 다른 하나보다 훨씬 느릴 때 문제가 발생하지 않습니까?

내 말은 모든 구독자가 작업을 완료했음을 나타내는 확인 메시지를 다시 보내지 않는 한 작동해야합니다. 클라이언트는 이벤트 요청과 관련된 서비스 수를 모르기 때문에 추적 할 수 없습니다. 따라서 브로커가 수행해야합니다.

메시지 브로커에 포함해야한다는 뜻입니까? 주어진 이벤트의 상태를 계산하는 가입 된 서비스를 추적하는 것입니까?

보울 라

더 많은 조사와 몇 시간 동안 침대에 누워 잠에서 깼다. 나는 게시자가 보낸 메시지의 상태를 추적하기 위해 응답 / 승인을 받고자하는 경우 한 주제 / 주제에 여러 구독자를 갖는 것은 나쁜 습관으로 간주되어야한다는 결론에 도달했습니다. 요청 / 메시지 / 이벤트.

몇 가지 더 생각한 끝에 동일한 주제에 대한 여러 구독 서비스가 거의 필요하지 않다는 결론에 도달했습니다. 적어도 서비스를 올바르게 설계하는 한 내 시나리오에서는 그렇습니다. 내가 생각할 수있는 유일한 시나리오는 이미 배포 된 서비스를 건드리지 않고 나중에 특정 기능을 추가하는 것입니다. 이것은 부적합한 서비스 디자인에 대한 수정처럼 느껴집니다.

그런 다음 어떻게 관리 할 수 ​​있을지 생각하고 3 가지 접근 방식을 생각해 냈습니다.

먼저 표준 구조

표준 게시-구독 구조더 이상의 설명이 필요하지 않습니다. 일부 방법의 세부 사항은 신경 쓰지 마십시오. 확실히 이상적이지 않은 브레인 스토밍 버전입니다. 패턴을 표시하는 것으로 충분합니다.

접근 방식 1-Aggregator가 응답을 수집합니다.

애그리 게이터 접근 방식브로커는 모든 구독자를 추적하기 때문에 예상되는 응답 수를 항상 알고 있거나 쉽게 계산할 수 있습니다. 따라서 응답 또는 성공 메시지가 필요한 메시지를 보내거나 게시 할 때 자동으로 생성되는 Aggregator Subject로 응답 메시지를 리디렉션 할 수 있습니다 (일부 고객 데이터의 업데이트를 생각해보십시오. 메시지가 통해 성공적으로 처리됨).

Of course, the Aggregator could always be inbetween even if there's just one response coming back. That'd reduce the amount of cases to cover. The Aggregator is basically some sort of proxy. It still adds complexity to the Broker though.

Approach 2 - Broker publishes acknowledge messages

확인 메시지 게시 First of all: don't mind the mess with the connections on the right. It works for me as a sketch but is far from tidy.

Every message that is being published is being answered with an acknowledge message by the Broker. That message is being put on the messages individual subject stack. Since the Broker knows how many Subscribers every Subject has, it can send back how many responses a Publisher should expect. Acknowledge messages in general are also usefull to notify Publishers wether their message/event/request was accepted or not as well (think of a authentication and authorization pattern here).

This will work as long as the Publisher always wants a response. If it doesn't messages could stick around for quite a while. A timeout could solve this.

Approach 3 - Transport Protocol Responses

전송 프로토콜 응답 This is very similar to approach 2 with the difference that the transport protocol is being used to inform the Publisher about the status of the sent request and the potential number of responses to expect.

Since most if not all protocols suitable for this kind of topography offer some way of response messages and since those should be used anyway to verify that the message has been successfully sent in the first place, the answer could also contain a payload informing the client not only about the successful transfer but also about how many responses to expect.

Conclusion

Aggregator 접근 방식은 오버 헤드가 너무 많고 전송 프로토콜이나 메시지 시스템 자체를 사용하는 것보다 더 많은 추가 코드가 필요하다고 말하고 싶습니다. Aggregator는 클라이언트가 서비스에 대해 완전히 알 수 없어서 분리되기 때문에 흥미 롭습니다.

메시지 시스템의 사용은 로깅 목적 (잠재적 디버깅) 및 Sagas 구현 (이벤트 체인)에서도 흥미 롭습니다.

노트

이러한 접근 방식을 모범 사례로 홍보하지 않습니다. 내 연구 결과로 내 질문에 답하고 싶습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관