이벤트 구동 ASP의 트렁크 모드입니다.NET 핵심 마이크로 서비스 구조
첫 번째 단계에서 두 개의 마이크로 서비스를 만들 것입니다.모든 마이크로 서비스는 자신의 데이터베이스를 가지고 있다.이벤트를 사용하여 변경 사항을 RabbitMQ 이벤트 버스에 게시합니다.(만약 나의 이전 문장에서 이미 이 부분을 실현했다면 이 부분을 뛰어넘을 수 있다).다음에, 메시지가 어떻게 잃어버리는지 보실 수 있습니다. 예를 들어, 메시지 버스가 닫힐 때.
두 번째 부분에서는 transactional outbox pattern을 적용하고 메시지 분실을 어떻게 방지하는지 확인합니다.
마지막 단계에서 게시자와 구독자 확인 및 중복/무질서 메시지 처리를 추가합니다.
컨텐트
1. 생성합니다.NET 핵심 마이크로서비스 및 메시지 교환
자세한 내용은 이전 기사를 참조하십시오.
이렇게 하면 다음과 같은 구성 요소와 워크플로우가 제공됩니다.
이제 마이크로 서비스와 Rabbit MQ 용기'some rabbit'이 모두 실행되어야 한다.사용자 서비스의 RESTAPI를 사용하여 사용자를 만들고 수정하며 모든 것이 정상적인지 확인합니다.Post 서비스는 이벤트와 Post 서비스 처리를 사용자에게 보내야 합니다.사용자 데이터베이스에 있는 사용자와post 데이터베이스에 있는 사용자가 동기화됩니다.
정보 손실
RabbitMQ 컨테이너를 중지하려면 다음과 같이 하십시오.
C:\dev>docker stop some-rabbit
Swagger UI를 사용하여 UserService에서 사용자를 만들려면 다음과 같이 하십시오.{
"name": "Chris2",
"mail": "[email protected]",
"otherData": "Some other data"
}
RabbitMQ 서버에 액세스할 수 없음:사용자가 사용자 데이터베이스에 있는 경우:
이벤트가 분실되었기 때문에 사용자가post 데이터베이스에 없습니다. 마이크로 서비스는 현재 일치하지 않습니다.이 설명서의 다음 단계에서 이 문제를 해결하는 방법을 보실 수 있습니다.
2. 사무성 발송함 모델 실현
이 설명서의 이 섹션에서는 메시지 손실을 방지하기 위해 User Service 항목에 트랜잭션 캐리어 모드를 추가합니다.
If you want to read about the details and concepts of the transactional outbox pattern, you can get more information about it at: https://microservices.io/patterns/data/transactional-outbox.html
IntegrationEvent 솔리드를 생성하려면 다음과 같이 하십시오.
UserServiceContext에 추가:
public DbSet<UserService.Entities.IntegrationEvent> IntegrationEventOutbox { get; set; }
사용자 컨트롤러 수정
PutUser 및 Positser의 코드에서 트랜잭션을 시작하고 사용자 엔티티를 업데이트/삽입합니다.같은 업무에서, 이벤트를 직접 발표하는 것이 아니라 데이터베이스에IntegrationEvent를 삽입합니다:
게시자를 Background Service로 만들기
IntegrationEventSenderService 데이터베이스 폴링 및 완료되지 않은 모든 이벤트를 RabbitMQ로 전송:
Continuously polling the database is not good. You will improve the polling in the next step.
Startup에 Integration EventSender Service를 Hosted Service로 추가합니다.정무사 사장:
추가 읽기: Implement background tasks in microservices with IHostedService and the BackgroundService class
3. (Optional) Test the Implementation
지금은 모든 것이 예상대로 실행되는지 테스트하기에 좋은 시기입니다:
사용자를 삭제합니다.발송함 표를 포함한 데이터베이스 모델을 만들 수 있도록
게시물을 삭제합니다.그래서 두 데이터베이스가 모두 비어 있습니다
RabbitMQ 컨테이너 시작:
C:\dev>docker start some-rabbit
Visual Studio에서 사용자 서비스 시작
Swagger UI를 사용하여 UserService에서 사용자 만들기:
{
"name": "Chris",
"mail": "[email protected]",
"otherData": "Some other data"
}
이벤트의 발송이 콘솔에 기록됨:
RabbitMQ 컨테이너 중지:
C:\dev>docker stop some-rabbit
Swagger UI를 사용하여 UserService에 다른 사용자 만들기:
{
"name": "Chris2",
"mail": "[email protected]",
"otherData": "Some other data"
}
Integration EventSender에서 메시지를 보낼 수 없으며, 5초마다 RabbitMQ 이상을 기록합니다:
PostService 시작(자동 재부팅 로직 없음)
RabbitMQ 컨테이너 시작:
C:\dev>docker stop some-rabbit
IntegrationEventSender 메시지 보내기:
축하합니다: 당신의 발송함이 정상적으로 작동하고 있습니다
3. Add Publisher Notify, Acknowledgments, and Resilient Message Handling
사용자 실체를 삽입하거나 업데이트하면 발표자에게 새로운 항목이 있을 때만 발송 박스 테이블에서 데이터를 불러올 수 있음을 알립니다.사용자 실체의 버전 필드는 소비자의 중복되거나 무질서한 정보를 처리할 수 있습니다.RabbitMQ 게시 서버 확인, 영구 메시지 및 게시 서버, 구독 서버 또는 이벤트 버스가 작동하지 않는 경우 확인
발송함 모드, 발표자 알림, 확인 및 버전 제어의 상세한 작업 절차:
버전 필드를 포함하도록 사용자 실체를 수정합니다:
You could use RowVersion with a production SQL database. But SQLite doesn’t support it.
IntegrationEventSender 수정
발송함에 새로운 항목이 있을 때CancelationToken을 사용하여 깨웁니다.제47, 49, 65 줄의 주석을 참고하여 지속적인 소식과 발표자가 확인하는 실현 방식을 이해하십시오
Synchronously waiting for publisher confirms is very inefficient. See the official RabbitMQ guide for how to improve it.
대기열을 영구 대기열로 만들었는지 확인하기:
Durable queues will be recovered on node boot, including messages in them published as persistent. Messages published as transient will be discarded during recovery, even if they were stored in durable queues. (https://www.rabbitmq.com/queues.html)
사용자 컨트롤러 수정
postaser/PutUser의 version 필드 설정/증가
구조 함수에서IntegrationEventSender를 가져오고 업무를 제출한 후에 호출합니다
수정 프로그램.서비스 후 프로젝트의 cs
제78행 자동 확인 사용하지 않음
75행 발송 확인
45행과 64행에서 중복 메시지가 있는지 확인
Using Program.Main is not optimal. You could move the code to a BackgroundService.
현재 사용자를 삭제하고 데이터베이스를 발표하며 이 안내서의 세 번째 부분에서 보여준 것처럼 사용자의 실현을 테스트할 수 있습니다
4. Final Thoughts and Outlook
이벤트 구동 체계 구조에 발송함 모드를 추가하여 더욱 탄력적으로 만듭니다
생산 환경에서 사용할 코드를 조정해야 합니다: 코드를 정리하고 안전한 모범 사례를 적용해야 합니다.신청NET 핵심 디자인 모드, 오류 처리 등. 게시자 확인을 최적화하고post 서비스에서 Background 서비스를 사용해야 합니다
보낸 편지함의 논리를 DbContext와 같은 중심 위치로 이동하거나 MassTransit 같은 프레임워크를 사용할 수 있습니다.(이 프레임, 전설 이야기와 축소/절분은 아마도 나의 다음 문장에 좋은 선택일 것이다.)
와 에 대한 다른 글을 참고하십시오
질문, 생각 또는 건의가 있으면 저에게 연락하세요
Reference
이 문제에 관하여(이벤트 구동 ASP의 트렁크 모드입니다.NET 핵심 마이크로 서비스 구조), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/christianzink/the-outbox-pattern-in-event-driven-asp-net-core-microservice-architectures-89텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)