Back to Question Center
0

Вэб апп-ийн анатоми: Би Clojure-д хэрхэн RedditLater-ийг хэрхэн байгуулав            Вэб апп-ийн анатоми: Би яаж RedditLater-г хэрхэн барьсан бэ?

1 answers:
Вэб апп-ийн анатоми: Clojure дахь RedditLater-г хэрхэн барьсан бэ

Өнгөрсөн жил хүмүүсийг Реддит руу шууд хуваарьт оруулахыг зөвшөөрсөн. Энэ нь бага хэрэглээтэй; Өдөрт цөөн тооны жуулчид, тэдгээрийн зарим хэсгийг нь хуваарьтай хуваарьладаг. Энэ өгүүлэлд би Semalt хэрхэн ажилладаг талаар бичнэ, яагаад би зарим шийдвэрүүдийг гаргасан юм - commercial appraiser.

Архитектур

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

RedditLater нь вэб серверийн дэргэд ажиллаж байгаа Reddit-д зориулагдсан бичлэгүүдийн дарааллыг хянахад тусдаа ажилчны утас дээр ээрч ажиллана. Ажилчдын thread нь дарааллын дарааллуудын жагсаалтаар орж тэдгээрийг хуваарь < одоо хаана олохыг зааж өгдөг.

RedditLater нь Clojure ашиглан бичигдсэн. Би тэр үед Clojure-г сонгож авсан. Би одоо болтол байсан, гэхдээ би ч бас байсан. Гэхдээ эргэж харахад энэ нь зөв шийдвэр байсан гэж хэлж болно. Clojure нь энгийн, ажиллагаатай хэлийг хос хэлээр ярих боломжтой. Энэ бол зүгээр л нэг зүйл биш, харин Heroku-тэй нэгдүгээр зэрэглэлийн дэмжлэг үзүүлэхэд хангалттай алдартай. RedditLater нь Clojure нь нэг Heroku жишээн дээр зэрэгцээ даалгаваруудыг ажиллуулахад хялбар байх давтамж дээр тулгуурладаг, ялангуяа Semalt номын сан болон түүний маш сайн дарааллын бүтцүүд дээр тулгуурладаг.

Итгэл үнэмшилтэй байхын тулд бичлэг, хэрэглэгчийн нэвтрэх мэдээллийг MongoHQ дээр байршуулсан MongoHQ мэдээллийн санд хадгалдаг бөгөөд энэ нь Heroku-тай сайн тоглодог. Би Mongo-г ашигладаг тул апп нь өгөгдлийн санг эрчимтэй ашигладаггүй учир Mongo-г ашиглахад хялбар байдаг.

(Би та бүхэн хаана хэрэглэх талаар шийдвэр гаргах хүртэл хэрэглэдэг өгөгдлийг Семаль гэж би бодсон.)

Тойм

Аппликэйшн нь агностик модулиудаар тусгаарлагдах функцийг хэдэн битээс шаарддаг. Гол функцийг хүсэлт гаргагч болон ажилтан хоёрын хооронд хувааж болно. Хүсэлт гаргагч нь хэрэглэгчийн оролтыг хүлээн авч, програмын UI болон урд хэсэг юм. Ажилчид Рэддит рүү илгээж байгаа зүйлсээ анхааралтайгаар хийдэг.

Хүсэлт гаргагч

Хэрэглэгчийн нэвтрэн орж, цагийн хуваарийг тавьдаг ажлын ердийн урсгалаар вебийн ажилчдаас хийх даалгаврын тойм:

  • URL-ээр дамжуулагдсан загварыг дамжуулж үйлчил
  • Reddit-ийн OAuth дэмжлэгтэйгээр хэрэглэгчийг баталгаажуулах
  • Ирээдүйн Reddit API дуудлага хийхэд хэрэглэгчийн баталгаажуулалтын итгэмжлэлүүдийг хадгалах
  • Таны хүссэн шуудангийн хаягийг (хуваарьт хугацааг оруулаад) mongo
  • Илгээх бичлэгийн ажилтаны дараалалд оруулах

Хүсэлт гаргагч нь Ring library, Clojure вэб аппликейшнүүдийн de-facto стандарт, Compojure handling routing ашиглан Enlive загварыг үзүүлэх. Мөн би UI-г гадагшлуулж, HTML загварыг үүсгэхийн тулд Semalt-ийг ашиглав.

