Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu bölümde Stream uygulamasına Orleans üst düzey bir genel bakış sağlanır. Uygulama düzeyinde görünür olmayan kavramları ve ayrıntıları açıklar. Yalnızca akışları kullanmayı planlıyorsanız, bu bölümü okumanız gerekmez.
Terminoloji:
Akış olaylarını alabilen, olayları çekerek elde etmemize veya olayları tüketmemize olanak tanıyan gönderim tabanlı bir mekanizma sunan her türlü dayanıklı depolama teknolojisini "kuyruk" olarak adlandırırız. Bu teknolojiler genellikle ölçeklenebilirlik sağlamak için parçalı/bölümlenmiş kuyruklar sağlar. Örneğin, Azure Kuyrukları birden çok kuyruk oluşturmanıza olanak sağlar ve Event Hubs'ın birden çok hub'ı vardır.
Kalıcı akışlar
Tüm Orleans kalıcı akış sağlayıcıları ortak bir uygulamayı PersistentStreamProviderpaylaşır. Teknolojiye özgü bir IQueueAdapterFactory ile bu genel akış sağlayıcılarının yapılandırılması gerekiyor.
Örneğin, test amacıyla, bir kuyruktan verileri okumak yerine test verilerini oluşturan kuyruk bağdaştırıcılarımız vardır. Aşağıdaki kod, özel (oluşturucu) kuyruk bağdaştırıcımızı kullanmak için kalıcı bir akış sağlayıcısını nasıl yapılandıracağımızı gösterir. Bunu, kalıcı akış sağlayıcısını bağdaştırıcıyı oluşturmak için kullanılan bir fabrika işleviyle yapılandırarak yapar.
hostBuilder.AddPersistentStreams(
StreamProviderName, GeneratorAdapterFactory.Create);
Bir akış üreticisi yeni bir akış öğesi oluşturup stream.OnNext() çağırdığında, Orleans akış çalışma zamanı, bu akış sağlayıcısının IQueueAdapter üzerinde uygun yöntemi devreye sokar ve yöntem, öğeyi doğrudan uygun kuyruğa ekler.
Aracıları çekme
Kalıcı Akış Sağlayıcısı'nın merkezinde çekme aracıları bulunur. Çekici ajanlar, olayları bir dizi dayanıklı kuyruktan çekip, uygulama kodunun bunları tükettiği birimler halinde teslim eder. Çekme aracılarını dağıtılmış bir "mikro hizmet" (bölümlenmiş, yüksek oranda kullanılabilir ve elastik dağıtılmış bileşen) olarak düşünebilirsiniz. Çekme ajanları, uygulama bileşenlerini barındıran aynı siloların içinde çalışır ve Streaming Runtime tarafından Orleans tamamen yönetilir.
StreamQueueMapper ve StreamQueueBalancer
Çekme aracıları IStreamQueueMapper ve IStreamQueueBalancer ile parametreleştirilir.
IStreamQueueMapper tüm kuyrukların listesini sağlar ve aynı zamanda akışları kuyruklara eşlemekten sorumludur. Bu şekilde, Kalıcı Akış Sağlayıcısı'nın üretici tarafı iletinin hangi kuyruğa eklenmesi gerektiğini bilir.
IStreamQueueBalancer kuyrukların silolar ve temsilciler arasında Orleans dengelenme şeklini ifade eder. Amaç, performans sorunlarını önlemek ve esnekliği desteklemek için aracılara dengeli bir şekilde kuyruk atamaktır. Kümeye Orleans yeni bir silo eklendiğinde kuyruklar eski ve yeni silolar arasında otomatik olarak yeniden dengelenir. , StreamQueueBalancer bu işlemin özelleştirilmesine izin verir.
Orleans farklı dengeleme senaryolarını (büyük ve az sayıda kuyruk) ve farklı ortamları (Azure, şirket içi, statik) desteklemek için birkaç yerleşik StreamQueueBalancer'a sahiptir.
Yukarıdaki test oluşturucu örneğini kullanarak aşağıdaki kod, kuyruk eşleyiciyi ve kuyruk dengeleyiciyi nasıl yapılandırabileceğini gösterir.
hostBuilder
.AddPersistentStreams(StreamProviderName, GeneratorAdapterFactory.Create,
providerConfigurator =>
providerConfigurator.Configure<HashRingStreamQueueMapperOptions>(
ob => ob.Configure(options => options.TotalQueueCount = 8))
.UseDynamicClusterConfigDeploymentBalancer());
Yukarıdaki kod, GeneratorAdapterFactory öğesini sekiz kuyruklu bir kuyruk eşleyicisi kullanacak şekilde yapılandırır ve DynamicClusterConfigDeploymentBalancer kullanarak kuyrukları kümeye göre dengeler.
Çekme protokolü
Her silo bir dizi çekme istemcisi çalıştırır, her istemci bir kuyruktan veri çeker. Çekme aracıları, SystemTarget adlı bir iç çalışma zamanı bileşeni tarafından uygulanır. System Target'ler temelde çalışma zamanı birimlerdir, tek iş parçacıklı eşzamanlılık kurallarına göre çalışır, düzenli birim mesajlaşması kullanabilir ve birimler kadar hafiftir. Taneciklerin aksine, SystemTarget'ler sanal değildir: bunlar açıkça oluşturulur (çalışma zamanı tarafından) ve konum saydam değildir. Çekme aracısı SystemTargets olarak uygulandığında, Orleans Streaming Runtime yerleşik Orleans özelliklere güvenebilir ve yeni bir çekme aracısı oluşturmak, yeni bir tahıl oluşturmak kadar ucuz olduğu için çok sayıda kuyruğa ölçeklenebilir.
Çok sayıda çekme ajanı, IQueueAdapterReceiver.GetQueueMessagesAsync metodunu çağırarak kuyruktan çeken periyodik bir zamanlayıcı çalıştırır. Döndürülen iletiler, her bir aracı için iç veri yapısına IQueueCache olarak eklenir. Her ileti, hedef akışını bulmak için incelenir. Ajan, veri akışına abone olan veri akışı tüketicilerinin listesini bulmak için Pub-Sub kullanır. Tüketici listesi alındıktan sonra, temsilci bunu kendi pub-sub önbelleğinde yerel olarak depolar, bu nedenle her iletide Pub-Sub'a danışması gerekmiyor. Temsilci, bu akışa abone olan yeni tüketicilerin bildirimlerini almak için yayın-abonelik sistemine de abone olur. Aracı ile pub-sub arasındaki bu el sıkışması güçlü akış aboneliği semantiğini garanti eder: Tüketici akışa abone olduğunda, abone olduktan sonra oluşturulan tüm olayları görür. Buna ek olarak, StreamSequenceToken kullanmak geçmişe yönelik abonelik imkanı tanır.
Kuyruk önbelleği
IQueueCache , yeni etkinliklerin kuyruktan ayrıştırılmasını ve tüketicilere teslim edilmesini sağlayan her bir aracıya özgü bir iç veri yapısıdır. Ayrıca teslimi farklı kanallara ve farklı tüketicilere ayrıştırma imkanı tanır.
Bir akışın 3 veri tüketicisi olduğu ve bunlardan birinin yavaş olduğu bir durumu hayal edin. Dikkatli olunmazsa, bu yavaş tüketici aracının ilerleme durumunu etkileyebilir, bu akışın diğer tüketicilerinin tüketimini yavaşlatabilir ve hatta diğer akışlar için olayların sorgulanması ve teslimini yavaşlatabilir. Bunu önlemek ve aracıda en yüksek paralelliğe izin vermek için kullanırız IQueueCache.
IQueueCache akış olaylarını arabelleğe alır ve aracının olayları her tüketiciye kendi hızıyla teslim edebilmesi için bir yol sağlar. Tüketici başına teslim, tüketici başına ilerleme durumunu izleyen adlı IQueueCacheCursoriç bileşen tarafından uygulanır. Her tüketici olayları kendi hızında alır: Hızlı tüketiciler olayları kuyruktan çıkarılmasının hemen ardından alırken, yavaş tüketiciler bu olayları daha geç alır. İleti tüm tüketicilere teslim edildikten sonra önbellekten silinebilir.
Geri basınç
Akış Çalışma Zamanı Ortamı'nda geri basınç iki yerde ortaya çıkar: kuyruktaki akış olaylarını aracıya getirme ve olayları aracısından akış tüketicilerine ulaştırma.
Yerleşik Orleans mesaj teslim mekanizması tarafından ikincisi sağlanır. Her bir akış olayı, aracıdan tüketicilere standart Orleans grup mesajlaşması aracılığıyla birer birer teslim edilir. Yani aracılar her bir akış tüketicisine bir olay (veya sınırlı boyutlu bir olay grubu) gönderirler ve bu çağrıyı beklerler. Önceki olayın Görevi çözümlenene veya bozulana kadar sonraki olay teslim edilmeye başlamaz. Bu şekilde doğal olarak tüketici başına teslim oranını tek seferde bir iletiyle sınırlandırıyoruz.
Yayın Akışı, akış olaylarını kuyruktan aracıya getirirken özel bir yeni geri basınç mekanizması sağlar. Aracı, kuyruktan olayları ayrıştırıp tüketicilere teslim ettiğinden, tek bir yavaş tüketici o kadar geride kalabilir ki IQueueCache dolacak. Süresiz büyümeyi önlemek IQueueCache için boyutunu sınırlandırıyoruz (boyut sınırı yapılandırılabilir). Ancak, aracı teslim edilmemiş etkinlikleri asla atmaz.
Bunun yerine, önbellek dolmaya başladığında aracılar kuyruktan olayları sıralama hızını yavaşlatır. Bu şekilde, kuyruktan tükettiğimiz hızı ayarlayarak ("geri baskı") yavaş teslimat dönemlerini "atlayabilir" ve daha sonra hızlı tüketim oranlarına geri dönebiliriz. "Yavaş teslim" vadilerini algılamak IQueueCache için, olayların tek tek akış tüketicilerine tesliminin ilerleme durumunu izleyen önbellek demetlerinin iç veri yapısını kullanır. Bu, çok hızlı yanıt veren ve kendi kendini ayarlayan bir sisteme neden olur.