İçeriğe geç

Mikro hizmet Mimarisini kullanarak bir Sohbet hizmeti oluşturma

Son trendlerde, bir mobil uygulama veya web sitesi oluşturmaya gelince, gerçek zamanlı sohbeti desteklemek için her zaman hizmete ihtiyacımız var. Sohbet özelliği, müşteri hizmetleri, sohbet hizmeti, topluluk sohbeti veya gerçek zamanlı güncellemeleri gönderme vb. için olabilir.

Bir sohbet hizmetine sahip olduğumuzda, genellikle karmaşık bir uygulama, oluşturma ve test etme konusunda yoğun çabalar ile sonuçlanır ve bu nedenle, hizmeti kullanan uygulamaya harcanmak yerine sohbet hizmetine önemli ölçüde çaba sarf ederiz. Veya, özelleştirmede her zaman zor anlar yaşatan 3. taraf uygulamaları kullanırız.

Mikro hizmet Mimarisini kullanarak yeni bir Sohbet Hizmeti oluşturmamıza ne sebep oldu?

  • Uygulamalara kolayca entegre edilebilecek bir hizmet oluşturmak istedik.
  • Tek konuşlandırılmış hizmetten farklı uygulamalar desteklenmelidir.
  • Hizmet, verileri gerçek zamanlı olarak veri bütünlüğü ile sunarak büyük miktarda trafiği desteklemelidir.
  • Hizmet hafif olmalı, uygun maliyetli olmalı ve trafiğe bağlı olarak kolayca büyütülüp küçültülebilmelidir.
  • Servis, WhatsApp, Skype, Facebook mesajı vb. Gibi tüm modern sohbet hizmeti sağlayıcılarının neredeyse tüm özelliklerini desteklemelidir.
  • Hizmet, gerçek zamanlı çok kişileri veya grupları desteklemelidir.
  • Hizmet, farklı uygulama için farklı özellikleri desteklemek üzere kolayca özelleştirilebilir.

Teknoloji Yığını

  • .Net Core : Microsoft tarafından open-source olarak geliştirilmesi devam eden, cross platform olarak çalışan, esnek ve modern geliştirme platformu.
  • NodeJs : Dağıtık aygıtlarda çalışan veri yoğun gerçek zamanlı uygulamalar için mükemmel ve hafif olmasını sağlayan olay güdümlü, engellemeyen bir G/Ç modeli.
  • SignalR : Gerçek zamanlı, çift yönlü ve olay tabanlı iletişim sağlar. Güvenilirlik ve hıza eşit şekilde odaklanarak her platformda, tarayıcıda veya cihazda çalışır.
  • Redis : Veritabanı, önbellek ve ileti aracısı olarak kullanılan bellek içi veri yapısı deposu.
  • RabbitMQ : Tutarlı, yüksek düzeyde kullanılabilir mesajlaşma senaryoları (hem eşzamanlı hem de eşzamansız) için tasarlanmış açık kaynaklı bir genel amaçlı mesajlaşma protokolü.
  • Docker : Geliştiricilerin ve sistem yöneticilerinin, ister dizüstü bilgisayarlarda, ister veri merkezi VM’lerinde veya bulutta teknoloji veya altyapı kilitleme korkusu olmadan dağıtılmış uygulamalar oluşturması, göndermesi, yönetmesi, güvenliğini ve çalıştırmasını sağlayan açık bir platform.
  • ElasticSearch : Tamamen yönetilen Redis ve Memcached sunar . Popüler açık kaynaklı uyumlu bellek içi veri depolarını sorunsuz bir şekilde dağıtır ve ölçeklendirir. Yoğun veri ve düşük gecikmeli bellek içi veri depolarından veri alarak veri yoğun uygulamalar oluşturur veya mevcut uygulamalarınızın performansını artırır.
  • Azure Load Balancer : İstemciler için tek iletişim noktası görevi görür. Yük dengeleyici, gelen uygulama trafiğini bulut sunucuları gibi birden çok hedefte birden çok kullanılabilirlik bölgesinde dağıtır. Bu, uygulamanızın kullanılabilirliğini artırır.
  • Azure İlişkisel Veritabanı Hizmeti (SQL Server RDBMS) : Bulutta ilişkisel bir veritabanı kurmayı, çalıştırmayı ve ölçeklendirmeyi kolaylaştırır. Donanım sağlama, veritabanı kurulumu, yama ve yedekleme gibi zaman alıcı yönetim görevlerini otomatikleştirirken düşük maliyetli ve yeniden boyutlandırılabilir kapasite sağlar.

Mimari

WhatsApp ve Facebook gibi Uygulamaların mimarisini araştırıp inceledikten sonra, aşağıdaki mimariyi bulduk.

Mimarideki Bileşenler

  • SingalR : SignalR istemcilerini destekleyen herhangi bir istemci durumundadır.
  • AzureLoadBalancer : Tüm istemcilerin oturuma bağlandığı tek bir noktadır. ALB, yükü EC2 örneklerine dağıtır ve herhangi bir EC2 örneği yanıt vermezse yükü yeniden yönlendirir.
  • Azure İlişkisel Veritabanı Hizmeti (SQL Server RDBMS) : Sohbete ilişkin verileri sürdürmek için herhangi bir ilişkisel veritabanı olarak kullanılır.
  • ElasticSearch : Bellek içi önbellek ve Message Broker hizmeti için RabbitMQ olarak kullanılır. Message Broker hizmeti, iki veya daha fazla Sohbet hizmeti arasında veri aktarmak için kullanılır.

