Dizel bir senkronizasyon aktörü, actix_web :: web :: block veya futures-cpupool kullanılarak mı çalıştırılmalıdır?


10

Arka fon

Ben r2d2 aracılığıyla dizel kullanarak bir actix-web uygulaması üzerinde çalışıyorum ve en iyi nasıl zaman uyumsuz sorguları yapmak emin değilim. Makul gibi görünen üç seçenek buldum, ancak hangisinin en iyisi olduğundan emin değilim.

Potansiyel çözümler

Senkronizasyon Oyuncusu

Birincisi actix örneğini kullanabilirim , ancak oldukça karmaşık ve inşa etmek için adil bir kazan plakası gerektiriyor. Umarım daha makul bir çözüm vardır.

Actix_web::web::block

Başka bir seçenek olarak actix_web::web::blockbenim sorgu işlevleri bir geleceğe sarmak için kullanabilirsiniz , ancak bunun performans sonuçları emin değilim.

Sorgu daha sonra aynı Tokio sisteminde mi çalışıyor? Kaynakta ne bulabilirim , altta yatan actix-web threadpool bir iplik oluşturur . Bu bir problem mi?

Kodu doğru okursam, r2d2 bir bağlantı alırken iş parçacığını engeller, bu da çekirdek actix-web havuzunun bir kısmını bloke eder. Veritabanı sorgularıyla aynı. Bu havuzda iş parçacıkları daha fazla sorgu yaparsanız bu daha sonra tüm actix-web engeller? Eğer öyleyse, büyük sorun.

Vadeli-cpupool

Son olarak, gereksiz bir ek yüke sahip olabilecek güvenli bahis futures-cpupool'dur . Ana sorun, bu benim projeme başka bir sandık eklemek anlamına gelir, ancak benim uygulama gereksiz yere etrafında yüzen birden fazla cpu havuzu fikrini sevmiyorum.

Hem r2d2 hem de dizel bloke olacağından burada şaşırtıcı miktarda zor şeyler var.

En önemlisi, bu cpupool'u aynı r2d2 havuzunu kullanmayan herhangi bir şeyle paylaşmayın (oluşturulan tüm iş parçacıkları sadece bir r2d2 bağlantısı için beklemeyi engelleyebilir, çalışma olduğunda tüm havuzu kilitleyebilir).

İkincisi (biraz daha açık bir şekilde), bu nedenle havuzdaki iş parçacıklarından daha fazla r2d2 bağlantısına sahip olmamalısınız ve bunun tersi, daha büyük olan kaynak israfına neden olur (kullanılmayan bağlantılar / sürekli iş parçacıkları sürekli olarak engellenir) (belki daha hızlı bir şekilde daha fazla iş parçacığı) cpupool zamanlayıcı yerine OS zamanlayıcı tarafından bağlantı aktarımı).

Son olarak, hangi veritabanını kullandığınıza ve orada sahip olduğunuz performansa dikkat edin. Tek bir bağlantı r2d2 ve havuzda tek bir iş parçacığı çalıştırmak (ben böyle bir uygun bir veritabanı tavsiye ederim) olsa da yazma ağır sqlite uygulamada en iyi olabilir.

Eski cevaplar

Çalışabilecek eski çözümler

https://www.reddit.com/r/rust/comments/axy0hp/patterns_to_scale_actixweb_and_diesel/

Özünde, Futures-cpupool'u önerir.

Gelecekte bloke edici I / O kapsülleme için en iyi yaklaşım nedir?

Genel durumlar için Futures-cpupool'u önerir.

Çalışmayan eski çözümler

https://www.reddit.com/r/rust/comments/9fe1ye/noob_here_can_we_talk_about_async_and_databases/

Eski bir actix-web sürümü için gerçekten güzel bir düzeltme. Ne bulabilirim istekleri içinde artık bir cpu havuzu yok.


Bu sayıdaki yorumlardan, futures-cpupoolDizel'deki asyncdestek eksikliği için önerilen geçici çözüm olduğu anlaşılıyor .
JMB

Bu daha genel bir çözüm. Actix sistemini kaldıracak bir şey umuyorum. Daha azı, şimdi sorunları aramak için futures-cpupool'a gireceğim.
logina

Stack Overflow'a hoş geldiniz! Görünüşe göre sorunuz gelecek I / O'yu engellemek için en iyi yaklaşım nedir? . Değilse , farklılıkları açıklamak için lütfen sorunuzu düzenleyin . Aksi takdirde, bu soruyu zaten yanıtlanmış olarak işaretleyebiliriz.
Shepmaster

Cpupool ayrıca r2d2'de engelleme bağlantı havuzu ile etkileşime girdiğinden, bunu en iyi nasıl çözeceğinizden emin değilim. Şimdi kendime bakıyorum ve yakında bununla güncelleyeceğim.
logina

Yanıtlar:


3

Ben futures-cpupool ile gidiyorum. Etkileşimlerimin engelleme özelliği nedeniyle en iyi çözümdür.

Actix_web :: web :: block kullanmak yeterince iyi, ancak actix içinde paylaşılan bir iş parçacığı havuzu kullanacaktır (ve kullandığım engelleme çağrıları nedeniyle bu tüm iş parçacığı havuzunu engelleyebilir ve actix_web'e verilen diğer görevlere müdahale edebilir).

Sadece veritabanı etkileşimleri için veritabanı başına ayrı bir iş parçacığı oluşturmak için futures-cpupool kullanmak daha iyidir. Bu şekilde, birbirlerini beklemesi gereken tüm görevleri (bağlantılardan daha fazla görev olduğunda) tek bir havuzda gruplandırır, bağlantı gerektirmeyen diğer görevleri engellemelerini engeller ve iş parçacığı sayısını bağlantı sayısı (böylece görev yalnızca engellenmeyecek şekilde zamanlanacaktır).

Yalnızca bir veritabanı bağlantısı (veya çok az) kullanmak istediğinizde senkronizasyon aktörü oldukça iyi bir seçenektir. Tek bir iş parçacığı ile bir futures-cpupool gibi davranacak ve tüm görevlerin birer birer çalışmasını sağlayacak, ancak actix-web'in temel iş parçacıklarından birini ayrı bir iş yerine kullanmak zorunda kalacak (bu nedenle, sadece çok az bağlantı için iyi) . Bununla birlikte, kazan plakası buna değemeyecek kadar büyük buluyorum.


6
Yukarıda bulgularımı okuma alakalı lütfen koymak bilgi - cevap içinde cevap değil soru.
Shepmaster
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.