Тархсан програмуудын барилгын блокууд. Ойролцоогоор тэг

Тархсан програмуудын барилгын блокууд. Ойролцоогоор тэг

Дэлхий зогсохгүй байна. Хөгжил дэвшил нь технологийн шинэ сорилтуудыг бий болгодог. Өөрчлөгдөж буй шаардлагын дагуу мэдээллийн системийн архитектур өөрчлөгдөх ёстой. Өнөөдөр бид үйл явдалд тулгуурласан архитектур, конкурренци, конкурренци, асинхронизм, энэ бүхэнтэй хэрхэн тайван амьдрах талаар Эрлангийн тухай ярих болно.

Танилцуулга

Зохион бүтээгдсэн системийн хэмжээ, түүнд тавигдах шаардлагаас хамааран хөгжүүлэгчид бид системд мэдээлэл солилцох аргыг сонгодог. Ихэнх тохиолдолд үйлчилгээний харилцан үйлчлэлийг зохион байгуулахын тулд ажлын сонголт нь брокерын схем байж болно, жишээлбэл, RabbitMQ эсвэл kafka дээр суурилсан. Гэхдээ заримдаа үйл явдлын урсгал, SLA болон систем дээрх хяналтын түвшин нь бэлэн зурвас илгээх нь бидэнд тохиромжгүй байдаг. Мэдээжийн хэрэг, та тээврийн давхарга, кластер үүсэх, жишээлбэл ZeroMQ эсвэл nanomsg ашиглан хариуцлага хүлээх замаар системийг бага зэрэг төвөгтэй болгож чадна. Гэхдээ хэрэв систем нь стандарт Erlang кластерын хангалттай хүчин чадал, чадвартай бол нэмэлт нэгжийг нэвтрүүлэх асуудал нь нарийвчилсан судалгаа, эдийн засгийн үндэслэл шаарддаг.

Реактив тархсан хэрэглээний сэдэв нь нэлээд өргөн юм. Өгүүллийн форматыг хадгалахын тулд өнөөдрийн хэлэлцүүлгийн сэдэв нь зөвхөн Erlang/Elixir дээр баригдсан нэгэн төрлийн орчин байх болно. Erlang/OTP экосистем нь хамгийн бага хүчин чармайлтаар реактив архитектурыг хэрэгжүүлэх боломжийг олгодог. Гэхдээ ямар ч тохиолдолд бидэнд мессежийн давхарга хэрэгтэй болно.

Онолын үндэслэл

Дизайн нь зорилго, хязгаарлалтыг тодорхойлохоос эхэлдэг. Гол зорилго нь хөгжлийн төлөө хөгжлийн талбарт биш. Бид аюулгүй, өргөтгөх боломжтой хэрэгсэл олж авах хэрэгтэй бөгөөд үүний үндсэн дээр бид янз бүрийн түвшний орчин үеийн програмуудыг бий болгож, хамгийн чухал нь: жижиг үзэгчдэд үйлчлэх нэг серверийн програмуудаас эхлээд дараа нь 50 хүртэлх кластер болж хөгжих боломжтой. -60 зангилаа, кластерын холбоогоор төгсдөг. Тиймээс эцсийн системийг хөгжүүлэх, өмчлөх зардлыг бууруулж ашгийг нэмэгдүүлэх нь гол зорилго юм.

Эцсийн системд тавигдах 4 үндсэн шаардлагыг онцолж үзье.

  • Сүйл явдалд чиглэсэн.
    Систем нь үйл явдлын урсгалыг даван туулж, шаардлагатай үйлдлүүдийг хийхэд үргэлж бэлэн байдаг;
  • Мөргөтгөх чадвар.
    Тусдаа блокуудыг босоо болон хэвтээ байдлаар томруулж болно. Бүхэл бүтэн систем нь хязгааргүй хэвтээ өсөлттэй байх ёстой;
  • Оалдааг тэсвэрлэх чадвар.
    Бүх түвшний болон бүх үйлчилгээ нь бүтэлгүйтлээс автоматаар сэргэх боломжтой байх ёстой;
  • Гбаталгаатай хариу өгөх хугацаа.
    Цаг хугацаа үнэ цэнэтэй бөгөөд хэрэглэгчид хэтэрхий удаан хүлээх ёсгүй.

