Redis tek iş parçacıklıdır, o zaman eşzamanlı G / Ç nasıl yapılır?


170

Redis'in bazı temellerini kavramaya çalışırken ilginç bir blog yazısı ile karşılaştım .

Yazar şöyle diyor:

Redis epoll / kqueue ile tek iş parçacıklıdır ve I / O eşzamanlılığı açısından süresiz olarak ölçeklendirilir.

Kesinlikle tüm iş parçasını yanlış anlıyorum, çünkü bu ifadeyi şaşırtıcı buluyorum. Bir program tek iş parçacıklıysa, eşzamanlı olarak nasıl bir şey yapar? Sunucu yine de tek iş parçacıklıysa, Redis işlemlerinin atomik olması neden bu kadar harikadır?

Bu konuya ışık tutabilecek olan var mı?

Yanıtlar:


362

Eşzamanlılığı nasıl tanımladığınıza bağlıdır.

Sunucu tarafı yazılımında, eşzamanlılık ve paralellik genellikle farklı kavramlar olarak kabul edilir. Bir sunucuda, eşzamanlı G / Ç'leri desteklemek, sunucunun yalnızca tek bir hesaplama birimi olan istemcilere karşılık gelen çeşitli akışları yürüterek birkaç istemciye hizmet verebileceği anlamına gelir. Bu bağlamda, paralellik, sunucunun aynı anda birkaç şeyi (birden fazla hesaplama birimi ile) gerçekleştirebileceği anlamına gelir, bu da farklıdır.

Örneğin bir barmen aynı anda sadece bir içecek hazırlarken birkaç müşteriye bakabilir. Böylece paralellik olmadan eşzamanlılık sağlayabilir.

Bu soru burada tartışılmıştır: Eşzamanlılık ve paralellik arasındaki fark nedir?

Rob Pike'ın bu sunumuna da bakınız .

Tek iş parçacıklı bir program, bir G / Ç (de) çoğullama mekanizması ve bir olay döngüsü (Redis'in yaptığı şey) kullanarak G / Ç düzeyinde eşzamanlılık sağlayabilir.

Paralellik bir maliyete sahiptir: modern donanımda bulabileceğiniz çoklu soketler / çoklu çekirdeklerle, dişler arasındaki senkronizasyon son derece pahalıdır. Öte yandan, Redis gibi verimli bir depolama motorunun tıkanıklığı genellikle CPU'dan çok önce ağdır. Bu nedenle, izole edilmiş olay döngüleri (senkronizasyon gerektirmeyen) verimli, ölçeklenebilir sunucular oluşturmak için iyi bir tasarım olarak görülür.

Redis işlemlerinin atomik olması, tek iş parçacıklı olay döngüsünün bir sonucudur. İlginç olan, atomisitenin ekstra bir ücret ödemeden sağlanmasıdır (senkronizasyon gerektirmez). Senkronizasyon yükünü ödemeden kullanıcı tarafından iyimser kilitleme ve diğer desenler uygulamak için kullanılabilir.


135
Güzel barmen benzetmesi :)
Sergio Tulentsev

3
v4 bu açıdan bir oyun değiştirici - cevabımı stackoverflow.com/a/45374864/3160475 :) adresinde görebilirsiniz.
Itamar Haber

1
cevap ve karşılaştırma hakkında gerçekten sevmediğim tek şey, eşzamanlılığın paralel çalışmadığı gibi görünmesini sağlıyor ve bunu kesinlikle async'i çalıştırarak ve sonuçta iş yapmakla test edebildiğimden kesinlikle yapıyor. paralel olduğu düşünülmektedir. bu makale bağlamındaki paralellik, birden fazla iş parçacığı üzerinde çalışabilmenin çok çekirdekli doğasına atıfta bulunmaktadır. Yani neden iplik güvenli olduğunu ifade.
Christian Matthew

2020'de hala geçerli mi?
Roberto Manfreda

21

Tamam, Redis, kullanıcı düzeyinde OTOH'de tek iş parçacıklıdır, tüm eşzamansız G / Ç, çekirdek iş parçacığı havuzları ve / veya bölünmüş düzey sürücüler tarafından desteklenir.

' Eşzamanlı ', bazıları için, ağ olaylarının soket durum makinelerine dağıtılmasını içerir. Tek iş parçacıklı, bir çekirdek üzerinde (kullanıcı düzeyinde) çalışır, bu yüzden buna eşzamanlı olarak değinmeyeceğim. Diğerleri farklı ..

' I / O eşzamanlılığı açısından süresiz ölçeklenmek ' sadece gerçekle ekonomiktir. 'İstemciye göre bir iş parçacığından daha iyi ölçeklenebilir, istemcilere fazla bir şey istemediğini' söyleseler daha fazla inanabilirler, ancak daha sonra diğer asenkron çözümler tarafından ağır yüklemeye üflendiklerini eklemek zorunda kalabilirler. kullanıcı düzeyinde tüm çekirdekleri kullanan ".


Bağlam dışında olabilir, ancak her güncelleme işlemi (INCR komutunda olduğu gibi) bir kilit taşıyor mu? Bir anahtarda 1000 eşzamanlı istek ve bir artış işlemi varsa (istek başına), değişkenin yalnızca 1000 kat artırılmasını sağlar mı?
Amanda
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.