Olay odaklı mimari - Event-driven architecture

Olay odaklı mimari (EDA) bir yazılım mimarisi üretim, tespit, tüketim ve tepkiyi teşvik eden paradigma Etkinlikler.

Bir Etkinlik "önemli bir değişiklik" olarak tanımlanabilir durum ".[1] Örneğin, bir tüketici bir araba satın aldığında, arabanın durumu "satılık" dan "satıldı" olarak değişir. Bir otomobil bayisinin sistem mimarisi, bu durum değişikliğini, meydana geldiği mimari içindeki diğer uygulamalar tarafından bilinebilen bir olay olarak ele alabilir. Resmi bir perspektiften, üretilen, yayınlanan, yayılan, algılanan veya tüketilen, olay bildirimi adı verilen (tipik olarak eşzamansız) bir mesajdır ve olayın kendisi değil, mesaj yayılmasını tetikleyen durum değişikliği değildir. Olaylar seyahat etmez, sadece gerçekleşir. Ancak terim Etkinlik sıklıkla kullanılır metonimik olarak bazı kafa karışıklıklarına yol açabilecek bildirim mesajının kendisini belirtmek için. Bunun nedeni, Olay Odaklı mimarilerin genellikle en üstte tasarlanmasıdır. ileti odaklı mimariler, böyle bir iletişim örüntüsünün her bir iletişimin nasıl ele alınması gerektiğini ayırt etmek için girdilerden birinin yalnızca metin olmasını gerektirdiği durumlarda mesaj.

Bu mimari desen olayları ileten uygulamaların ve sistemlerin tasarımı ve uygulamasıyla uygulanabilir. gevşek bağlı yazılım bileşenleri ve Hizmetler. Olay güdümlü bir sistem tipik olarak olay yayıcılardan (veya aracılardan), olay tüketicilerinden (veya alıcılardan) ve olay kanallarından oluşur. Vericiler olayları tespit etme, toplama ve aktarma sorumluluğuna sahiptir. Bir Olay Yayıcı, olayın tüketicilerini tanımaz, bir tüketicinin var olup olmadığını bile bilmez ve varsa, olayın nasıl kullanıldığını veya daha fazla işlendiğini bilmez. Lavabolar, bir olay sunulur sunulmaz bir tepkiyi uygulama sorumluluğuna sahiptir. Tepki tamamen lavabonun kendisi tarafından sağlanabilir veya sağlanmayabilir. Örneğin, havuz yalnızca olayı filtreleme, dönüştürme ve başka bir bileşene iletme sorumluluğuna sahip olabilir veya bu tür bir olaya kendi kendine yeten bir tepki sağlayabilir. Olay kanalları, olayların olay yayıcılardan olay tüketicilerine iletildiği kanallardır. Olayların doğru dağıtımı bilgisi, yalnızca olay kanalında mevcuttur.[kaynak belirtilmeli ] Olay kanallarının fiziksel uygulaması, aşağıdaki gibi geleneksel bileşenlere dayanabilir: mesaj odaklı ara yazılım veya daha uygun bir görüşme gerektirebilecek noktadan noktaya iletişim işlem yürütme çerçevesi[netleştirmek ].

Olay güdümlü bir mimari etrafında sistemler oluşturmak, içinde yatay ölçeklenebilirliği basitleştirir dağıtılmış hesaplama modeller ve başarısızlığa karşı daha dirençli hale getirir. Bunun nedeni, uygulama durumunun yüksek kullanılabilirlik için birden çok paralel anlık görüntüye kopyalanabilmesidir.[2] Yeni olaylar herhangi bir yerden başlatılabilir, ancak daha da önemlisi, geldiklerinde her birini güncelleyen veri depoları ağında yayılır. Fazladan düğüm eklemek de önemsiz hale gelir: uygulama durumunun bir kopyasını alabilir, ona bir olay akışı besleyebilir ve onunla çalıştırabilirsiniz. [3]

Olay odaklı mimari tamamlayıcı olabilir Servis Odaklı Mimari (SOA) çünkü hizmetler, gelen olaylarda tetiklenen tetikleyiciler tarafından etkinleştirilebilir.[4][5]Bu paradigma, lavabo herhangi bir şey sağlamadığında özellikle yararlıdır. kendi kendine yeten yönetici[netleştirmek ].

SOA 2.0 Yeni bir olay modeli oluşturmak için önceden bilinmeyen nedensel ilişkileri kullanarak, SOA ve EDA mimarilerinin daha zengin, daha sağlam bir seviyeye sağladığı etkileri geliştirir.[belirsiz ] Bu yeni iş zekası model, katma değerli bilgileri daha önce elde edilemeyen tanınmış modele enjekte ederek işletmeye katlanarak değer katan daha fazla özerk insan veya otomatik işlemeyi tetikler.[belirsiz ]

Olay yapısı

Bir olay, olay başlığı ve olay gövdesi olmak üzere iki bölümden oluşabilir. Olay başlığı, olay adı, olay için zaman damgası ve olay türü gibi bilgileri içerebilir. Olay gövdesi, tespit edilen durum değişikliğinin ayrıntılarını sağlar. Bir olay gövdesi, olayın kendisinin oluşumuna tepki olarak uygulanabilecek model veya mantıkla karıştırılmamalıdır. CloudEvents olay verilerini ortak bir şekilde açıklamak için bir Açık Kaynak belirtimi sağlar.

Olay akışı katmanları

Olay güdümlü bir mimari, bir olayın (yani önemli bir zamansal durum veya olgunun) algılanmasından başlayarak, bir olay yapısı biçiminde teknik temsilinin yaratılmasına ilerleyen ve bir olayın olmayanıyla biten dört mantıksal katman üzerine inşa edilebilir. - o olaya boş tepki seti.[6]

Olay oluşturucu

İlk mantıksal katman, bir gerçeği algılayan ve bu gerçeği bir olay mesajı olarak temsil eden olay üreticisidir. Örnek olarak, bir olay oluşturucu bir e-posta istemcisi, bir E-ticaret sistemi, bir izleme aracısı veya bir tür fiziksel sensör olabilir.

Bu kadar çeşitli veri kaynaklarından toplanan verileri değerlendirme için tek bir standartlaştırılmış veri biçimine dönüştürmek, bu ilk mantıksal katmanın tasarımında ve uygulanmasında önemli bir görevdir.[6] Bununla birlikte, bir olayın güçlü bir şekilde bildirimsel bir çerçeve olduğu düşünüldüğünde, herhangi bir bilgi işlemi kolaylıkla uygulanabilir, böylece yüksek düzeyde bir standardizasyon ihtiyacını ortadan kaldırır.[kaynak belirtilmeli ]

Etkinlik kanalı

Bu ikinci mantıksal katmandır. Bir olay kanalı, bir olay oluşturucudan toplanan bilgileri olay motoruna yayma mekanizmasıdır.[6] Bu, bir TCP / IP bağlantısı veya herhangi bir giriş dosyası türü (düz, XML biçimi, e-posta vb.) olabilir. Aynı anda birkaç olay kanalı açılabilir. Genellikle, olay işleme motoru bunları neredeyse gerçek zamanlı olarak işlemesi gerektiğinden, olay kanalları eşzamansız olarak okunacaktır. Olaylar bir kuyrukta saklanır ve daha sonra olay işleme motoru tarafından işlenmeyi bekler.

Olay işleme motoru

Olay işleme motoru, bir olayın tanımlanmasından ve ardından uygun reaksiyonun seçilip yürütülmesinden sorumlu olan mantıksal katmandır. Ayrıca bir dizi iddiayı tetikleyebilir. Örneğin, olay işleme motoruna gelen olay stokta düşük bir ürün kimliğiyse, bu "Ürün kimliği sipariş et" ve "Personele bildir" gibi reaksiyonları tetikleyebilir.[6]

Akış aşağı olay odaklı aktivite

Bu, olayın sonuçlarının gösterildiği mantıksal katmandır. Bu, birçok farklı yol ve biçimde yapılabilir; Örneğin, birine bir e-posta gönderilir ve bir uygulama ekranda bir tür uyarı görüntüleyebilir.[6] Havuz (olay işleme motoru) tarafından sağlanan otomasyon düzeyine bağlı olarak, aşağı akış etkinliği gerekli olmayabilir.

Olay işleme stilleri

Üç genel olay işleme stili vardır: basit, akış ve karmaşık. Üç stil genellikle olgun olay odaklı bir mimaride birlikte kullanılır.[6]

Basit olay işleme

Basit olay işleme, belirli, ölçülebilir koşul değişiklikleriyle doğrudan ilişkili olaylarla ilgilidir. Basit olay işlemede, aşağı akış eylem (ler) ini başlatan dikkate değer bir olay meydana gelir. Basit olay işleme, işin gerçek zamanlı akışını yönlendirmek için yaygın olarak kullanılır, böylece gecikme süresi ve maliyeti azaltır.[6]

Örneğin, lastik basınçlarında veya ortam sıcaklığındaki değişiklikleri algılayan bir sensör tarafından basit olaylar oluşturulabilir. Otomobilin yanlış lastik basıncı, sensörden, sürücüye lastiğin durumu hakkında tavsiyede bulunan sarı bir ışığı tetikleyen basit bir olay oluşturacaktır.

Olay akışı işleme

İçinde olay akışı işleme (ESP), hem sıradan hem de dikkate değer olaylar olur. Sıradan olaylar (siparişler, RFID aktarımları) dikkate değerlik açısından taranır ve bilgi abonelerine aktarılır. Olay akışı işleme, genellikle kurum içinde ve çevresinde gerçek zamanlı bilgi akışını yönlendirmek için kullanılır ve bu da zamanında karar vermeyi sağlar.[6]

Karmaşık olay işleme

Karmaşık olay işleme (CEP), karmaşık bir olayın meydana geldiği sonucuna varmak için basit ve sıradan olay kalıplarının dikkate alınmasına izin verir. Karmaşık olay işleme, olayların birleşimini değerlendirir ve ardından harekete geçer. Olaylar (dikkate değer veya olağan), olay türlerini geçebilir ve uzun bir süre boyunca meydana gelebilir. Olay korelasyonu nedensel, zamansal veya uzamsal olabilir. CEP, sofistike olay yorumlayıcılarının, olay örüntü tanımının ve eşleştirmesinin ve korelasyon tekniklerinin kullanımını gerektirir. CEP, genellikle iş anormalliklerini, tehditleri ve fırsatları tespit etmek ve bunlara yanıt vermek için kullanılır.[6]

Çevrimiçi etkinlik işleme

Çevrimiçi olay işleme (OLEP), karmaşık olayları işlemek ve kalıcı verileri yönetmek için zaman uyumsuz dağıtılmış olay günlüklerini kullanır.[7] OLEP, karmaşık bir senaryonun ilgili olaylarını heterojen sistemler arasında güvenilir bir şekilde oluşturmaya izin verir. Böylelikle, yüksek ölçeklenebilirliğe sahip çok esnek dağıtım modelleri sağlar ve güçlü tutarlılık sunar. Ancak, işlem süresinin üst sınırını garanti edemez.

Aşırı gevşek bağlantı ve iyi dağıtılmış

Olay odaklı bir mimari, son derece gevşek bir şekilde birleştirilmiştir ve iyi dağıtılmıştır. Bu mimarinin büyük dağılımı var çünkü bir olay neredeyse her şey olabilir ve neredeyse her yerde var olabilir. Mimari son derece gevşek bir şekilde bağlanmıştır çünkü olayın kendisi nedeninin sonuçlarını bilmiyor. Örneğin. Ön kapı açıldığında bilgi kaydeden bir alarm sistemimiz varsa, kapının kendisi alarm sisteminin kapı açıldığında bilgi ekleyeceğini, sadece kapının açıldığını bilmez.[6]

Anlamsal Eşleştirme ve daha fazla araştırma

Olay güdümlü mimariler, bilgi alışverişi ve dağıtılmış iş akışları için ölçeklenebilir bir altyapı sağlayan, alan, zaman ve senkronizasyon içinde gevşek bağlantıya sahiptir. Bununla birlikte, olay mimarileri, olay abonelikleri ve kalıpları aracılığıyla, temeldeki olay şeması ve değerlerinin anlambilimine sıkı bir şekilde bağlanır. Akıllı şehirler ve sensör ağı gibi büyük ve açık dağıtımlardaki olayların yüksek derecede anlamsal heterojenliği, olay tabanlı sistemlerin geliştirilmesini ve sürdürülmesini zorlaştırır. Olay tabanlı sistemlerde anlamsal eşleşmeyi ele almak için yaklaşık anlamsal eşleme olayların aktif bir araştırma alanıdır.[8]

Uygulamalar ve örnekler

Java Swing

Java Salıncak API, olay odaklı bir mimariye dayanır. Bu, Swing'in arkasındaki motivasyonla, kullanıcı arayüzüyle ilgili bileşenler ve işlevsellik sağlamak için özellikle iyi çalışıyor. API, olay sorunlarını ilişkilendirmek ve düzenlemek için bir isimlendirme kuralı (ör. "ActionListener" ve "ActionEvent") kullanır. Belirli bir olayın farkında olması gereken bir sınıf, uygun dinleyiciyi uygular, miras alınan yöntemleri geçersiz kılar ve ardından olayı tetikleyen nesneye eklenir. Çok basit bir örnek şöyle olabilir:

halka açık sınıf FooPanel genişler JPanel uygular ActionListener {    halka açık FooPanel() {        Süper();        JButton btn = yeni JButton("Beni tıkla!");        btn.addActionListener(bu);        bu.Ekle(btn);    }    @Override    halka açık geçersiz actionPerformed(ActionEvent ae) {        Sistem.dışarı.println("Düğme tıklandı!");    }}

Alternatif olarak, başka bir uygulama seçeneği dinleyiciyi nesneye bir anonim sınıf. Aşağıda bir örnek verilmiştir.

halka açık sınıf FooPanel genişler JPanel {    halka açık FooPanel() {        Süper();        JButton btn = yeni JButton("Beni tıkla!");        btn.addActionListener(yeni ActionListener() {            halka açık geçersiz actionPerformed(ActionEvent ae) {                Sistem.dışarı.println("Düğme tıklandı!");            }        });        bu.Ekle(btn);    }}

JavaScript

(() => {  "sıkı kullan";  sınıf EventEmiter {    kurucu() {      bu.Etkinlikler = yeni Harita();    }    açık(Etkinlik, dinleyici) {      Eğer (bir çeşit dinleyici !== "işlev") {        atmak yeni TypeError('Dinleyici bir işlev olmalıdır');      }      İzin Vermek dinleyiciler = bu.Etkinlikler.almak(Etkinlik);      Eğer (!dinleyiciler) {        dinleyiciler = yeni Ayarlamak();        bu.Etkinlikler.Ayarlamak(Etkinlik, dinleyiciler);       }      dinleyiciler.Ekle(dinleyici);      dönüş bu;    }    kapalı(Etkinlik, dinleyici) {      Eğer (!argümanlar.uzunluk) {        bu.Etkinlikler.açık();      } Başka Eğer (argümanlar.uzunluk === 1) {        bu.Etkinlikler.sil(Etkinlik);      } Başka {        sabit dinleyiciler = bu.Etkinlikler.almak(Etkinlik);        Eğer (dinleyiciler) {          dinleyiciler.sil(dinleyici);        }      }      dönüş bu;    }    yaymak(Etkinlik, ...argümanlar) {      sabit dinleyiciler = bu.Etkinlikler.almak(Etkinlik);      Eğer (dinleyiciler) {        için (İzin Vermek dinleyici nın-nin dinleyiciler) {          dinleyici.uygulamak(bu, argümanlar);        }      }      dönüş bu;    }  }  bu.EventEmiter = EventEmiter;})();

Kullanım:

sabit Etkinlikler = yeni EventEmiter();Etkinlikler.açık('foo', () => { konsol.günlük('foo'); });Etkinlikler.yaymak('foo'); // "foo" yazdırırEtkinlikler.kapalı('foo');Etkinlikler.yaymak('foo'); // Hiçbir şey olmayacak

Ayrıca bakınız

Nesne

Referanslar

  1. ^ K. Mani Chandy Olay Odaklı Uygulamalar: Maliyetler, Faydalar ve Tasarım Yaklaşımları, Kaliforniya Teknoloji Enstitüsü, 2006
  2. ^ Martin Fowler, Etkinlik Kaynaklama, Aralık, 2005
  3. ^ Martin Fowler, Paralel Model, Aralık, 2005
  4. ^ Hanson, Jeff (31 Ocak 2005). "SOA'da olay odaklı hizmetler". JavaWorld. Alındı 2020-07-21.
  5. ^ Sliwa Carol (12 Mayıs 2003). "Geniş çapta benimsenmeye hazır, olay odaklı mimari". Bilgisayar Dünyası. Alındı 2020-07-21.
  6. ^ a b c d e f g h ben j Brenda M. Michelson, Olay Odaklı Mimariye Genel Bakış, Patricia Seybold Grubu, 2 Şubat 2006
  7. ^ "Çevrimiçi Etkinlik İşleme - ACM Sırası". queue.acm.org. Alındı 2019-05-30.
  8. ^ Hasan, Souleiman, Sean O'Riain ve Edward Curry. 2012. "Heterojen Olayların Yaklaşık Anlamsal Eşleştirmesi." 6. ACM Uluslararası Dağıtılmış Olay Tabanlı Sistemler Konferansı'nda (DEBS 2012), 252–263. Berlin, Almanya: ACM. "DOI".

Dış bağlantılar