我有一個快速后端應用程式,它偵聽來自 Web 應用程式的 http 請求。此后端應用程式在 AWS ECS Fargate 上運行。
所以我的問題是,在這個后端應用程式中使用 Node.js 中的多執行緒、作業執行緒是否有意義?端點中有 CPU 密集型和非密集型功能。例如,我是否應該立即將任何傳入請求分發給其他執行緒,而不管呼叫的強度如何,這樣主執行緒就不會被阻塞?或者我應該只在密集型作業等上使用多執行緒嗎?
非常感謝有關此主題的任何建議,利弊。
uj5u.com熱心網友回復:
像這樣的問題最終只有通過在典型負載下分析系統才能真正得到回答。這是因為我們對 CPU 消耗量和消耗量的猜測很少非常好——這些東西必須經過測量才能真正知道。
也就是說,您可以考慮一些通用設計指南:
如果您有預先認為可能占用大量 CPU 的特定請求,那么您可能需要考慮將這些請求放入由執行緒池提供服務的佇列中。
如果您有事先相信的特定請求實際上只是在執行非阻塞 I/O,那么這些請求根本不需要通過執行緒來變得復雜。主執行緒可能可以很好地處理這些。
如果您的請求中只有一小部分是 CPU 密集型的,那么最簡單的設計可能是使用 nodejs 集群模塊,并讓它將您的請求分散到 CPU 中,并認為這本身(無需任何其他重大設計更改)將獲得任何主回圈之外的 CPU 系結請求。如果您的請求中有很大一部分是受 CPU 限制的,并且您希望優先處理非 CPU 請求以便它們始終快速,那么您可能會更好地使用 CPU 繁重請求傳遞到的執行緒池,這樣非-CPU 繁重的請求不會被他們阻止。
所以我的問題是,在這個后端應用程式中使用 Node.js 中的多執行緒、作業執行緒是否有意義?
是的,在某些情況下。但是,何時添加這個額外的復雜層實際上取決于您請求中 CPU 使用率的具體指標。
例如,我是否應該立即將任何傳入請求分發給其他執行緒,而不管呼叫的強度如何,這樣主執行緒就不會被阻塞?或者我應該只在密集型作業等上使用多執行緒嗎?
這取決于您希望如何確定不同請求的優先級。如果您希望請求按 FIFO 順序排列優先級,其中每個請求都根據到達的時間按順序啟動,而不管請求型別如何,那么是的,您可以將所有請求分配給執行緒。事實上,為此使用集群模塊可能更容易,因為它就是這樣做的。另一方面,如果您希望非 CPU 密集型請求始終快速運行并且不必在 CPU 密集型請求后面等待,那么您可能只想將 CPU 密集型請求推送到由 a 處理的佇列中執行緒池。這樣,主執行緒就可以立即處理非 CPU 密集型請求,而不管執行緒池中當前有多少 CPU 密集型請求正在處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513764.html
下一篇:核心程式中的執行緒鎖混淆
