Mimari Örüntüler

Pipe And Filters Mimarisi

Mimari örüntülerden Kanallar (Pipe) ve Filtreler mimarisi Compiler, Unix Shell veya Stream Data Processing çok sıkça kullanılan bir mimari türüdür.

Onur Dayıbaşı
Architectural Patterns

--

Kanallar üzerinde verinin aktığını düşünün (stream data) ilerleme sırasında bu veri üzerinde sırası ile farklı farklı işlemleri gerçekleştiren filtreler/workers bulunur. Bunlar veriyi değiştirip bir sonraki aşamaya yönlendirir. Bu sayede sadece belli işleri yapan birbirine bağımlı olmayan bileşenlere sahip olursunuz.

Pipe And Filters

Burda kanallar bir veritabanı, kuyruk vb ilerleyen veriyi kaydedip bir sonraki aşamaya iletebilecek yapılar olmalıdır. SQL veritabanları, ActiveMQ, RabbitMQ veya Kafka benzeri araçlar bu kanalları oluşturabilirsiniz. Burda Filtreler birbirine bağımlılıklarını ortadan kaldırmış olursunuz. Hepsinde kendisi ile ilgili veri ile ilgilenir, sistem paralel çalışabilir. High cohesion, low coupling sağlayabildiği için çokça tercih edilen ve kullanılan bir mimaridir.

Görüldüğü gibi Compiler, Unix Shell, Analitik Veri İşleme gibi verinin bir yerden akmaya başladığı ve yol boyunca farklı aşamalardan geçmesi gereken sistemlerde bu mimariyi tercih edebilirsiniz. İnteraktif yani kullanıcı etkileşimi olan yapılar için uygun değildir. Burada amacımız performans ve filtrelerde bulunan farklı iş mantıklarını birbirinden soyutlayarak büyük sistemleri geliştirebilme imkanı sağlarız.

Filtreleri yazacak ekipleri ve kişileri ayırabiliriz. Kodlama dilleri birbirinden farklı olabilir örneğin Görüntü İşleme, OCR gibi kısımlar C++ gibi kütüphaneler ve diller ile yapılırken, burdan çıkan verilen Makine Öğrenmesi kısmında Python ile gerçekleştirilebilir.

Burdaki Worker/Filteler ayrı makinelerde, Kubernetes üzerindeki Docker olabilir, Serverless FaaS Fonksiyonlar (Lambda .. ) olabilir, PaaS üzerinde ElasticBeanstalk üzerinde Worker olabilir.

Veya aynı makinedeki farklı process, thread veya fonksiyonda olabilir. Bu tamamen sizin tasarımınıza ve ihtiyaçlarınıza bağlıdır.

Mantıksal parçaları bu şekilde birbirinden ayırmak size ilerde yük geldiğinde sistemi ölçeklendirebilmek ve monolith kocaman bir yapı olmaktan kurtarır.

Compiler

Compiler geliştiricilerin yazmış oldukları kodu makine diline çevirirler. Bu sayede bizde yazılımı daha soyut bir şekilde düşünüp geliştirebiliriz. Compiler bu işlemi yaparken bizim yazdığımı ASCII Text kodlarını sırası ile Lexical Analysis → Syntax Analyzer → Semantic Analyzer → ve Code Generator geçirir. Burda her bir filtre bir öncekinin çıktısını bekler ve kendinin sorumlu olduğu kapsam girdiyi işler.

Compiler Pipe And Filter

Makine Öğrenmesi Pipeline

Feature Extractor kısmındaki ImageParser → Normalizer → Convolver → Symmetric Rectifier → Pooler Worker işlenerek veri ilerler

https://www.slideshare.net/jeykottalam/pipelines-ampcamp

Peki bu mimarinin hiç problemli yan etkisi yok mu. Hem performansı arttırıyor hemde High Cohesion, Low Coupling sağlıyor. Ama dikkat edilmesi gereken kısımlar var;

  • Öncelikle her yerde kullanabilir değil. Akan bir veriniz ve bu verinin yol üzerinde parçalar halinde işlenme mantığında olması lazım.
  • Filtrelerin farklı farklı sistemlere dağıtılabilme kolaylığı ve çok küçük yazılmaları durumunda çok fazla filtrenin olması ve bunların bir karmalıklığı yol açması
  • Kanallardaki verinin kaybolmaması lazım. Bunun için bellekte veya kapanınca verinin kaybolacağı sistemler yerine veritabanı ve kuyrukları tercih edin
  • Idempotency Patterns , İleti üzerinde işlem yaparken bir worker/filtre hata alması durumunda , diğer başka bir worker aynı iletiyi alıp aynı işlemi 2 kez yapmaya çalışırsa örneğin veritabanında X sayısını 10 kuruş arttırmak yerine 20 kuruş arttırır. Bu nedenle kanal üzerindeki filtrenin ileti için sadece 1 kez çalıştırılacak şekilde geliştirilmelidir.
  • Kanallar üzerinde aynı iletinin 2 veya daha fazla kopyasının oluşturulması engellenmelidir.
  • İş hattındaki her filtre çevresinden yalıtılmış olarak şekilde çalışmaktadır. Bundan dolayı ihtiyaç duyduğu Context(Bağlam) ya bu iletilerle taşınacaktır. Context çok büyük boyutlarda olduğu durumlarda Filtre network üzerinden veya kendi dosya sistemi üzerinden I/O işlemi ile bağlamın eksik kısımlarını almaya çalışacaktır. Bu da performans konusunda ekstra maliyet anlamına gelir.

Okumaya Devam Et 😃

Bu yazının devamı veya yazı grubundaki diğer yazılara erişmek için bu linke tıklayabilirsiniz.

--

--