Mesaj Teslimi

Yukarıdaki akıştan, her bileşeni verimli bir şekilde kullanarak gerçek zamanlı mesajlaşma elde etmeyi başardık. Örneğin, her mesajın Redis’te yayınlanması gerekmez. Mesajın alıcısı aynı sohbet sunucusuna bağlıysa, mesajın tüm sunuculara gönderilmesine gerek yoktur. Mesaj doğrudan ilgili kullanıcılara gönderilebilir.

ElasticSearch Veri Deposu

ElasticSearch’i kullanarak veritabanı sorgularından kaçınabildik. ElasticSearch, yüksek verim ve düşük gecikmeli bellek içi veri depoları sağlar. ElasticSearch’de iki harita Kullanıcı ve Grup tutuyoruz.

Bir istemci sohbet sunucusuna bağlandığında, kullanıcı adı, genel ad, sunucu adı ve durum girişi ile Kullanıcı haritası güncellenir. Bu haritada, kullanıcının sık sık getirilmesi gereken minimum bilgilerini saklıyoruz.

Grup Haritası’nda tüm grubu üyeleriyle birlikte saklıyoruz. Bir gruba mesaj gönderirken, mesajların alıcısını da alabiliriz.

Veritabanı Deposu

Verileri veritabanında eşzamansız bir şekilde depolayarak, mesaj tesliminde herhangi bir gecikmeyi önlüyoruz.

  • Arkadaş Görüşmesi : Her yeni eş için, bağlanıldığında, depolama alanına yeni bir giriş yapılır. İki kullanıcı arasında gönderilen tüm mesajlar aynı konuşma kimliğine sahip olacaktır.
  • Mesajlar : Kalıcı olması gereken mesajlar burada saklanır.  Arkadaş görüşmesi ve grup görüşmesi için yaygındır.
  • Beklemede : Tüm ileti bağlantıları / kimlikleri, konuşma türüne bakılmaksızın burada saklanır. Bir kullanıcı çevrimiçi olduğunda, bu depodaki tüm mesajlar kullanıcıya teslim edilir ve ardından silinir.
  • Grup Görüşmesi : Grupla ilgili bilgileri depolar ve mesajlar ve grup üyeleriyle ilişkisi vardır.
  • Grup Üyeleri : Grubun üyelerini ve gruptaki rollerini saklar.

Mimarinin Artıları

  • Hafiftir, NodeJS ve SignalR kullanarak gerçek zamanlı mesaj teslimini destekler.
  • Mikro hizmet olarak diğer uygulamalarla kolay entegrasyon.
  • Yüke bağlı olarak hizmeti kolayca büyütebilir veya küçültebiliriz.
  • Yüksek verim sağlamak için kaynakların verimli kullanımı. Örneğin, Redis’e gönderilen her mesajı yayınlamıyoruz. Ayrıca, herhangi bir gecikmeyi önlemek için verileri veritabanında eşzamansız bir şekilde saklıyoruz.
  • Özelleştirme kolaydır, ihtiyaca bağlı olarak özellikleri kolayca ekleyebiliriz veya çıkarabiliriz.
  • Dağıtım kolaydır, dağıtım süreçleri hakkında derinlemesine bilgiye ihtiyacımız yoktur.
  • Bire bir sohbet, grup sohbeti, çevrimiçi oyun vb. İçin kullanıma hazır.
  • Ağ kesildiğinde yuvaların otomatik yeniden bağlanması.
  • Varsayılan olarak, medya paylaşımı etkindir.

Mimarinin Eksileri

  • Soketlerle uğraşan zayıf ağ, paket teslimatını sağlamak için her zaman zor anlar yaşatır. Bu nedenle, mesaj düşmesini önlemek için zayıf ağı tespit etmek için istemci tarafında bazı ekstra kodlar yazmalıyız.
  • Mesaj depolama alanı zamanla çok büyüyebilir, bundan kaçınmak için mesajları arşivlememiz ve Azure Storage gibi farklı yerlerde depolamamız gerekir.

Sonuç

Bu çözüm sayesinde basit, hafif, ölçeklenebilir ve özelleştirilebilir bir sohbet mikro hizmet uygulaması oluşturabildik. Mimari, bire bir sohbet, grup sohbeti, medya aktarımı, çevrimiçi oyun vb. Gibi özellikleri destekleyebiliyordu. Ayrıca, mimari, farklı uygulamaların, hesaplama ve kaynaklar açısından düşük maliyetle tek bir konuşlandırılmış hizmet üzerinde çalışmasını sağlar.  Maliyet, yüke ve kullanıma bağlı olarak daha da azaltılabilir

 2,257 Görüntüleme

Kategori:MicroservicesSoftware Architecture

Tek Yorum

  1. Emre Gören Emre Gören

    Microservice mimarisin de chat uygulaması yazarken fikir sahibi oldum. bazı anlayamadığım noktalar oldu, zamanla çözeceğime inanıyorum. Elinize sağlık 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir