Akka neden eşzamanlılık için iyidir?


9

Akka ve aktör çerçevesine yeniyim - Eminim açık bir şeyi kaçırıyorum, lütfen özürlerimi önceden kabul edin.

Akka'yı seçmek için ana noktalardan birinin eşzamanlılığı yönetme yolu olduğunu okumaya devam ediyorum.

Akka'nın neden bu kadar özel olduğu açık değil; Çok hafif ve hızlı olan birçok küçük aktör olduğunu anlıyorum; ancak, iki kullanıcı bir formu aynı anda kaydettiğinde bu bana nasıl yardımcı olabilir?

Hala bir çeşit eşzamanlılık kilidine ihtiyacım olmaz mıydı (kötümser / iyimser / vb.)?


Aktörlerin eşzamanlılık veya özellikle Akka için neden iyi olduğunu mu soruyorsunuz?
Scriptin

Wouldn't I still need some sort of concurrency lock (pessimistic/optimistic/etc..)?- Evet, ancak aktörün değil, temeldeki RDBMS'nin sorumluluğu budur. Büyük olasılıkla Akka oyuncusu doğrudan kullanıcıyla konuşmuyor. Aksine, Akka aktörü ve kullanıcı (esasen başka bir aktör) doğrudan veritabanıyla etkileşime girer.
Robert Harvey

Yanıtlar:


7

Aktörler ve ajanlar gibi mesaj işleme modellerinin avantajlarından biri, geleneksel eşzamanlılık sorunlarının (öncelikle paylaşılan durumun senkronizasyonu) artık bir sorun olmamasıdır. Oyuncu özel durumu koruyabilir ve kilitler olmadan özgürce güncelleyebilir. Aktör çerçevesi, aynı anda yalnızca bir mesajın işlenmesini sağlar. Serileştirilmiş işlemede kod kilitsiz bir şekilde yazılabilir.

Bir formu kaydeden kullanıcı örneğinizde, aktörün her formdaki bazı verilerin bir Listesini tuttuğu varsayılarak, aktör listeyi kilitsiz güncelleyebilir, çünkü çerçeve bir seferde yalnızca bir formun işlenmesini garanti eder. Geleneksel olarak, Liste erişimlerini kilitlemeniz veya eşzamanlı bir liste kullanmanız gerekir.

Eşzamanlılık stratejisi biraz farklı bir konudur ve hala sizin sorumluluğunuzdadır (hiçbir strateji en yaygın strateji değildir). Örneğinizi biraz değiştirmek için, her iki kullanıcının da aynı anda aynı formu güncellemeye çalıştığını varsayalım. Eşzamanlılık stratejisi olmadan birinin değişiklikleri diğerinin üzerine yazılır (muhtemelen sonuncusu kazanır). Bu iyi, ama en iyi ihtimalle, değişikliklerinin üzerine yazılan kullanıcı için beklenmedik davranışlarla sonuçlanır. Az önce değiştirdikleri formu görüntülerlerse, beklenmedik değerlere sahip olurlar (diğer kullanıcıdan). En kötüsü (sadece form güncellemelerinden bahsetmediğimizde, aynı zamanda nakliye siparişleri gibi şeylerden de bahsettiğimizde) çeşitli kayıplara (zaman, gelir vb.) Neden olabilir.

Bir eşzamanlılık stratejisi kullanmak, bu vakaları tanımlamaya ve bunları iş kurallarına göre çözebilmeye yardımcı olur. Örneğin, İyimser Eşzamanlılık, kullanıcının güncellediği formun sürümünü göndermesini sağlar. Aktör değişikliği işlemeye gittiğinde, ikinci kullanıcının, form ilk kullanıcının güncellemesi nedeniyle aslında Sürüm 6'da olduğunda Sürüm 5'i güncellediğini düşündüğünü fark eder. Şimdi en azından 2. kullanıcıya formun düzenlenmeye başlamasından bu yana değiştiğini bildirebiliriz. Ya da işin kurallarını ne olursa olsun, orada uygulamak istediği

Bir formun güncellenmesi durumunda, muhtemelen eşzamanlılık kadar umursamıyorsunuz (bağlı, sanırım). Ancak diğer durumlarda, en azından ihlalleri kontrol etmek ve ele almak çok önemli bir şey olabilir. Kullanıcılar farklı bölümleri değiştirmiş gibi (form benzetmesine devam etmek için) eşzamanlılık ihlalini bile göz ardı etmek isteyebilirsiniz. Veya değişikliğin işletme üzerinde büyük bir etkisi varsa (büyük bir sipariş), değişikliği kabul etmek ve daha sonra küçük anlaşmazlıkları çözmek istersiniz (örn. Yıllık iletişim bilgileri güncellemesi tamamlanmadı).

Akka'nın, adanmışlar için önemli hususlar olan başarısızlıkları, amirleri vb. Nasıl ele aldığı gibi başka boyutları olduğuna inanıyorum.


9

