Өндүрүмдүүлүк жана кластерлештирүү
Бир окуялар цикли ылдам, бирок ал баары бир бир процессордук ядро. Мына аларды бүт колдонуунун жолу.
- окуялар циклинин тар жерин түшүндүрүү жана процессор менен чектелген тапшырмаларды киргизүү-чыгаруу тапшырмаларынан айырмалоо;
- ар бир ядрого бир воркер породуп, угуучу портту бөлүшүү үчүн
clusterмодулун колдонуу; - кирүүчү туташуулар кантип бөлүштүрүлөрүн сүрөттөө (round-robin операциялык системага каршы);
cluster,worker_threadsжана горизонталдык масштабдоонун ортосунан тандоо;- өндүрүштүк процесстерди PM2 стилиндеги менеджердин астында токтоосуз кайра жүктөө менен иштетүү;
- жүктү бөлүштүрүү, жабышкак сессиялар жана воркерлер арасындагы жалпы абал жөнүндө ой жүгүртүү.
1. Окуялар циклинин тар жери
Сиз окуялар цикли эч качан киргизүү-чыгарууда бөгөттөлбөй бир агымды иш менен камсыз кыларын билесиз: базага суроо же файлды окуу жолдо турганда, цикл башка колбэктерди тейлейт. Бирок бир назик, бирок өтө маанилүү нюанс бар — сиздин JavaScript өзү баары бир бир агымда аткарылат. Реалдуу процессордук убакытты сарптаган каалаган колбэк (алп JSON'ду талдоо, чоң баа фактору менен сырсөздү хештөө, таза JS'те сүрөттүн өлчөмүн өзгөртүү, тыгыз сандык цикл) агымды туткунга алат. Ошол убакытта башка эч бир суроо тейлене албайт, эч бир таймер иштебейт жана эч бир киргизүү-чыгаруу колбэги аткарылбайт.
Дал ушул айырма Node'догу масштабдоо боюнча ар бир чечимди башкарат:
- Киргизүү-чыгаруу менен чектелген тапшырмалар (дискти, тармакты, базаны күтүү) — күтүүнү ОС аткарып жатканда цикл бош калат. Бир процесс миңдеген бир убактагы туташууну кубаныч менен тейлейт.
- Процессор менен чектелген тапшырмалар (агымды иш менен камсыз кылган эсептөөлөр) — цикл бөгөттөлгөн. Бир жай иштетүүчү башка бардык кардарларды тормоздойт, ал эми бир убактагы суроолордун санынын өсүшү кечигүүнү дагы да начарлатат.
Салыштыруу. Node процесси — бул бир, укмуштуудай ылдам официант. Меймандар ашканага (киргизүү-чыгаруу) күтүп турганда, официант көп үстөлдүн ортосунда буйрутма алып чуркайт. Бирок сиз ошол жалгыз официанттан 20 мүнөттүк тамакты өзү даярдоону сурасаңыз (процессордук иш), ал канчалык ылдам болбосун, бардык башка үстөлдөр күтөт. Муну официанттан ылдамыраак кыймылдоону суроо менен оңдоо мүмкүн эмес — көбүрөөк официант жалдоо керек. Дал ушул кластерлештирүү.
Процессор менен чектелген иштетүүчү өзүн гана жайлатпайт; ал баары үчүн окуялар циклинин кечигүүсүн шиширтет. Ошол кечигүүнү өлчөө (мисалы, perf_hooks.monitorEventLoopDelay() аркылуу) — өндүрүштө бөгөттөлгөн циклди аныктоонун стандарттык жолу.