Skip to content

RabbitMQ

Giriş

RabbitMQ, açık kaynaklı bir message broker'dır. AMQP (Advanced Message Queuing Protocol) protokolünü kullanır ve .NET uygulamalarıyla kolay entegrasyon sağlar.

RabbitMQ Temel Kavramlar

  1. Exchange
  2. Mesajların gönderildiği ilk nokta
  3. Farklı tipleri vardır
  4. Routing kurallarını belirler

  5. Queue

  6. Mesajların depolandığı yer
  7. Consumer'ların bağlandığı nokta
  8. Özellikleri yapılandırılabilir

  9. Binding

  10. Exchange ve Queue arasındaki bağlantı
  11. Routing key ile yönlendirme
  12. Farklı binding tipleri

Exchange Tipleri

  1. Direct Exchange
  2. Routing key tam eşleşme
  3. Tek bir queue'ya yönlendirme
  4. Basit routing senaryoları

  5. Fanout Exchange

  6. Tüm bağlı queue'lara gönderim
  7. Routing key kullanılmaz
  8. Broadcast senaryoları

  9. Topic Exchange

  10. Pattern matching ile routing
  11. Wildcard kullanımı
  12. Kompleks routing senaryoları

  13. Headers Exchange

  14. Header değerlerine göre routing
  15. Routing key kullanılmaz
  16. Özel routing senaryoları

.NET'te RabbitMQ Kullanımı

Temel Kurulum

// NuGet paketleri
Install-Package RabbitMQ.Client

Connection Factory

var factory = new ConnectionFactory
{
    HostName = "localhost",
    UserName = "guest",
    Password = "guest",
    Port = 5672
};

Producer Örneği

public class RabbitMQProducer
{
    private readonly IConnection _connection;
    private readonly IModel _channel;

    public RabbitMQProducer(string hostName)
    {
        var factory = new ConnectionFactory { HostName = hostName };
        _connection = factory.CreateConnection();
        _channel = _connection.CreateModel();
    }

    public void PublishMessage(string exchange, string routingKey, string message)
    {
        var body = Encoding.UTF8.GetBytes(message);
        _channel.BasicPublish(exchange: exchange,
                            routingKey: routingKey,
                            basicProperties: null,
                            body: body);
    }

    public void Dispose()
    {
        _channel?.Dispose();
        _connection?.Dispose();
    }
}

Consumer Örneği

public class RabbitMQConsumer
{
    private readonly IConnection _connection;
    private readonly IModel _channel;

    public RabbitMQConsumer(string hostName)
    {
        var factory = new ConnectionFactory { HostName = hostName };
        _connection = factory.CreateConnection();
        _channel = _connection.CreateModel();
    }

    public void StartConsuming(string queueName, Action<string> messageHandler)
    {
        var consumer = new EventingBasicConsumer(_channel);
        consumer.Received += (model, ea) =>
        {
            var body = ea.Body.ToArray();
            var message = Encoding.UTF8.GetString(body);
            messageHandler(message);
            _channel.BasicAck(ea.DeliveryTag, false);
        };

        _channel.BasicConsume(queue: queueName,
                            autoAck: false,
                            consumer: consumer);
    }

    public void Dispose()
    {
        _channel?.Dispose();
        _connection?.Dispose();
    }
}

RabbitMQ Best Practices

  1. Connection Yönetimi
  2. Connection pooling
  3. Connection recovery
  4. Heartbeat ayarları
  5. Timeout yönetimi

  6. Channel Yönetimi

  7. Channel pooling
  8. Channel recovery
  9. Channel limitleri
  10. Channel multiplexing

  11. Queue Yapılandırması

  12. Durable queues
  13. Exclusive queues
  14. Auto-delete queues
  15. Queue limits

  16. Mesaj Yönetimi

  17. Message persistence
  18. Message TTL
  19. Message priority
  20. Message batching

RabbitMQ Monitoring

  1. Management UI
  2. Queue durumu
  3. Connection durumu
  4. Channel durumu
  5. Message rates

  6. Prometheus Integration

  7. Metrik toplama
  8. Alerting
  9. Grafana dashboards

  10. Logging

  11. Connection logs
  12. Channel logs
  13. Message logs
  14. Error logs

Mülakat Soruları

Temel Sorular

  1. RabbitMQ nedir ve nasıl çalışır?
  2. Cevap: RabbitMQ, açık kaynaklı bir message broker'dır. AMQP protokolünü kullanır ve mesajların exchange'ler üzerinden queue'lara yönlendirilmesini sağlar.

  3. RabbitMQ'da exchange tipleri nelerdir?

  4. Cevap:

    • Direct Exchange
    • Fanout Exchange
    • Topic Exchange
    • Headers Exchange
  5. RabbitMQ'da mesaj garantisi nasıl sağlanır?

  6. Cevap:

    • Publisher confirms
    • Consumer acknowledgments
    • Message persistence
    • Dead letter exchanges
  7. RabbitMQ'da yük dengeleme nasıl yapılır?

  8. Cevap:

    • Work queue pattern
    • Consumer prefetch
    • Queue length limits
    • Message priority
  9. RabbitMQ'da hata yönetimi nasıl yapılır?

  10. Cevap:
    • Dead letter exchanges
    • Retry mechanisms
    • Error queues
    • Error handling strategies

Teknik Sorular

  1. RabbitMQ'da connection ve channel yönetimi nasıl yapılır?
  2. Cevap:

    public class RabbitMQConnectionManager
    {
        private readonly ConnectionFactory _factory;
        private IConnection _connection;
        private readonly ConcurrentDictionary<string, IModel> _channels;
    
        public RabbitMQConnectionManager(string hostName)
        {
            _factory = new ConnectionFactory { HostName = hostName };
            _channels = new ConcurrentDictionary<string, IModel>();
        }
    
        public IModel GetChannel(string channelName)
        {
            return _channels.GetOrAdd(channelName, _ =>
            {
                if (_connection == null || !_connection.IsOpen)
                {
                    _connection = _factory.CreateConnection();
                }
                return _connection.CreateModel();
            });
        }
    }
    

  3. RabbitMQ'da publisher confirms nasıl implemente edilir?

  4. Cevap:

    public class ConfirmedPublisher
    {
        private readonly IModel _channel;
    
        public ConfirmedPublisher(IModel channel)
        {
            _channel = channel;
            _channel.ConfirmSelect();
        }
    
        public async Task PublishWithConfirmation(string exchange, string routingKey, string message)
        {
            var body = Encoding.UTF8.GetBytes(message);
            _channel.BasicPublish(exchange, routingKey, null, body);
    
            if (!_channel.WaitForConfirms(TimeSpan.FromSeconds(5)))
            {
                throw new Exception("Message was not confirmed");
            }
        }
    }
    

  5. RabbitMQ'da consumer prefetch nasıl ayarlanır?

  6. Cevap:

    public class PrefetchConsumer
    {
        private readonly IModel _channel;
    
        public PrefetchConsumer(IModel channel, ushort prefetchCount)
        {
            _channel = channel;
            _channel.BasicQos(0, prefetchCount, false);
        }
    
        public void StartConsuming(string queueName)
        {
            var consumer = new EventingBasicConsumer(_channel);
            consumer.Received += (model, ea) =>
            {
                // Process message
                _channel.BasicAck(ea.DeliveryTag, false);
            };
    
            _channel.BasicConsume(queueName, false, consumer);
        }
    }
    

  7. RabbitMQ'da dead letter exchange nasıl yapılandırılır?

  8. Cevap:

    public class DeadLetterSetup
    {
        private readonly IModel _channel;
    
        public DeadLetterSetup(IModel channel)
        {
            _channel = channel;
        }
    
        public void SetupDeadLetter(string queueName)
        {
            var args = new Dictionary<string, object>
            {
                { "x-dead-letter-exchange", "dlx" },
                { "x-dead-letter-routing-key", queueName }
            };
    
            _channel.QueueDeclare(queueName, true, false, false, args);
            _channel.ExchangeDeclare("dlx", ExchangeType.Direct);
            _channel.QueueDeclare($"dlq.{queueName}", true, false, false);
            _channel.QueueBind($"dlq.{queueName}", "dlx", queueName);
        }
    }
    

  9. RabbitMQ'da message TTL nasıl ayarlanır?

  10. Cevap:
    public class MessageTTLSetup
    {
        private readonly IModel _channel;
    
        public MessageTTLSetup(IModel channel)
        {
            _channel = channel;
        }
    
        public void SetupQueueWithTTL(string queueName, int ttlMilliseconds)
        {
            var args = new Dictionary<string, object>
            {
                { "x-message-ttl", ttlMilliseconds }
            };
    
            _channel.QueueDeclare(queueName, true, false, false, args);
        }
    
        public void PublishMessageWithTTL(string exchange, string routingKey, string message, int ttlMilliseconds)
        {
            var properties = _channel.CreateBasicProperties();
            properties.Expiration = ttlMilliseconds.ToString();
    
            var body = Encoding.UTF8.GetBytes(message);
            _channel.BasicPublish(exchange, routingKey, properties, body);
        }
    }
    

İleri Seviye Sorular

  1. RabbitMQ'da cluster yapılandırması nasıl yapılır?
  2. Cevap:

    • Node discovery
    • Cluster formation
    • Queue mirroring
    • Network partition handling
    • Cluster monitoring
  3. RabbitMQ'da high availability nasıl sağlanır?

  4. Cevap:

    • Queue mirroring
    • Publisher confirms
    • Consumer acknowledgments
    • Connection recovery
    • Network redundancy
  5. RabbitMQ'da performans optimizasyonu nasıl yapılır?

  6. Cevap:

    • Connection pooling
    • Channel multiplexing
    • Message batching
    • Queue optimization
    • Resource management
  7. RabbitMQ'da monitoring ve alerting nasıl yapılır?

  8. Cevap:

    • Management API
    • Prometheus integration
    • Custom metrics
    • Alert rules
    • Dashboard creation
  9. RabbitMQ'da güvenlik nasıl sağlanır?

  10. Cevap:
    • SSL/TLS
    • Authentication
    • Authorization
    • Network security
    • Access control