Uygulamanızın birden çok örneğinde bölüm yükünü dengeleme

Olay işleme uygulamanızı ölçeklendirmek için uygulamanın birden çok örneğini çalıştırabilir ve yükü kendi aralarında dengeleyebilirsiniz. Eski ve kullanım dışı sürümlerde, EventProcessorHost olayları alırken programınızın birden çok örneği ile denetim noktası olayları arasındaki yükü dengelemenize olanak tanır. Daha yeni sürümlerde (5.0 ve üzeri), EventProcessorClient (.NET ve Java) veya EventHubConsumerClient (Python ve JavaScript) aynı işlemi yapmanızı sağlar. Geliştirme modeli, olaylar kullanılarak daha basit hale getirilmektedir. Bir olay işleyicisi kaydederek ilgilendiğiniz olaylara abone olabilirsiniz. İstemci kitaplığının eski sürümünü kullanıyorsanız şu geçiş kılavuzlarını inceleyin: .NET, Java, Python ve JavaScript.

Bu makalede, bir olay hub'ından olayları okumak için istemci uygulamalarının birden çok örneğini kullanmaya yönelik örnek bir senaryo açıklanmaktadır. Ayrıca, aynı anda birden çok bölümden olay almanıza ve aynı olay hub'ını ve tüketici grubunu kullanan diğer tüketicilerle yük dengelemenizi sağlayan olay işlemcisi istemcisinin özellikleri hakkında ayrıntılı bilgi verir.

Not

Event Hubs için ölçeklendirmenin anahtarı, bölümlenmiş tüketicilerin fikridir. Rakip tüketici deseninin aksine, bölümlenmiş tüketici deseni çekişme performans sorununu ortadan kaldırarak ve uçtan uca paralelliği kolaylaştırarak yüksek ölçek sağlar.

Örnek senaryo

Örnek bir senaryo olarak, 100.000 evi izleyen bir ev güvenlik şirketi düşünün. Her dakika, her eve monte edilen hareket algılayıcısı, kapı/pencere açma sensörü, cam kırılma algılayıcısı vb. gibi çeşitli algılayıcılardan veri alır. Şirket, sakinlerin evlerinin etkinliğini neredeyse gerçek zamanlı olarak izlemeleri için bir web sitesi sağlar.

Her algılayıcı verileri bir olay hub'ına iletir. Olay hub'ı 16 bölümle yapılandırılır. Tüketen uçta, bu olayları okuyabilen, birleştirebilen (filtre, toplama vb.) ve toplamayı kullanıcı dostu bir web sayfasına yansıtılan bir depolama blobunun dökümünü oluşturabilen bir mekanizmaya ihtiyacınız vardır.

Tüketici uygulaması

Dağıtılmış bir ortamda bir tüketici tasarlarken senaryo aşağıdaki gereksinimleri karşılamalıdır:

  1. Ölçek: Her tüketicinin birkaç Event Hubs bölümünden okuma sahipliğini almasıyla birden çok tüketici oluşturun.
  2. Yük dengeleme: Tüketicileri dinamik olarak artırın veya azaltın. Örneğin, her eve yeni bir sensör türü (örneğin, karbon monoksit algılayıcısı) eklendiğinde, olay sayısı artar. Bu durumda, işleç (bir insan) tüketici örneklerinin sayısını artırır. Daha sonra tüketici havuzu, sahip oldukları bölüm sayısını yeniden dengeleyebilir ve yükü yeni eklenen tüketicilerle paylaşabilir.
  3. Hatalarda sorunsuz özgeçmiş: Bir tüketici (tüketici A) başarısız olursa (örneğin, tüketiciyi barındıran sanal makine aniden kilitlenirse), diğer tüketiciler A tüketicisinin sahip olduğu bölümleri alabilir ve devam edebilir. Ayrıca denetim noktası veya uzaklık olarak adlandırılan devam noktası, A tüketicisinin tam olarak başarısız olduğu noktada veya bundan biraz önce olmalıdır.
  4. Olayları kullanma: Önceki üç nokta tüketicinin yönetimiyle ilgilenirken, olayları kullanmak ve onunla yararlı bir şey yapmak için kod olmalıdır. Örneğin, toplu olarak blob depolamaya yükleyin.

Olay işlemcisi veya tüketici istemcisi

