Elixir GenServer vs vs cast

GenServer.call shunchaki javobni qaytarish uchun emas

Men Elixir-dan foydalanib, yangi tanish bo'lgan do'stim bilan yonma-yon ishlayapman. U bir necha funktsional dasturlash tajribasiga ega, ammo Erlang / Elixir aktyor modelidan foydalanmaydi. Ba'zan BEAM VM va uning moslashuvchanlik qobiliyatlari to'g'risida ko'p eshitgan bo'lsangiz ham, bu dunyoda bitta aktyor faqat bitta narsani bitta vaqtda qila olishini tushuntirish ba'zida qiyin bo'lgan. Haqiqat shundaki, ko'p narsalarni bajarish uchun ko'p aktyorlar kerak.

Bir oz GenServer-da qo'ng'iroq va qo'ng'iroq tushunchalari bu bilan bog'liq. Bir qarashda OTP asoslari bilan tizimni yaratishda quyidagilar haqida fikr yuritish oson:

Bu hujjatlarda aytilishicha, bu asinxrondir. Bunday vaziyatda menga javob kerak emasligi sababli, qo'ng'iroq qo'ng'iroqdan ko'ra yaxshiroq bo'ladi. Asenkron kod ajoyib ko'rinadi. Sinxron kod yoqimli emas. Men salqin bo‘lishni xohlayman.

Afsuski, aktyorning ustunligi yoki ustunligi haqidagi g'oyangiz miqyosni kengaytirganda yomon muammoga aylanishi mumkin. Men har doim qo'ng'iroqni boshlashim xavfsizroq ekanligini aniqladim, bu menga og'ir ish yuklamalarini tizimlarimning ortiqcha yuklamasligi haqida qayg'urmasdan tezroq ishlashga imkon beradi. Aytganingizdek, to'g'ri stsenariyda kastingdan foydalanish juda yaxshi. Ammo, agar sizning ish yukingiz sezilarli darajada tebranishga qodir bo'lsa va vaqti-vaqti bilan tezlashishi mumkin bo'lsa, mijozlarni tizimingizning ortiqcha qismlarini ortiqcha yuklamasliklari uchun qo'ng'iroq yoki boshqa bosim usulidan foydalanib, narsalarni nazorat ostiga olish yaxshiroqdir.

Ikkilik lang veb-saytidagi rasmiy o'quv qo'llanmasida xuddi shu mavzu bo'yicha kichik bo'lim mavjud, uni bu erda topish mumkin. Qo'ng'iroqni ishlatish to'g'risida, hujjatlashtirish:

Bu (qo'ng'iroq) odatiy tanlov bo'lishi kerak, chunki server javobini kutish foydali bosish mexanizmidir.

TLDR; Qo'ng'iroq va qo'ng'iroq o'rtasidagi qaror faqatgina javob kerak yoki kerak emasligini aniqlashdan iborat. Shubha tug'ilganda, qo'ng'iroq qiling.

Umid qilamanki, pastdagi ahmoqona taqqoslash bu masalaga biroz ziyon keltiradi.

Bu Bob. Bob GenServer.

Bob haqiqatan ham kichkina dunyosida ikkita narsani yaxshi ko'radi.

U uy ishlarini bajarishdan va yangi ishlarni qilish uchun pochta qutisini tekshirishdan zavqlanadi.

Bobning bitta asosiy vazifasi idish-tovoq tayyorlashda juda yaxshi.

Salom. Mening ismim Bob va men uy ishlarini yaxshi ko'raman!

Bu Maryam. Maryam uy ishlarini qilishni yaxshi ko'rmaydi.

U idish-tovoq qilishni yoqtirmaydi.

Maryamning boshqa ko'plab muammolari bor va u iflos idishlarini tushirishni qidirmoqda. U Bob va uning asosiy xizmati haqida eshitgan.

Men uy ishlarini bajarishni yoqtirmayman. Ayniqsa idish-tovoq!

Meri har safar ovqat tayyorlashga muhtoj bo'lganda, u Bobning asosiy xizmat qutisiga xabar yuboradi.

