[英]How to design a distributed node.js web server
假設我需要實現一個具有大量並發用戶的Web應用程序。 我決定使用node.js,因為它可以很好地擴展,具有良好的性能,開源社區等。然后,為了避免瓶頸,因為在同一事件循環中可能有成千上萬的用戶,所以我決定使用進程以利用多核CPU。 此外,我有3台計算機(主+ 2台),因為我需要使用Cassandra操縱大數據。 太棒了,這意味着我有3 * n個node.js進程,其中n是cpu的內核數(機器是相同的)。
好的,然后開始研究,並以以下模式結束:
如果我是正確的,則將單個http請求轉發到單個node.js進程。
創建會話非常正常,對嗎? 會話只是一個映射,此映射是一個Object,並且此Object存在於node.js進程中。 Haproxy將使用輪詢調度程序進行配置,因此可以將同一用戶轉發到不同的node.js進程。 如何在所有node.js進程之間共享同一會話對象? 如何共享全局對象(包括在同一台計算機(node.js群集)中並通過網絡)? 我應該如何使用node.js設計一個分布式Web應用程序? 是否有任何可簡化同步任務的模塊?
您可以使用memcache或redis存儲會話對象。 這對於重新啟動節點進程非常有用(如果會話數據存儲在進程的內存中,它將丟失)。
您也可以檢查pm2功能列表,也許其中一些對您有用。
構建微服務架構將具有良好的可伸縮性。
正如Ivan指出的那樣,您將會話對象存儲在內存緩存或Redis甚至Couchbase(內存緩存桶)中。 我還想補充一點,如果您要構建可伸縮的系統,則您的目標應該是構建一種可以線性擴展以根據需求增加吞吐量的系統。 我的意思是,您應該能夠隨時(最好在高峰期)將更多主機添加到基礎架構中的不同層,以處理需求。
因此,在開發過程中,必須謹慎選擇采用的技術和做出的設計決策。
假設我需要實現一個具有大量並發用戶的Web應用程序。
我想補充一件事,如果您無法衡量它,就無法管理它。 一個良好的開端將定義“大量並發用戶”對您意味着什么? 那是數量或並發性的facebook或whatsApp類型嗎? 首先,通過與您的涉眾(如果有)合作來定義這些內容,然后您就可以開始制定設計決策和選擇技術。
在構建可擴展系統時,一個好的試題是問自己:“是否有單點故障?” 如果是,那么您的系統將無法擴展。
正如另一位用戶建議的; 使用Redis是解決此問題的完全可接受的解決方案。
它的缺點是使用服務來存儲會話對象,並讓中間件處理其他所有事情。 如前所述,在節點進程重新啟動,崩潰等情況下很有用。將會話數據存儲在節點進程中會帶來風險。 使用微服務(如Redis)的好處之一是可以降低這些風險。
假設您將Express
用於中間件,則可以使用稱為Session store
東西。 有很多模塊可以利用此功能。
這樣的模塊之一就是connect-redis
像往常一樣安裝很容易:
npm install connect-redis express-session
然后,您將像這樣使用它:
var session = require('express-session')
var RedisStore = require('connect-redis')(session)
app.use(session({
store: new RedisStore(options),
secret: 'keyboard cat'
}))
現在,您可以像平常一樣使用會話對象。 (要求req.session
)
例子:
要設置會話信息(例如,從POST表單):
req.session.email = req.body.email
要檢索會話信息:
console.log( req.session.email )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.