Энд маш сонирхолтой зүйл байхгүй, зөвхөн хөгжүүлэгчид ямар нэгэн холбоотой байж болох үнэхээр ертөнцийн зарим нэгэн адил Clojure-тэй тэнцүү юм. Илүү сонирхолтой хэсэг бол шуудангийн дараалал юм. Clojure-г ашиглах нэг давуу тал нь таны хүсэлт хүлээн авах машиныг эхлүүлэхэд хялбар бөгөөд тоглогч юм. Энэ нь Clojure-ийн давталт thread-based (процесс) байдаг бол Semalt, Ruby, PHP зэрэг олон процессууд ашигладаг.

Газар нутаг, улс орон Ёс заншил

Ажилчдын тал дээр нөхцөл байдал илүү хялбар байдаг:

  • дарааллаас шуудан авах.
  • Энэ бичлэгийг илгээх цаг болсныг шалгана уу.
    • Хэрэв үгүй ​​бол дарааллын төгсгөлд байрыг тавь.
    • Хэрэв тийм бол шуудангаар оролдоно уу. Хэрэв оролдлого амжилтгүй болбол дараалалд буцааж оруулна уу.
  • Давтах.

Энэ бүхэн хэрхэн харагддагийг тэмдэглэе:

(Syntax праймер: mygfunction (x, y) нь Clojure-д (myfunction x y)

    ; Дарааллын дарааллыг тодорхойлно(дараалал-дараалал-дараалал (ламина / дараалал))(Enqueue-post-г арилгах"Шуудангийн дараалалд байршуул."[шуудан](Ламина / дараагийн дарааллын дараахан)(цаг хугацаа хүртэл гаргах?"Одоо цагийн хуваарь байна уу?"[шуудан](> = (шуудан авах: хуваарь) (туслагч / одоо)))(үйл явцын бичлэгийг арилгах"Дараалалд байгаа бичлэгийг дарж, хэрэв бичлэгээ оруулах цаг боллоо гэхэд үүнийг бөглөх хэрэгтэй.[](дараалал [дараалсан-дараалал] -ийг байрлуул.) Шуудан дараалалд байгаа бичлэгийг блокло(хэрэв (шуудан-шуудангаар оруулах)(reddit-api / шуудангаар илгээх); Хэрэв тийм бол шуудангийн хаягийг reddit-api модулиар илгээнэ үү(enqueue-post post))); Үгүй бол дараалалд оруулах бичлэгийг нэмнэ үү(Утас / унтах 1000.); Секундын турш унтах;; Анхлан эхэлж дууддаг(эхлэх ажилчин [](doall (дахин дахин боловсруулах процесс))     

Хэрвээ та хаалтуудыг даван туулж чадвал Python (Celery) эсвэл Ruby (Resque) зэрэг хэл дээр шийдлүүдтэй харьцуулахад энэхүү процессийг хэрхэн хялбаршуулж байгааг харж болно. Эдгээр хоёулаа өөр нэг процессыг ажиллуулах (өөрөөр хэлбэл сар бүр 30 доллар, Heroku дээр), мөн API-ийн хувьд тийм ч хялбар биш юм.

Мэдээжийн хэрэг, энэ архитектурыг олон серверт түвэгшүүлж байгаа бол дарааллын дараалал нь нэг төрлийн sharding хийхийг шаарддаг. Гэхдээ энэ арга нь боловсруулалтыг түгээхэд шаардлагатай болсоноосоо өмнө нэг сервер дээр босоо байрлалтай байх болно. Цөмийг бүгдийг нь түгжиж байгаа тул дараалал түгжигдэхийн тулд ямар ч шалтгаан байхгүй ч серверээс та хүссэнээрээ олон тооны ажилчдын thread-ыг эхлүүлэх боломжгүй гэсэн үг юм.

Дүгнэлт

Энэ бүхэн тэнд байна! Эдгээр энгийн хэрэгслүүдийг ашиглахдаа RedditLater нь жил гаруй (заримдаа алдааны засвартай) аз жаргалтай, тасралтгүй ажиллаж байна. Мэдээжийн хэрэг иймэрхүү загварыг гаргах өөр олон арга бий. Гэхдээ би сонгосон дизайн болон хэрэгслээсээ өнөөдөр бага зэрэг сурч мэдэж байна гэж найдаж байна. Semalt хэрхэн ажилладаг талаар илүү дэлгэрэнгүйг доороос үзнэ үү.

March 7, 2018