8 Eylül 2022 Perşembe

Lightweight Service Bus: MassTransit

     S.A. Arkadaşlar,

     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ı entegrasyonları vardı. Şimdi bu yazıyı ele aldığımda 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 kuryruk sistemidir (message broker). Konumuz RabbitMQ olmadığı için buraya bir nokta koyuyoruz.

    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 microservis 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 bunu kullanalım.

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).

Hiç yorum yok:

Yorum Gönder