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::block
benim 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.
futures-cpupool
Dizel'dekiasync
destek eksikliği için önerilen geçici çözüm olduğu anlaşılıyor .