Produkcja i konsumpcja komunikatów
Wysyłaj i obsługuj komunikaty za pomocą MassTransit.
Produkcja i konsumpcja komunikatów to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.
Rejestrowanie MassTransit
MassTransit należy skonfigurować w DI: zarejestrować go, wskazać transport (tutaj RabbitMQ) i pozwolić mu wykryć konsumentów.
builder.Services.AddMassTransit(x =>
{
x.AddConsumers(typeof(Program).Assembly);
x.UsingRabbitMq((context, cfg) =>
{
cfg.Host("localhost");
cfg.ConfigureEndpoints(context);
});
});Definiowanie konsumenta
Konsument implementuje IConsumer<T> dla typu wiadomości, który obsługuje. Logika znajduje się w metodzie Consume, która otrzymuje obiekt ConsumeContext<T>.
public class OrderPlacedConsumer : IConsumer<OrderPlaced>
{
public async Task Consume(ConsumeContext<OrderPlaced> context)
{
OrderPlaced message = context.Message;
// handle the event
}
}Publikowanie zdarzenia
Należy wstrzyknąć IPublishEndpoint i wywołać Publish, aby rozgłosić zdarzenie do wszystkich subskrybentów.
public class OrderService
{
private readonly IPublishEndpoint _publish;
public OrderService(IPublishEndpoint publish) => _publish = publish;
public Task PlaceOrderAsync(Guid id, string email) =>
_publish.Publish(new OrderPlaced(id, email));
}Wysyłanie polecenia
Polecenia są kierowane do konkretnego endpointu. Należy pobrać obiekt ISendEndpoint dla miejsca docelowego i wywołać Send.
var endpoint = await _sendProvider
.GetSendEndpoint(new Uri("queue:charge-payment"));
await endpoint.Send(new ChargePayment(orderId, amount));Podsumowanie: Publish a Send
Publish służy do zdarzeń i dociera do każdego subskrybującego konsumenta, natomiast Send służy do poleceń i kieruje wiadomość do jednej kolejki. Właściwy wybór określa sposób routingu wiadomości.
Możliwości ConsumeContext
ConsumeContext udostępnia nie tylko wiadomość, lecz także identyfikatory korelacji, nagłówki oraz możliwość publikowania wiadomości lub wysyłania odpowiedzi z poziomu konsumenta, co umożliwia łączenie wiadomości w łańcuch.
public async Task Consume(ConsumeContext<OrderPlaced> context)
{
await context.Publish(new InvoiceRequested(context.Message.OrderId));
}Żądanie i odpowiedź
MassTransit obsługuje również komunikację żądanie–odpowiedź za pośrednictwem wiadomości. Klient żądań wysyła żądanie i oczekuje na odpowiedź określonego typu. Jest to przydatne, gdy potrzebna jest odpowiedź, a jednocześnie chcą Państwo zachować luźne powiązanie dzięki brokerowi.
var response = await _client
.GetResponse<OrderStatus>(new GetOrder(orderId));
OrderStatus status = response.Message;Nazewnictwo endpointów
ConfigureEndpoints automatycznie nadaje nazwę endpointowi odbiorczemu (kolejce) dla każdego konsumenta, korzystając z konwencji. W razie potrzeby można dostosować nazwy za pomocą formatterów lub jawnej konfiguracji.
Serializacja wiadomości
Domyślnie MassTransit serializuje wiadomości jako JSON i dołącza metadane, takie jak typ wiadomości oraz identyfikatory. Producenci i konsumenci współdzielą typy kontraktów wiadomości, często umieszczone we wspólnym pakiecie.
Współbieżność
Konsument może przetwarzać wiele wiadomości równolegle. Należy dostosować PrefetchCount oraz limity współbieżności, aby zachować równowagę między przepustowością a możliwościami systemów zależnych.
cfg.ReceiveEndpoint("orders", e =>
{
e.PrefetchCount = 16;
e.ConcurrentMessageLimit = 8;
e.ConfigureConsumer<OrderPlacedConsumer>(context);
});Testowanie konsumentów
MassTransit udostępnia działający w pamięci test harness, dzięki któremu można opublikować wiadomość i sprawdzić, czy konsument ją obsłużył, bez korzystania z rzeczywistego brokera.
Szybkie sprawdzenie
Przetestowanie tworzenia i odbierania wiadomości.
Podsumowanie
Należy zarejestrować MassTransit za pomocą AddMassTransit, skonfigurować transport oraz ConfigureEndpoints. Konsumenci implementują IConsumer<T> z metodą Consume. Należy używać IPublishEndpoint.Publish dla zdarzeń (wszyscy subskrybenci) oraz ISendEndpoint.Send dla poleceń (jedna kolejka). ConsumeContext umożliwia łączenie wiadomości oraz komunikację żądanie–odpowiedź, a test harness pozwala weryfikować konsumentów w pamięci.
Często zadawane pytania
Czy lekcja „Produkcja i konsumpcja komunikatów” jest bezpłatna?
Tak — pełny tekst „Produkcja i konsumpcja komunikatów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Produkcja i konsumpcja komunikatów”?
Wysyłaj i obsługuj komunikaty za pomocą MassTransit. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C# Academy?
Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Produkcja i konsumpcja komunikatów”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?
Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Koncepcje komunikacji
- Produkcja i konsumpcja komunikatów
- Sagi i przepływy pracy
- Obsługa błędów i ponawianie prób