SDTR
Published in

SDTR

Lightweight Service Bus: MassTransit

S.A. Arkadaşlar,

https://www.maketecheasier.com/lightweight-browsers-for-windows/

Bugün yine mikroservis projesinde kullandığım bir araç olan “MassTransit”ten bahsedeceğiz. Açık kaynaklı bir kütüphane olup bu yazıyı yazdığımda 8.versiyonu yayına alınmış durumda. .Net dünyasına oldukça popüler bir kullanımı var. Kendisinin birçok yeteneği olmasına rağmen biz bugün en temel özelliği olan “service bus” kısmını ele alıyor olacağız. Bunu yapmanın birden çok yolu olsa da MassTransit bu işlemleri bizim için oldukça kolaylaştırıyor. Hazırsak başlayalım.

MassTransit kendisini “lightweight service bus” olarak tanımlıyor olsa da aslında gayet de güçlü bir araç. Ben ilk defa kullandığımda 4 farklı entegrasyonu vardı. Şimdi bu yazıyı ele aldığımda ise yeni 2 entegrasyon daha eklediklerini gördüm. Bu entegrasyonlar aşağıdaki gibidir.

- In Memory

- RabbitMQ

- Azure Service Bus

- Amazon SQS

- gRPC

- ActiveMQ

Bildiğiniz üzere RabbitMQ sektörde mihenk taşlarından kabul edilen ve birçok yazılımcı tarafından kullanılan açık kaynaklı bir mesaj kuyruk sistemidir (message broker). Konumuz RabbitMQ olmadığı için buraya bir nokta koyup yolumuza devam ediyoruz.

MassTransit ayrıca hata yönetimi (exception handling), transaction (saga), retry pattern, scheduling, health check, circuit breaker gibi birçok özelliği de destekleyip bunların kullanımını oldukça basit bir hale getirmektedir. Projede bu özelliklerin birçoğunu kullanıyoruz, belki başka yazılarda onları ele alma fırsatımız olur.

Bu yazıda ise mikroservis projemizde bunu nasıl ele aldığımızı göstereceğiz. Öncelikle mesajı gönderen (send/publish — Guide) sonra da bunu tüketen (consumer — Report) kısımlara odaklanacağız. Şimdi “Guide” servisindeki ayarları ele alalım.

public void ConfigureServices(IServiceCollection services)
{
services.AddMassTransit(x =>
{
//Diğer ayarlar
x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Host("host", h => //config dosyasından alabiliriz.
{
h.Username("username");
h.Password("pwd");
});
));
});
}

NuGet üzerinden de “MassTransit.RabbitMQ” paketini indirmeniz gerekmektedir. RabbitMQ paketi MassTransit paketine bağlı olduğu için sadece bunu indirmemiz yeterli olacaktır.

Install-Package MassTransit.RabbitMQ -Version 8.0.6

Ayarlarımızı tamamladık, öyleyse şimdi bunu kullanma vakti.

public class GuideController : ControllerBase
{
private readonly IBus _bus;
// MassTransit sizin yerinize DI yapıyor.
public GuideController(IBus bus)
{
_bus = bus;
}

public async Task Action()
{
//Diğer kodlarınızı buraya yazabilirsiniz
await _bus.Publish(YourModel);
}
}

Burada bahsettiğimiz model; dto, class, interface veya record olabilir. MassTransit bunu “best practice” olarak record tavsiye etmiş. Bunun da nedenleri var, bu konuya bir göz atmanızı tavsiye ederim. Konunun dağılmaması adına buraya girmiyorum.

Şimdi de gelen bu event’i tüketen (consume) Report servisine gelelim. Yine ayarlarımızı yapıyoruz.

public void ConfigureServices(IServiceCollection services)
{
services.AddMassTransit(x =>
{
x.AddConsumer<YourConsumer>();

x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Host("host", h =>
{
h.Username("username");
h.Password("pwd");
});
cfg.ReceiveEndpoint("guide-service", ep =>
{
ep.ConfigureConsumer<YourConsumer>(provider);
});
});
});
}

Ayarlarımızı tamamladık, şimdi de bu işlemi yakalayacak sınıfımızı yazalım

public class YourConsumer : IConsumer<YourModel> //Bu interface kullanmak zorunlu.
{
public async Task Consume(ConsumeContext<YourModel> context)
{
var reportId = context.Message.ReportId;
await Console.Out.WriteLineAsync
($"Report operation is succeeded! Report Id: {reportId}.");
//Diğer kodlarınızı öncesinde veya sonrasına yazabiliriz.
}
}

Aynı paketi bu servis için de NuGet üzerinden indirerek projeyi hazır hale getirebiliriz.

Yazıyı ertelemek hastalığıyla ilgili bir hadis-i şerif ile bitirelim.

“Böbürlenip kibirlenen, fitnecilik yapan kimse olmayın; iyi, güzel şeylerin ticareti dışında ticaret eden de olmayın. Muhakkak ki, onlar amellerini geriye erteleyen / yarıncı kimselerdir.

(Müsned, 1/129; bk. Mecmau’z-Zevaid, 5/172).

Originally published at https://malikmasis.blogspot.com.

--

--

Yetenekli ve bilgili geliştiricilerden oluşan bir topluluk!

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store