U qo'ng'iroq orqali Bobga xabar yuboradi, bu esa Bobga Maryam ish tugashi bilan xabar kutishini xabardor qiladi.

Endi Meri o'tiradi va Bobning javobini kutadi. Maryam bu plastinka tozalaguncha boshqa ish qila olmaydi.

GenServer.call (bob, {: do_dishes,: plate})

Bob unga idish yuvishni buyurishi haqidagi xabarni eshitgach, darhol ishga kirishadi.

Shu paytgacha u pochta qutisida idishlarni yuvish imkoniyatini kutayotgan edi.

U, albatta, buni juda yaxshi ko'radi.

U yuvinmaguncha boshqa hech narsa qilmaydi.

Men diqqat markazida bo'lishni yaxshi ko'raman.

Agar u Maryam uchun idish-tovoq qilayotganda Bobning pochta qutisiga yangi qiyin xabar kelsa, u yuvinib bo'lguncha kutish kerak bo'ladi.

Bobning asosiy operatsiyalarini kengaytirishning yagona haqiqiy usuli bu o'zi kabi ko'plab odamlarni yollash. Ammo hozircha u ish yukini yaxshi bajarmoqda.

Meri hozirda uning yagona mijozidir.

Men faqat oddiy g'or odamiman. Bu erda ko'p vazifa yo'q.

Bob Maryam uchun qiyin ishlarni tugatgandan so'ng, u pochta qutisiga bu amalga oshganligi haqida xabar yuboradi. Buning sababi, u qo'ng'iroq orqali xabar yuborgan. Bu Bobga Maryamga javob berishini aytadi.

Maryam taom tayyorlanishini bilgach, kunini davom ettirishi mumkin. Qo'ng'iroq Meri boshqa ishlarni bajarishga, shu jumladan Bobga qo'shimcha ishlarni bajarishga xalaqit beradi.

Yuvish uchun bitta ozgina taom. Bob idish-tovoqlarni juda yaxshi bilganidan xursandman. Ammo men Bob ularni yuvayotgan paytda unchalik samarali emasman.

Bob juda yaxshi idish yuvish mashinasidir va Meri uning xizmatidan foydalanishni juda yaxshi ko'radi, ammo kunlar borki, idish-tovoqlar juda katta.

Maryamning o'z ishi bor va u o'z ishiga kirishdan oldin Bobning har bir taomni tugatishini kutishga qiynalmaydi.

U haqiqatan ham Bobga ko'p narsalarni yuvishni va hali ham o'z ishini bajarishga qodirligini aytishi kerak. U o'z hayotini osonlashtirish uchun aktyorlik xabarlarini Bobga yuborishi mumkin.

Bu Maryamga Bob idish-tovoq yuvayotganda boshqa narsalarga o'tishga imkon beradi.

Tomosha faqat Maryam uchun to'siq emas. Idishlarni yuvishda Bobni hali ham to'xtatib bo'lmaydi.

GenServer.cast (bob, {: do_dishes,: vilkalar})

Bob hali ham pochta qutisidagi xabarlarni xuddi quyish paytida ishlatganidek qabul qiladi, lekin u har safar Maryamga idish toza ekanligini aytishdan bezovta qilmasligini biladi. U shunchaki ish tugagach, pochta qutisiga kiradi va yuvinish uchun ko'proq idishlar bor-yo'qligini tekshiradi.

Meri buni amalga oshirish uchun Bobga ishonadi va bir muncha vaqt ishlaydi.

Men bu idishlardan etarlicha ololmayman!

Meri bilan tanish bo'lmagan holda, Bob biroz qarzga botgan va uning do'stlari unga asosiy xizmat uchun qo'shimcha mijozlar yig'ishni taklif qilishgan.

Barcha yangi mijozlar qo'ng'iroqlar emas, translyatsiya orqali asosiy xabarlarni yuborishmoqda, ular Meri qilmaganidek, Bob tugaguncha kutishni istamaydilar.

Bitta masala shundaki, Bob ma'lum bir kunda bajarishi mumkin bo'lgan ishdan ko'proq ishlarni qabul qildi va ish yuki bo'shash belgisini ko'rsatmaydi.

