Yapay zekadan makale özeti
- Kısa
- Ayrıntılı
- Bu eğitim videosunda Hepsiburada'da çalışan ve profesyonel iş hayatında 20 yıllık deneyime sahip yazılım geliştiricisi Alper, .NET'te channel'ların nasıl çalıştığını ve kullanıldığını anlatmaktadır.
- Video, channel'ların tanımı ve kullanım alanları ile başlayıp, benchmark testleri, publisher-consumer ve multi-publisher-single-subscriber kanal varyantlarının performans analizi ile devam etmektedir. Daha sonra split and merge kavramları, Open Channel Extensions kütüphanesi kullanımı ve dosya okuma, URL çekme, lisans analizi gibi işlemlerin paralelleştirilmesi örneklerle gösterilmektedir.
- Videoda ayrıca channel'ların prosedür-consumer pattern'ini nasıl uyguladığı, asenkron programlama yapabilmemizi sağladığı ve .NET'te concurrency yeteneği sağladığı açıklanmaktadır. Sunucu, Channel API'nin basit ve yalın yapısının RabbitMQ, Kafka gibi daha karmaşık sistemlere göre avantajlarını vurgulamakta ve farklı versiyonların performans testlerini paylaşmaktadır.
- 00:03Giriş ve Kanalların Tanımı
- Alper, Hepsiburada'da çalışan ve profesyonel iş hayatında 20 yıl deneyimli bir kod yazarıdır.
- Kanallar, veri yapılarının (primitive veri tipleri, stringler veya C#'daki class, record, struct) bir thread'den başka bir thread'e iletilmesini sağlayan yapılardır.
- .NET'te bu işlem genellikle paylaşılmış değişkenler ve senkronizasyon mekanizmalarıyla gerçekleştiriliyordu, ancak kanallarda mesajların thread'ler arasında direkt gönderilmesi sağlanır.
- 02:44Kanalların Çalışma Prensibi
- Kanallar prosedür-consumer pattern'i kolayca implemente edebilir ve bir kişinin elindeki bir şeyi bir başkasına vermesi gibi çalışır.
- Kanallar thread safe'tir ve first in-first out yaklaşım ile çalışırlar.
- Kanallardaki yayıncı ve mesajı alanların sayılarını arttırarak daha fazla thread elde edilebilir.
- 03:38Kanalların Kullanım Alanları
- Producer-consumer problemleri hemen hemen her yerde karşımıza çıkar, örneğin araba üretim fabrikalarındaki üretim bantları veya hamburgercide hamburgerin hazırlanması.
- Yazılan her program parçası pipeline'lara benzer, bir datanın girişi bir sonraki işlemin girdisi olabilir.
- Linux'taki pipe yapısı, kanalların çalışma prensibine benzer bir örnek olarak gösterilebilir.
- 06:31Kanalların Kullanım Örnekleri
- ASP.NET SignalR içerisinde kanallar ciddi şekilde kullanılmaktadır.
- .NET 5 içerisinde geliştirilmekte olan Quick protokolü implantasyonunda da kanallar kullanılmaktadır.
- Kanallar numbloking asenkron Q'lar anlamına gelir ve thread'lerin bloklanmaması sayesinde concurrency yeteneği sağlar.
- 07:51Kanal Kütüphanesi ve Türleri
- Channel kütüphanesi artık .NET Framework içerisinden çıkartılmış ve NuGet paketi olarak gelmektedir.
- Channel Factory sınıfı içerisinde create bounded metodu ile sınırlı kapasitede channel yaratılabilir.
- Unbound channel, sınırsız kapasitede mesajı kabul edebilen channel'lar yaratır ve sign reader ve writer'ı gibi parametrik olarak konfigüre edilebilir.
- 10:53Kanal Metotları ve Kullanımı
- Channel abstract class'ın içerisinde reader ve writer iki properti ile gelir.
- Channel writer'da try-write, try-writeAsync, complete ve try-complete metodları bulunur.
- Channel reader'da try-read, complete ve readAllAsync metodları bulunur.
- 13:44Channel Benchmark Testi
- Channel'ların efektifliğini, memory allocation ve performansını test etmek için bir implantasyon ve unbound channel'da bir milyon elementi okuyup yazma deneyimi yapılacak.
- Test için basit bir implantasyon kullanılıyor: blocking objelerden gelen mesajları senfor sleep kullanarak trade safvety'sini sağlayarak aynı anda bir kişinin yazmasını sağlıyor.
- Benchmarking kodunda sınırsız kapasiteli bir integer mesajı alan channel yaratılıyor, reader-writer'lar ayrılıyor ve bir milyon kere döndürülüyor.
- 15:52Benchmark Sonuçları
- Channel write işlemi 126 milisaniye sürüyor, custom implantasyonun ise neredeyse 1,80 saniye sürüyor, yani 14-15 kat daha yavaş.
- Channel'lar neredeyse hiç memory allocation yapmıyor, custom implantasyonda ise oldukça memory kullanımı var ve garbage collector'ın generation'ında takılmış gibi görünüyor.
- Channel producer ve consumerların publisher ve subscribe channel kullanımındaki farklı varyantlar inceleniyor.
- 16:50Channel Varyantları ve Performans
- Publisher tek bir consumer etkileşimi için band channel ile unbound channel arasındaki fark gösteriliyor: band channel saniyede 20 milyon mesajı 45 milisaniyede, unbound channel ise 35 milyona kadar çıkıyor ve 28 milisaniyede yapıyor.
- Single publisher birden fazla dinleyici (multi subscriber) durumunda, band channel'da performans 35 milyondan 23 milyona düşüyor ve 28 milisaniyeden 41-42 milisaniyeye çıkıyor.
- Multi-publisher single subscribe'da efficiency olarak tekrar 34-35 milyon değer görülüyor, ancak multi-subscriber'daki örnekte performans ciddi anlamda etkileniyor.
- 19:23Channel Kütüphanesi ve Performans
- Sistem trading channels kütüphanesi, .NET dünyasında pupp senaryolarını asenkron olarak çalıştıran çift yönlü bir API sunuyor ve bir saniyenin altında 20 milyondan fazla mesaj gönderebiliyor.
- Daha fazla performans için distrutor paterni implantasyonu öneriliyor, bu mekanizma saniyede milyon işlemleri handle edebilen bir yapıya sahip.
- Distrutor paternin .NET'e port edilmiş versiyonu unicast'te bir prodü bir subscribe'da saniyede 150 milyonluk mesaja kadar pass edebiliyor.
- 20:57Channel'ların Avantajları
- Channel'lar .NET 5 sonrasında asenkron ve ava kullanılarak geliştirilmiş numblocking Q mekanizmaları ve NuGet üzerinden erişilebilen kütüphanenin sağladığı bir API.
- Bu API, .NET dünyasında chron current programlamayı enable ediyor ve pusap yapılarını kullandığımız uygulamalarda channel'ların implantasyonunda kolaylık sağlıyor.
- Memory allocation ve hız konusunda iyi performans gösteriyor, modüler geliştirme yaparken çalışan modüllerin fonksiyonalitesinin birbiri arasındaki interaction'ı izole etme açısından büyük kolaylık sağlıyor.
- 22:17Channel Kullanımı Örneği
- Bir input dosyasında bulunan GitHub linklerinin (lisans dosyaları) hangi lisans ailesine ait olduğunu tespit edip bir dosyaya yazma örneği veriliyor.
- Normal implantasyonda dosya satır satır okunuyor, her satır için HTTP kolu ile GitHub'tan içerik alınıyor ve hangi lisans ailesine ait olduğu tespit ediliyor.
- Channel'larla bu işlem dört stage'den oluşuyor: dosya okuma, lisans tipini tanımlama, çıktı dosyasına yazdırma ve çıktıları dosyaya kaydetme.
- 25:50Channel'ların Performans Optimizasyonu
- Data pipeline'da en yavaşlatan faktör get license stage'ı çünkü bir network kolu atıyor.
- Bir prosesin iki tip operasyonu var: CPU operations (imaj işlemleri, machine learning modeli train etme) ve IO operations (dışarıya network kola çıkılması, dosya işlemleri, veritabanından query atma).
- Get license stage'ı birden fazla çalışacak şekilde scale etmek, darboğazı ortadan kaldırmak için bir çözüm olabilir.
- 27:30Split ve Merge İşlemleri
- Get lions operasyonu read file operasyonuna göre çok daha yavaş çalışmaktadır.
- Split and merge kavramı, channel kompleksinde bir channel'ı split etmek veya multiplexer yapmak anlamına gelmektedir.
- Split işlemi, bir channel'ı farklı channel'lara çoklaştırarak backpsher'ı ortadan kaldırmayı amaçlamaktadır.
- 28:45Split İşleminin İmplementasyonu
- Split işlemi için bir input channel reader alınıp, kaç tane channel'a parçalamak istendiğine göre o kadar channel yaratılır.
- Asenkron bir task içerisinde gelen input mesajı reddedilir ve output channel'lar üzerinden mesajlar round robin gibi pas edilir.
- İşlem tamamlandıktan sonra output channel'lar kapatılır ve dışarıya output select olarak channel'ların reader'ları aktarılır.
- 30:13Merge İşlemi
- Merge, split'in tam tersi bir operasyon olup, birden fazla inputdaki datayı konsolize edip tek bir output bırakması anlamına gelmektedir.
- Merge işlemi için create unbound bir channel yaratılır ve asenkron bir delegation action tanımlanır.
- Gelen her channel'ın reader'ı rededilir, gelen mesajlar output channel'a yazılır ve işlem tamamlandıktan sonra output channel'ın writer'ı kapatılır.
- 32:28Channel Yönteminde Kodlama
- Channel yönteminde üç tane bound channel yaratılır ve kapasitesi 50.000 olarak ayarlanır.
- İlk adımda dosya açılıp satır satır okunup download channel'a yazılır.
- İkinci adımda download taskeri oluşturulur ve 100 tane sap task oluşturulur, bu tasklar URL'leri okuyup HTTP kol atıp cevabı content channel'a write eder.
- 36:15Open Channel Extensions Kullanımı
- Open Channel Extensions kütüphanesi, channel işlemleri için daha basit ve yalın bir API sunmaktadır.
- Channel create bound metodu ile sınırlı kapasitede bir channel yaratılır ve source olarak data kaynağı belirlenir.
- Pipe asic metodu kullanılarak split ve merge gibi işlemler uygulanır, maksimum concurrency değeri ve channel kapasitesi ayarlanabilir.
- 39:48Channel API Kullanımı
- Channel API, paralel işlem yapma ve cor görüntü olarak işlem yapma imkanı sunan kullanışlı ve yalın bir API'dir.
- API'nin farklı versiyonları (open extension, channel, channels) farklı sürelerde çalışmaktadır.
- En son test edilen kod örneğinde channel versiyonu dört saniye gibi yeni hala gelmemiştir.
- 40:36Channel Kullanım Örneği
- Dışarıdan gelen bir request'i channel ile işlemek için sınırsız bir string tipinde channel singleton olarak register edilebilir.
- Controller'da channel string'i enjekte edilebilir ve mesaj içerisinde channel direkt pas edilebilir.
- Background servislerde channel'a event asing yapılarak, channel'ın okundu mu, kapandı mı veya yeni data var mı kontrol edilebilir.
- 41:56Basitlik ve Yalınlık Önemi
- Rabbit MQ, Kafka ve mediator gibi event oryant yapılar daha karmaşık olabilir.
- Basitlik ve yalınlık, bazı problemleri daha basit çözümlerle çözebilir.
- Sunumun sonunda soru zamanı kalmış ancak vakti kalmadığı için Discord üzerinden soru-cevap yapılacağı belirtilmiştir.