Bu gereksinimleri karşılamak için kendi çözümünüzü oluşturmanız gerekmez. Azure Event Hubs SDK'ları bu işlevi sağlar. .NET veya Java SDK'larında bir olay işlemcisi istemcisi ()EventProcessorClient kullanırsınız ve Python ve JavaScript SDK'larında kullanırsınız EventHubConsumerClient. SDK'nın eski sürümünde, bu özellikleri destekleyen olay işlemcisi konağıydı (EventProcessorHost).

Çoğu üretim senaryosunda, olayları okumak ve işlemek için olay işlemci istemcisini kullanmanızı öneririz. İşlemci istemcisi, bir olay hub'ının tüm bölümlerindeki olayları performans ve hataya dayanıklı bir şekilde işlemek için güçlü bir deneyim sağlarken ilerleme durumunu kontrol etmek için bir araç sağlamayı amaçlar. Olay işlemcisi istemcileri, belirli bir olay hub'ı için bir tüketici grubu bağlamında işbirliği içinde çalışabilir. İstemciler, gruplar için örnekler kullanılabilir veya kullanılamaz hale geldikçe işin dağıtımını ve dengelemesini otomatik olarak yönetir.

Bölüm sahipliği

Olay işlemcisi örneği genellikle bir veya daha fazla bölümden olaylara sahip olur ve bunları işler. Bölümlerin sahipliği, bir olay hub'ı ve tüketici grubu bileşimiyle ilişkili tüm etkin olay işlemcisi örnekleri arasında eşit olarak dağıtılır.

Her olay işlemcisine bir denetim noktası deposuna giriş ekleyerek veya güncelleştirerek bölümlerin benzersiz bir tanımlayıcısı ve sahipliğini talep eder. Tüm olay işlemcisi örnekleri, kendi işleme durumunu güncelleştirmek ve diğer etkin örnekler hakkında bilgi edinmek için düzenli aralıklarla bu depoyla iletişim kurar. Bu veriler daha sonra etkin işlemciler arasındaki yükü dengelemek için kullanılır. Yeni örnekler, ölçeği genişletmek için işleme havuzuna katılabilir. Hatalar nedeniyle veya ölçeği küçültmek için örnekler kapandığında, bölüm sahipliği diğer etkin işlemcilere düzgün bir şekilde aktarılır.

Denetim noktası deposundaki bölüm sahipliği kayıtları Event Hubs ad alanını, olay hub'ı adını, tüketici grubunu, olay işlemci tanımlayıcısını (sahip olarak da bilinir), bölüm kimliğini ve son değiştirme zamanını izler.

Event Hubs ad alanı Olay hub'ı adı Tüketici grubu Sahip Bölüm Kimliği Son değiştirme zamanı
mynamespace.servicebus.windows.net myeventhub myconsumergroup 3be3f9d3-9d9e-4c50-9491-85ece8334ff6 0 2020-01-15T01:22:15
mynamespace.servicebus.windows.net myeventhub myconsumergroup f5cc5176-ce96-4bb4-bbaa-a0e3a9054ecf 1 2020-01-15T01:22:17
mynamespace.servicebus.windows.net myeventhub myconsumergroup 72b980e9-2efc-4ca7-ab1b-ffd7bece8472 2 2020-01-15T01:22:10
:
:
mynamespace.servicebus.windows.net myeventhub myconsumergroup 844bd8fb-1f3a-4580-984d-6324f9e208af 15 2020-01-15T01:22:00

Her olay işlemcisi örneği bir bölümün sahipliğini alır ve bilinen son denetim noktasından bölümü işlemeye başlar. Bir işlemci başarısız olursa (VM kapatılır), diğer örnekler son değiştirme zamanına bakarak bunu algılar. Diğer örnekler, daha önce etkin olmayan örneğe ait bölümlerin sahipliğini almaya çalışır. Denetim noktası deposu, bir bölümün sahipliğini talep etmede örneklerden yalnızca birinin başarılı olduğunu garanti eder. Bu nedenle, belirli bir noktada, bir bölümden olayları alan en fazla bir işlemci vardır.

İleti alma