Meri Bobning qiynalayotganini bilmaydi. U Bobga ishonadi. Meri Bobga asosiy xabarlarni yuborishda davom etmoqda.

Oh odam. Yuvish uchun 500 ta idishim bor va ular kelishni davom ettirishadi.

Bir-ikki kundan keyin Maryam Bobning idishlari tugaganidan g'azablana boshladi. U do'stlari bilan kechki ovqatni rejalashtirmoqda va vilkalar yo'q.

(Oddiy GenServer.call hozircha tugaydi, lekin men bilan da'vo qilish kerak)

Bob hanuzgacha kuniga 24 soat ishlaydi, lekin shunchaki xabarlarni qabul qilish tezligida ushlab turmaydi. U chindan ham qo'lidan kelganicha harakat qilmoqda, ammo bu mijozlari uchun ishlamaydi.

Meri umidsizlikdan Bobga vazifalarni yuborishni to'xtatadi.

O'ylaymanki, hozircha idish-tovoq yuvaman.

Bir necha kundan so'ng, Bob nihoyat ish yukiga tushadi.

U va uning mijozlari birlashadilar va ularning pasayishida hamma aybdorligini tushunadilar. Ularning barchasi ushbu vaziyatni hal qilishning eng yaxshi usuliga rozi bo'lishadi, hozir esa Bobga qo'ng'iroq orqali xabar yuborish va shunchaki har bir taom tayyor bo'lishini kutish kerak.

Ushbu usuldan foydalangan holda Bob o'zining barcha mijozlariga xizmat ko'rsatishi mumkin, ammo u, masalan, Maryam uchun idish yuvayotganida, u navbatga qo'shimcha ovqatlarni qo'sha olmaydi. Bu boshqa mijozlarga idish-tovoq yuvilganidan keyin yuvilishi uchun adolatli zarba beradi. Agar Maryamga boshqa idish yuvilishi kerak bo'lsa, u Bob hozirgi talabini bajargandan so'ng xabar yuborishi mumkin.

Shu tarzda o'ylab ko'ring. Agar Bobning kir yuvish xizmatidan foydalanishlari mumkin bo'lgan o'nta umumiy mijozlari bo'lsa va ularning barchasi Bob bilan o'zaro aloqada bo'lish chaqirig'iga ishonishsa - bu, cho'qqisida, Bobga haqiqatan ham to'qqiz yoki o'nta idishlarni yuvish uchun xabarlar yuborilishi mumkinligini aytadi. Buning sababi shundaki, mijoz Bobga qo'ng'iroqni yuborganidan so'ng, u Bob unga javob bermaguncha, boshqa hech narsa qila olmaydi. Agar biz uning o'rniga translyatsiyani ishlatgan bo'lsak, bu raqam VM sozlamalari imkon qadar ko'payishi mumkin va bu butun tizimni pasaytirishi mumkin.

Menda yuvish uchun navbatda cheklangan miqdordagi idishlar bor. Pokiza.

Hozir hamma hammadan xursand, ammo vaqti-vaqti bilan Maryam Bobni kutishdan qiynaladi, uning xabari pochta qutisida beshinchi o'rinni egallashi mumkin, chunki u boshqa mijozlar uchun ishlamoqda. Ammo, hech bo'lmaganda, hozir u idish-tovoqni bir necha soat yoki kun talab qilishdan ko'ra ko'proq vaqt ichida tozalashini kutish mumkinligini biladi.

Uzoq muddatli tuzatish bu Bobni o'z biznesida yordam berish uchun ba'zi do'stlarini yollashga undashdan iborat. Birgalikda ular ish yukiga yordam berish uchun nazorat daraxti bilan ishlashlari mumkin edi.

Agar Bob to'qqizta do'stini yollasa va o'nta mijozini ushlab tursa, u mijoz hech qachon idishlarini yuvishdan ko'ra ko'proq kutishga majbur bo'lishini biladi. Bu, ehtimol, uning mijozlarini xursand qiladi.

Bobning ahvoli hal bo'lganidan xursandman. Men ko'proq sabrli bo'lishni o'rgandim va yana Bobga ishonaman.Men shunday qila oladigan kichik dvigatelga o'xshayman. Bora-bora!