|
|
Yayınlandı 29.12.2022 14:24:52
|
|
|
|

Son bir hafta boyunca, sanal aktörler kavramını araştırarak yazılım geliştirmeye adım attım. Sonunda iki farklı framework'e baktım: Dapr ve Orleans.
İkisi de çok özlü projeler ve çok ilginç kullanım alanları var. Her ikisi de "sanal" aktörler fikrini kullanır. Sanal bir aktör, aşağıdaki durum ve mantık birimidir:
- Kimlik ile benzersiz şekilde tanımlanabilir
- Tek dişlidir
- Bellek içinde veya kalıcı olabilir - yaşam döngüsü framework tarafından yönetilir
Sanal aktörler fikrini gerçekten seviyorum ve karmaşık görev iş akışlarını yönetmek için ölçeklenebilir ve güvenilir araçlar oluşturma keşfetmemde onları çok faydalı buluyorum. Her görev tek iş parçacıklı sanal katılımcıysa, yarış koşulları problemi ortadan kalkar.
Orleans ve Dapr ikisi de Microsoft projeleri olduğu için, Microsoft kafeteryasında Western Story tarzı bir mücadele hayal ediyorum.
Orleans
Orleans ile başladım çünkü YouTube'da bununla ilgili bazı videolar izledikten sonra bir süredir radarımdaydı. Başlangıçta çok kötü başladı çünkü tüm NuGet paketlerinin 4.x versiyonunu kullanacağımı sanmıştım. Ancak, belgelerinin hiçbiri 4.x paketiyle çalışmaz. Sonunda 3.6.2 sürümünü kullandım.
Tahıllar / Durum / Zamanlayıcılar
Kendi durumunu takip eden ve eylemleri gerçekleştiren bir tane oluşturmak çok basittir. Hatta gren kalıcılığı için dokümantasyonu takip edip kendi CosmosDB (SQL API) uygulamamı oluşturabildim.
Hatırlatmalar
Hatırlatmaları da kolayca kurabiliyor. Gerçek dünya sürekliliğini onlar için yapılandırmaya çalışana kadar. Araştırmamın bu noktasında, her şeyi düzenli tutmaya ve ComsosDB'de saklamaya çalışıyorum. Ne yazık ki, Orleans'ın hatırlatma ısrarı paketini hiç çalıştıramıyorum. Sonunda AzureStorage paketine geçmek zorunda kaldım. Şimdi verilerim SQL API hesabında, yarısı ise tablo API hesabında.
Akarsu
Orada iyi gitmedim. Orleans'ta akışlar bir GUID ve isteğe bağlı bir isim alanı ile tanımlanır. Akışların bir GUID ile tanımlanması gerektiğinin iyi bir nedeni olduğuna eminim, ama vay canına, bu pratik değil.
Yayınlardan çok sinirliyim çünkü onları kolayca oluşturabiliyordum, ama projeyimi durdurup yeniden başlattığımda ve yeni bir etkinlik tetiklediğimde her şey çöküyor.
Bunu çok değerli bir bilgi izledi; Orleans kodunu tersine mühendislik yapmak için 8 saat sürdüm:
Bir tahıl akış abonesi olduğunda, tahın abonelik adresinde OnActivateAsync yönteminde ResumeAsync'i çağırması gerekir, aksi takdirde tanınmayan bir hata ile çökersiniz.
Aynı aboneliğin tekrarlanması sorunu da yaşadım, bu yüzden tüm Grain aboneliklerini silmek için kodu kullandım ve sonra tekrar oluşturdum:
Diğer Orleans Şaşkınlıkları / İpuçları
Streams, Azure Event Hubs ile (AddEventHubStream vasite) iyi çalışıyor.
CosmosDB SQL API'nin Grain adında / veya diğer özel karakterleri kullanmayın!
Orleans sonucu
Orleans'ı seviyorum ve potansiyeli olduğunu düşünüyorum. Ancak öğrenme eğrisi çok dik. Uzun süredir yayınlama konusundaki mücadelem nedeniyle, kümelerin/dağıtımların nasıl çalıştığını incelemeye vaktim yok.
Dapr
Dapr'ı Orleans'a alternatifler arayarak buldum. Bunun aynı zamanda Microsoft sponsorluğunda bir proje olması biraz garip. Belki de burada en güçlülerin hayatta kalması yaklaşımını benimsemek içindirler. Eğer evetse, Dapr'ın hayatta kalacağını düşünüyorum.
İlk olarak, Dapr'ın REST/gRPC tabanlı tasarımı, aktörlerin herhangi bir programlama dili kullanılarak uygulanmasına olanak tanır. Ayrıca her şeyi (katılımcılar, durumlar, zamanlayıcılar, hatırlatıcılar, etkinlikler) tek bir Redis örneğinde çalıştırmak da bana kolaydı. Bunun üstüne, Dapr'ı kullanmaya başlamam sadece üçte birini aldı. Bu kadar hızlı bir başlangıç süresi, Dapr'ın mükemmel dokümantasyonu sayesinde ortaya çıkıyor.
Oyuncular / Zamanlayıcılar / Hatırlatıcılar
Az önce Dapr'ın dokümantasyonunun harika olduğunu mu söyledim? Tabii ki, bu her yerde var, JavaScript örnekleri hariç. Zamanımın çoğunu Dapr üzerinde geçiriyorum, oyunculara metod çağırmayı çözmeye çalışıyorum. Dapr Javascript örneğinin kodu şu şekildedir:
Bu açıkça modası geçmiş. Bu üç satırı Dapr'ın test/örnek kodu keşfi boyunca yönlendirmek için çok zaman harcamam gerekti
Durum belirleme/ayarlama kod örneklerinde benzer sorunlar var, bu yüzden onlar için bir GitHub sorunu oluşturdum.
Bu küçük sorunlar dışında, oyuncuları ayarlamak çocuk oyuncağı.
Castım için zamanlayıcılar ve hatırlatıcılar ayarlamak da çok kolay.
Devlet
Dapr'ı Postgres ile sürek kapatacak şekilde çok kolay ayarlayabildim.
Fark ettiğim bir şey, hatırlatıcıların nasıl saklandığında ölçeklenebilirlik sorunları olabileceği. Dapr, belirli bir katılımcı türü için tüm uyarıları tek bir JSON dizisinde saklar. Birinin bir sürü hatırlatıcısı varsa ne olur?
Diğer Dapr Taktikleri / İpuçları
JavaScript SDK koduna göz atırken fark ettiğim bir şey, kod tabanında çok fazla yorum olmaması. Bu da bir şeyi anlamayı neredeyse imkansız kılıyor. Örneğin, durum yöneticisinin addOrUpdateState metodunda updateValueFactory adlı üçüncü bir parametre vardır. Kodda yorum yoksa, geri dönüşün ne için olduğunu anlamak neredeyse imkansızdır.
Ayrıca "dapr init" komutunun benim için bir redis konteyneri kurup çalıştırmaya çalışmasını ne kadar sevdiğimden emin değilim. Ya zaten bir Redis kabım varsa? Ya onun yerine postgres kullanmak istersem? Dapr init özelliğini nasıl değiştireceğimi açıklayan bir dokümant bulamıyorum.
Pubsub kullanmakta zorlanan herkese bir not. Hem yayıncınızı hem de abonenizi çalıştırmak için "dapr run" kullanmalısınız:
Aktörler ve pubsub için, hizmetinizin hangi portta çalıştığını dapr'a bildirmek için --app-port parametresini kullanmanın önemli olduğunu unutmayın. pubsub etkinlikleri ve oyuncu çağrıları Dapr sidecar'dan http çağrılarıyla servisinize gönderilir, bu yüzden nereye gönderileceğini bilmesi gerekir:
Küçük bir Dapr kendi kendine barındırılan "kümesini" pubsub abone örneğimi ev ağımda iki farklı makinede başlatarak test ettim. Sadece işe yaradı!
Dapr sonucu
Dağıtık uygulamalar veya sanal aktörler hakkında daha fazla fikir edinmek isterseniz, Dapr ile başlamanızı öneririm. Orleans orijinal öncüydü, Dapr ise işleri bir üst seviyeye taşıyan bir yeniden başlatma oldu.
Orijinal bağlantı:Bağlantı girişi görünür.
|
Önceki:Okumayı görüntüleyin. PDB dosya içeriği bilgileriÖnümüzdeki:.NET/C#, BitMap tabanlı Bloom algoritmasını uygulamak için Redis kullanır
|