"Чаддаг бяцхан хөдөлгүүр" хэмээх эртний үлгэрийг санаж байна уу? Зохион бүтээгдсэн систем нь прототипийн шатнаас амжилттай гарч, дэвшилттэй байхын тулд түүний суурь нь хамгийн бага шаардлагыг хангасан байх ёстой. УТААГ.

Дэд бүтцийн хэрэгсэл, бүх үйлчилгээний үндэс болох зурваст дахин нэг цэг нэмж оруулав: програмистуудад ашиглахад хялбар.

Үйл явдалд чиглэсэн

Програм нь нэг серверээс кластерт шилжихийн тулд түүний архитектур нь сул холболтыг дэмжих ёстой. Асинхрон загвар нь энэ шаардлагыг хангадаг. Үүнд илгээгч болон хүлээн авагч нь мессежийн мэдээллийн ачаалалд санаа тавьж, систем дотор дамжуулах, чиглүүлэх талаар санаа зовох хэрэггүй.

Өргөтгөх чадвар

Өргөтгөх чадвар, системийн үр ашиг нь бие биентэйгээ зэрэгцэн оршдог. Хэрэглээний бүрэлдэхүүн хэсгүүд нь боломжтой бүх нөөцийг ашиглах чадвартай байх ёстой. Бид хүчин чадлыг илүү үр ашигтай ашиглаж, боловсруулах аргуудаа илүү оновчтой болгох тусам бид тоног төхөөрөмжид бага мөнгө зарцуулдаг.

Нэг машин дотор Эрланг маш их өрсөлдөөнтэй орчинг бүрдүүлдэг. Зэрэгцээ болон параллелизмын тэнцвэрийг Erlang VM-д ашиглах боломжтой үйлдлийн системийн хэлхээний тоо болон эдгээр хэлхээг ашигладаг төлөвлөгчийн тоог сонгох замаар тохируулж болно.
Erlang процессууд нь төлөвийг хуваалцдаггүй бөгөөд блоклохгүй горимд ажилладаг. Энэ нь уламжлалт хаалтад суурилсан програмуудаас харьцангуй бага хоцрогдолтой, илүү өндөр дамжуулах чадварыг хангадаг. Erlang-ийн хуваарьлагч нь CPU болон IO-ийн шударга хуваарилалтыг баталгаажуулдаг бөгөөд блоклохгүй байх нь програмыг ачаалал ихтэй үед ч гэсэн хариу өгөх боломжийг олгодог.

Кластерийн түвшинд устгалын асуудал бас бий. Кластерт байгаа бүх машинууд жигд ачаалалтай байх нь чухал бөгөөд сүлжээнд хэт ачаалал өгөхгүй байх нь чухал юм. Нөхцөл байдлыг төсөөлөөд үз дээ: хэрэглэгчийн траффик нь ирж буй тэнцвэржүүлэгчид (haproxy, nginx гэх мэт) бууж, тэдгээр нь боловсруулах хүсэлтийг боломжтой backends багцын хооронд аль болох жигд хуваарилдаг. Хэрэглээний дэд бүтцийн хүрээнд шаардлагатай интерфэйсийг хэрэгжүүлж буй үйлчилгээ нь зөвхөн сүүлчийн миль бөгөөд анхны хүсэлтэд хариу өгөхийн тулд өөр хэд хэдэн үйлчилгээнд хүсэлт гаргах шаардлагатай болно. Дотоод хүсэлтүүд нь чиглүүлэлт ба тэнцвэржүүлэхийг шаарддаг.
Мэдээллийн урсгалыг үр дүнтэй удирдахын тулд мессеж нь хөгжүүлэгчдэд чиглүүлэлт болон ачааллын тэнцвэрийг удирдах интерфейсээр хангах ёстой. Үүний ачаар хөгжүүлэгчид микро үйлчилгээний загваруудыг (агрегатор, прокси, сүлжээ, салбар гэх мэт) ашиглан стандарт болон ховор тохиолддог асуудлуудыг шийдвэрлэх боломжтой болно.

Бизнесийн үүднээс авч үзвэл өргөтгөх чадвар нь эрсдэлийн удирдлагын арга хэрэгслийн нэг юм. Хамгийн гол нь тоног төхөөрөмжийг оновчтой ашиглах замаар хэрэглэгчийн хүсэлтийг хангах явдал юм.

  • Ахиц дэвшлийн үр дүнд тоног төхөөрөмжийн хүчин чадал нэмэгдэхэд. Энэ нь төгс бус програм хангамжийн улмаас сул зогсохгүй. Erlang нь босоо чиглэлд сайн хэмжигддэг бөгөөд CPU-ийн бүх цөм болон боломжтой санах ойг үргэлж ашиглах боломжтой;
  • Үүлэн орчинд бид одоогийн болон урьдчилан тооцоолсон ачааллаас хамааран тоног төхөөрөмжийн хэмжээг удирдаж, SLA-г баталгаажуулж чадна.

алдааг тэсвэрлэх чадвар

"Бүтэлгүйтэл нь хүлээн зөвшөөрөгдөхгүй" ба "Бүтэлгүйтэл үргэлж байх болно" гэсэн хоёр аксиомыг авч үзье. Бизнесийн хувьд програм хангамжийн доголдол нь мөнгө алдах, хамгийн муу нь нэр хүндээ алдах гэсэн үг юм. Боломжит алдагдал болон алдааг тэсвэрлэх чадвартай програм хангамжийг хөгжүүлэх зардлыг тэнцвэржүүлж, буулт хийх нь ихэвчлэн олддог.

Богино хугацаанд, алдааг тэсвэрлэх чадварыг агуулсан архитектур нь бэлэн кластерийн шийдлүүдийг худалдан авахад мөнгө хэмнэдэг. Тэд үнэтэй бөгөөд алдаа дутагдалтай байдаг.
Урт хугацаанд, алдааг тэсвэрлэх чадвартай архитектур нь хөгжлийн бүх үе шатанд хэд хэдэн удаа төлбөрөө төлдөг.
Кодын суурь доторх мессеж нь хөгжлийн үе шатанд системийн бүрэлдэхүүн хэсгүүдийн харилцан үйлчлэлийг нарийвчлан боловсруулах боломжийг олгодог. Энэ нь бүх чухал бүрэлдэхүүн хэсгүүд нь бүтэлгүйтлийг зохицуулж, бүтэлгүйтлийн дараа хэрхэн автоматаар хэвийн байдалдаа орохыг мэддэг тул энэ нь бүтэлгүйтэлд хариу өгөх, удирдах ажлыг хялбаршуулдаг.

Хариуцлагатай байдал

Алдаа гарсан эсэхээс үл хамааран програм нь хүсэлтэд хариу өгч, SLA-д нийцсэн байх ёстой. Бодит байдал нь хүмүүс хүлээхийг хүсэхгүй байгаа тул бизнесүүд үүнд дасан зохицох ёстой. Илүү олон програмууд өндөр мэдрэмжтэй байх төлөвтэй байна.
Хариуцлагатай програмууд нь бодит цаг хугацаанд ажилладаг. Erlang VM нь зөөлөн бодит цагийн горимд ажилладаг. Хувьцааны арилжаа, эм тариа, үйлдвэрлэлийн тоног төхөөрөмжийн хяналт зэрэг зарим салбарт бодит цагийн хатуу горим чухал байдаг.
Хариуцлагатай систем нь UX-г сайжруулж, бизнест ашиг тусаа өгдөг.

Урьдчилсан тойм

Энэ нийтлэлийг төлөвлөхдөө би мессежийн брокер бий болгож, түүн дээр суурилсан нарийн төвөгтэй системийг бий болгох туршлагаа хуваалцахыг хүссэн. Гэхдээ онолын болон урам зоригийн хэсэг нь нэлээд өргөн хүрээтэй болсон.
Өгүүллийн хоёр дахь хэсэгт би солилцооны цэгүүдийг хэрэгжүүлэх нюансууд, мессежийн загвар, тэдгээрийн хэрэглээний талаар ярих болно.
Гурав дахь хэсэгт бид үйлчилгээг зохион байгуулах, чиглүүлэх, тэнцвэржүүлэх ерөнхий асуудлуудыг авч үзэх болно. Системийн өргөтгөх чадвар, алдааг тэсвэрлэх чадварын практик талын талаар ярилцъя.

Эхний хэсгийн төгсгөл.

Фото зураг @lucabravo.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх