Mimari (IT)Sistem Mimarisi

Mikroservisler arasında etkileşimi nasıl doğru bir şekilde organize edebiliriz, böylece bağlantıyı minimize ederiz (loose coupling) ve maksimum ölçeklenebilirlik sağlarız?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Mikroservisler arasındaki bağlantının minimuma indirilmesi (loose coupling), modern mimarinin temel prensiplerinden biridir. Bu, asenkron etkileşim yoluyla (mesaj kuyruğu veya olay kaynağı aracılığıyla), gereksiz yere doğrudan senkron HTTP çağrılarından kaçınılarak ve açık API sözleşmelerinin belirlenmesiyle sağlanır.

Popüler bir yöntem, mikroservislerin durumları hakkında olaylar yayınladığı ve abonelerin bunlara yanıt verdiği mesaj aracını (RabbitMQ, Kafka, NATS) kullanmaktır.

Node.js’de Kafka üzerinde bir olayın yayınlanması ve işlenmesi örneği:

// producer.js const { Kafka } = require('kafkajs') const kafka = new Kafka({ clientId: 'order-service', brokers: ['kafka01:9092'] }) const producer = kafka.producer() await producer.connect() await producer.send({ topic: 'orders', messages: [ { value: JSON.stringify({orderId: 123}) } ] }) await producer.disconnect() // consumer.js const consumer = kafka.consumer({ groupId: 'payment-group' }) await consumer.connect() await consumer.subscribe({ topic: 'orders', fromBeginning: true }) await consumer.run({ eachMessage: async ({ topic, partition, message }) => { const order = JSON.parse(message.value.toString()) // siparişi işleme }})

Ana özellikler:

  • Mikroservisler, formel bir API veya aracının (kuyruk, bus) üzerinden iletişim kurar.
  • Her servisin kendi veritabanı vardır (Database per Service), böylece kilitlenmeler ve rekabet önlenir.
  • Mevcut sistemlerde değişiklik yapmadan yeni servisler anında eklenebilir.

Kandırmaca Soruları.

Soru: Bir büyük proje için birden fazla mikroservis için ortak bir veritabanı kullanmak mümkün mü?

Hayır, bu bağımsızlık ilkesini ihlal eder, tight coupling'a yol açar, ölçeklenebilirliği ve sürdürülebilirliği kötüleştirir. Ayrı veritabanları veya şemalar kullanılmalıdır.

Soru: Servisler arasında senkron HTTP etkileşimi, sistemin ölçeklendirilmesi için kabul edilebilir bir uygulama mıdır?

Senkron HTTP istekleri iyi ölçeklenmez ve bottleneck haline gelebilir. Asenkron mekanizmalar önerilir ve yalnızca mutlak gerekirse senkron çağrılara başvurulmalıdır.

Soru: Bir mikroservisi, sistemin mimarisini değiştirmeden yalnızca örnek sayısı ile ölçeklendirmek mümkün mü?

Hayır, yalnızca örnek sayısının artırılması, bağlılık veya mimarideki dar boğaz sorunlarını çözmez. Bottleneck'lerin analizine, kuyruklar, önbellekleme ve hizmetlerin sorumluluklarının ayrılmasına ihtiyaç vardır.