Klasik kilit tabanlı eşzamanlılık ve düzgün işlemsel bellek gibi diğer eşzamanlılık modelleri ile karşılaştırıldığında genel olarak Aktör Modeli hakkında (sadece Akka değil) yazacağım.

Avantajları

  1. Anlamak ve kullanmak için daha kolay konsept

    • Kilit tabanlı eşzamanlılık zordur; özellikle bunu doğru bir şekilde yapmak çok zordur çünkü doğru ve verimli olmak için anlaşılması ve kullanılması gereken birçok kavram vardır: kilitler, semaforlar, vida dişleri, senkronizasyon, karşılıklı dışlama, bellek bariyeri vb.

    • Aktörler ise daha soyut bir kavram; mesaj gönderen ve alan aktörleriniz var. Bellek bariyeri gibi düşük seviyeli kavramları kavramaya ve kullanmaya gerek yoktur.

  2. Değişmezliği zorlar

    • Değişebilirlik, özellikle çok iş parçacıklı uygulamalarda programlamada birçok hata ve hatanın kaynağıdır. Aktör modeli bu sorunu değişmezliği uygulayarak çözer.
  3. Daha az hata eğilimli

    • Yukarıdaki iki nedenden dolayı
  4. Verimli

    • İyi yazılı kilit tabanlı kadar etkili değil ama genel olarak yazılım işlem belleğinden daha verimli.
  5. Kolayca ölçeklenebilir

    • Teorik olarak, uygulama işlerinizi gerçekleştirmek için daha fazla aktör ekleyerek oldukça iyi ölçeklendirilmelidir. Kilit tabanlı ölçeklemek oldukça zordur.

Dezavantajları

  1. Tüm diller değişmezliği kolayca uygulamaz;

    • İlk popüler aktörlerin özünde değişmeyen bir dil olan Erlang, ancak Java ve Scala (aslında JVM) değişmezliği zorlamıyor.
  2. Hala oldukça karmaşık

    • Aktörler, tüm senaryolarda bu kadar basit ve modellenmesi kolay olmayan asenkron bir programlama modeline dayanmaktadır; hata ve hata senaryolarını ele almak özellikle zordur.
  3. Kilitlenmeyi veya açlığı önlemez

    • Birbirinden mesaj bekleyen iki aktör olabilir; böylece hata ayıklamak çok daha kolay olsa da, kilitler gibi bir kilitlenme var. Ancak işlem belleği sayesinde kilitlenmemesi garanti edilir.
  4. Çok verimli değil

    • Zorlanmış değişmezlik ve birçok aktörün aynı iplik aktörlerini kullanmak zorunda kalması nedeniyle, kilit tabanlı eşzamanlılık kadar verimli olmayacaktır.

Sonuç

Kilit tabanlı eşzamanlılık en verimlidir ancak programlanması ve hataya açık olması zordur; yazılım işlemsel bellek en net, programlanması kolay ve daha az hata eğilimli ama aynı zamanda en az verimlidir. Aktörler, bu iki model arasında her yönüyle bir yerdedir: kolay programlama, verimlilik ve hata eğilimi.


2 numaralı avantajınız için, " Değişebilirlik birçok hatanın kaynağıdır ..." ve "... " değişmezlik " yerine değişebilirliği engelleyerek bu sorunu çözemez mi? Ayrıca, ikinci cümlenin sorunu çözmek için iki gereksiz sözü vardır.
8bittree

@ 8bittree Evet, haklısın; yanlış telaffuz ettim. Bilmemeniz durumunda, bu tür sorunları düzeltmek için cevapları düzenleyebilirsiniz.
m3th0dman

Bunun farkındayım, sadece bir yanlış anlama durumunda bir şeyin anlamını tersine çeviren veya büyük ölçüde değiştiren değişiklikler yapmak konusunda isteksizim.
8bittree

Kilitlenme hakkında ayrıntılı bilgi verebilir misiniz? Buna rastlamak için çok garip bir aktör kurulumu (iki yönlü iletişim) kurmanız gerekecek gibi görünüyor. Bir sorma tarzı desen kullanıyorsanız (A, B'den yanıt ister, B isteği işler ve istek göndericiye yanıt verir, ancak hiçbir zaman doğrudan A ile iletişime geçmez) Bir kilitlenmenin nasıl mümkün olduğunu
görmüyorum

1
@Daenyth Aktörlerle çıkmaza girmek için garip bir yapı kullanmanız gerektiğine katılıyorum; ancak benzer bir perspektiften, kilit tabanlı eşzamanlılık ile bir kilitlenme elde etmek için garip bir yapı kullanmanız gerekir (her ne kadar muteks ile bir kilitlenme oluşturmanın bir aktörden çok daha kolay olduğunu kabul ediyorum). Her neyse, fikir, sadece işlemsel hafızanın uygulamayı seçtiğin garip yapı ne olursa olsun bir kilitlenmeyeceğini garanti etmesidir.
m3th0dman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.