İçeriğe geç

Mikro hizmet Mimarisini kullanarak bir NewsFeed hizmeti oluşturma

Bir örnek sağlamak için, diyelim ki Facebook’da çalışıyoruz ve bu yeni hizmet, kullanıcıların düzenleyebileceği çeşitli Gönderi, Yorum, Beğeni alanlarından oluşan çeşitli şeyleri ve özet sayılarını sağlıyor. Bu News Feed Hizmeti daha sonra diğer hizmetler tarafından kullanılabilir, örneğin ön uç masaüstü ve mobil hizmetler gönderileri hızlı bir şekilde görüntüleyebilir, HTTP API JSON olarak döndürmek için gönderileri alabilir(Eğer RDBMS veritabanı kullanıyorsanız kendi akışınızı oluşturmak için sıralamak yetersiz kalacaktır).

Çekme Tabanlı

Post gönderme adımları

  • Kullanıcı yeni bir gönderi kaydı eklemeyi istiyor.
  • Web sunucusu post hizmetinden yeni bir kayıt eklemesini istiyor.
createPost(request, post)
	db.Create(request.User, post)
	return success

NewsFeed için adımlar

  • İstemci, web sunucusundan haber akışı ister.
  • Web sunucusu, arkadaşlık hizmetinden tüm arkadaşları almasını ister.
  • Web sunucusu ,post hizmetinden arkadaşlarının gönderilerini almasını ister.
  • Web sunucusu, post hizmetinden gelen her N post’u birleştirir ve bunları bir araya getirir.
  • Web sunucusu, birleştirilmiş sonuçları istemciye döndürür.
getNewsFeed(request)
	followings = db.getFollowings(user=request.user)
	newsFeed = empty
	for follow in followings:
		posts = db.getPosts(follow.toUser, 100)
		newsFeed.merge(posts)
	sort(newsFeeds)
	return newsFeed

Dezavantajları

  • Yüksek gecikme, N kadar DB okumasının bitmesini beklemeniz gerekiyor.

İtme tabanlı

  • Herkesin newsfeed bilgileri aynı tabloda saklanır.
  • NewsFeed Tablosundan x kişisini seçin, burada owner_id = XX orderBy createdAt desc limit 20 gibi.

Post gönderme adımları

  • İstemci, web sunucusundan bir post göndermesini ister.
  • Web sunucusu, post hizmetinden post’u post tablosuna eklemesini ister.
  • Web sunucusu, post hizmetinden zaman uyumsuz(async) bir görev başlatmasını ister.
  • Eşzamansız görev, arkadaşlık tablosundan arkadaşları alır.
  • Eşzamansız görev, arkadaşların newsfeed tablosuna yeni post gönderir.
createPost(request, postInfo)
	post = db.Create(request.user, postInfo)
	//RabbitMQ/Kafka
	AsyncService.fanoutPost(request.user, post)
	return success

AsyncService::fanoutPost(user, post)
	followers = db.getFollowers(user)
	for follower in followers:
		db.insertNewsFeed(post, follower)

Dezavantajları

  • Arkadaş sayısı gerçekten büyük olduğunda, eşzamansız görevlerin sayısı yüksek gecikmeye sahip olacaktır.

Ölçeklendirme

Çekme tabanlı ölçeklendirme

  • Veritabanını ziyaret etmeden önce daha çok önbellek ekleyin.

İtme tabanlı ölçeklendirme

  • İtme tabanlı yaklaşım, optimize edilmiş çekme yaklaşımından çok daha iyi bir şekilde haber akışını diskte depolar.
  • Lady Gaga’nın Twitter’da 72,5 milyon takipçisi var. Justin Bieber’ın Instagram’da 87,6 milyonu var. Eşzamansız görevin tamamlanması saatler sürebilir. 🙂

 2,015 Görüntüleme

Kategori:MicroservicesSoftware Architecture

Tek Yorum

Bir cevap yazın

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