Bir olay işlemcisi oluşturduğunuzda, olayları ve hataları işleyen işlevleri belirtirsiniz. Olayları işleyen işleve yapılan her çağrı, belirli bir bölümden tek bir olay teslim eder. Bu olayı halletmek sizin sorumluluğunuzdadır. Tüketicinin her iletiyi en az bir kez işlediğinden emin olmak istiyorsanız, yeniden deneme mantığıyla kendi kodunuzu yazmanız gerekir. Ancak zehirli mesajlar konusunda dikkatli olun.

İşleri nispeten hızlı yapmanızı öneririz. Yani, mümkün olduğunca az işlem yapın. Depolama alanına yazmanız ve biraz yönlendirme yapmanız gerekiyorsa, iki tüketici grubu kullanmak ve iki olay işlemcisine sahip olmak daha iyidir.

Checkpoint

Denetim noktası oluşturma , bir olay işlemcisinin bir bölümde başarıyla işlenen son olayın konumunu işaretlediği veya işlediği bir işlemdir. Bir denetim noktasını işaretleme işlemi genellikle olayları işleyen ve bir tüketici grubu içinde bölüm başına temelinde gerçekleşen işlev içinde yapılır.

Bir olay işlemcisi bir bölümün bağlantısını keserse, başka bir örnek daha önce o tüketici grubundaki bölümün son işlemcisi tarafından kaydedilmiş olan denetim noktasında bölümü işlemeye devam edebilir. İşlemci bağlandığında, okumaya başlayacağı konumu belirtmek için uzaklığı olay hub'ına geçirir. Bu şekilde, hem olayları aşağı akış uygulamaları tarafından "tamamlandı" olarak işaretlemek hem de bir olay işlemcisi kapandığında dayanıklılık sağlamak için denetim noktası oluşturmayı kullanabilirsiniz. Bu denetim noktası oluşturma işleminden daha düşük bir uzaklık belirterek eski verilere dönmek mümkündür.

Bir olayı işlendi olarak işaretlemek için denetim noktası gerçekleştirildiğinde, denetim noktası deposuna bir giriş eklenir veya olayın uzaklığı ve sıra numarasıyla güncelleştirilir. Denetim noktasını güncelleştirme sıklığına kullanıcılar karar vermelidir. Başarıyla işlenen her olaydan sonra güncelleştirme, temel alınan denetim noktası deposuna yazma işlemini tetiklediğinden performans ve maliyet etkileri olabilir. Ayrıca, her olayı kontrol etmek, Service Bus kuyruğunun olay hub'ından daha iyi bir seçenek olabileceği kuyruğa alınmış bir mesajlaşma düzenini gösterir. Event Hubs'ın ardındaki fikir, büyük ölçekte "en az bir kez" teslim almanızdır. Aşağı akış sistemlerinizi bir kez etkili hale getirerek, aynı olayların birden çok kez alınmasına neden olan hatalardan veya yeniden başlatmalardan kurtarmak kolaydır.

Azure Blob Depolama denetim noktası deposu olarak kullanırken şu önerileri izleyin:

  • Her tüketici grubu için ayrı bir kapsayıcı kullanın. Aynı depolama hesabını kullanabilirsiniz, ancak her grup için bir kapsayıcı kullanabilirsiniz.
  • Kapsayıcıyı başka hiçbir şey için kullanmayın ve depolama hesabını başka hiçbir şey için kullanmayın.
  • Depolama hesabın dağıtılan uygulamanın bulunduğu bölgede olması gerekir. Uygulama şirket içindeyse, mümkün olan en yakın bölgeyi seçmeyi deneyin.

Azure portalındaki Depolama hesabı sayfasında, Blob hizmeti bölümünde aşağıdaki ayarların devre dışı bırakıldığından emin olun.

  • Hiyerarşik ad alanı
  • Blob geçici silme
  • Sürüm oluşturma

İş parçacığı güvenliği ve işlemci örnekleri

Varsayılan olarak, olayları işleyen işlev belirli bir bölüm için sırayla çağrılır. Olay pompası diğer iş parçacıklarında arka planda çalışmaya devam ettiğinden, arka planda aynı bölüm kuyruğundan bu işleve yapılan sonraki olaylar ve çağrılar. Farklı bölümlerden olaylar eşzamanlı olarak işlenebilir ve bölümler arasında erişilen tüm paylaşılan durumların eşitlenmesi gerekir.

Sonraki adımlar

Aşağıdaki hızlı başlangıçlara bakın: