π₯ Distributed Cache (Redis) video darslik
β Redis cacheβni qoβllash
β Docker-compose orqali appβni bir necha nusxasini ishga tushirish
Kodni manabu repoda: https://github.com/wahid-d/cache
π .NETchi tanishlar va yaqinlaringizga ulashing!
Kontent yoqayotgan boβlsa izohlarda keyingi video nima haqida boβlishini qoldiring.
@dotnetstuff
β Redis cacheβni qoβllash
β Docker-compose orqali appβni bir necha nusxasini ishga tushirish
Kodni manabu repoda: https://github.com/wahid-d/cache
π .NETchi tanishlar va yaqinlaringizga ulashing!
Kontent yoqayotgan boβlsa izohlarda keyingi video nima haqida boβlishini qoldiring.
@dotnetstuff
YouTube
Distributed Cache (Redis) | Caching in .NET | .NET Stuff
Bu galgi videoda Distributed Applicationlar uchun cache, Redis haqida o'rganamiz.
π6
.NET Stuff
Yuqoridagi kodga baxo bering. Uni qanday improve qilsa bo'ladi? P.S. Organization nomli entity mavjudmasligi sababli query yozishga majbursiz. Image updated
Yuqoridagi kodga juda ko'p yaxshi fikrlar qoldirildi.
Lekin men kutgan (yetkazib berolmagan) nuqta bu β
Shuning uchun yoki
Read here
@dotnetstuff
Lekin men kutgan (yetkazib berolmagan) nuqta bu β
.FromSqlRaw funksiyasi ishlatilganda `SQL Injection` havfi bor. Shuning uchun yoki
SqlParameter klasi orqali parametrlarni uzatish kerak. Yoki .FromSqlInterpolated funksiyasi ishlatish kerak.Read here
@dotnetstuff
Docs
SQL Queries - EF Core
Using SQL queries in Entity Framework Core
π11π1
Yaqin fursatlarda .NET'da bir ajoyib BOT qurilishini stream qilmoqchiman. Streamga qo'shiling. Suhbatlashib birgalashib quramiz!
π15π5π1
.NET Stuff
Ushbu koddagi xatoni toping. Koddagi meni shu darajada asabiylashtiradiki, buni yozganga meni ko'nglimda joy yo'q!
Yuqoridagi kodni xatosi hech qanday sintaks yoki logik xato emas.
Gap shundaki, method ichida
Tasavvur qiling siz shu methodni chaqirib false natija oldingiz. Endi siz fayl mavjud bo'lmagani uchun o'chirilmagandurda deb 200 (OK) qaytarasizmi yoki databasega bog'liq muammo bo'ldi deb 500(server error) qaytarasizmi? π€. Ishoning buning farqi yer π bilan osmoncha βοΈ.
Buni nomini Silent Error deyishadi va bu productionda disasterlarga sabab boladi.
#bundayqilmang
Gap shundaki, method ichida
try/catch bor ammo u exceptionni yutib yuboradi.Tasavvur qiling siz shu methodni chaqirib false natija oldingiz. Endi siz fayl mavjud bo'lmagani uchun o'chirilmagandurda deb 200 (OK) qaytarasizmi yoki databasega bog'liq muammo bo'ldi deb 500(server error) qaytarasizmi? π€. Ishoning buning farqi yer π bilan osmoncha βοΈ.
Buni nomini Silent Error deyishadi va bu productionda disasterlarga sabab boladi.
#bundayqilmang
π9
MassTransit, StateMachines, Hangfire, AzureFunctions, RabbitMQ kabi texnologiyalarni ishlatib ko'rganlar bormi?
O'rganishga qiziqadiganlarchi?
O'rganishga qiziqadiganlarchi?
π₯9π2
Hangfire + DistributedLock + DistributedCache
Kunda bir marta Business team uchun 24 soat ichida bo'lgan yangi transaksiyalarni analitikasini emailga jo'natib beradigan background service ustida ishlayotgan edim. Background Job uchun Hangfire Server ishlatyapman. Lekin yechimim optimalligi ustida uzoq o'ylaganim sari muammolar ko'payib boryapti.
1. Hangfire Service agar job fail bo'lsa (database, email client yoki shunga o'xshash exception tufayli) uni qayta navgatga qo'yadi va qayta ishga tushiradi. Buni o'ziga yarasha maummolari bor. Masalan, email jo'natib bo'lgandan keyin fail bo'lgan bo'lsa keyingi navbatda yana email yuboradi. Shuning uchun Hangfire maintainerlari re-entrancy degan maummo hal qilishni qattiq maslahat beradi. Ya'ni kodga kutilmaganda qayta kirib qolinsa nima qilish kerak.
Buni oldini olish uchun avval MemoryCachedan foydalandim. MemoryCache'ga Job boshlanganda yozib qo'yaman boshlanish vaqtini va unga expiration time beraman. Lekin yana muammoga duch keldim. MemoryCache thread-safe emas. Ya'ni Hangfire server bir nechta processlarni tengidan ishga tushirib run qiladi. Agar Job bir nechta processda tengidan ishga tushsa MemoryCache biz kutgan havfsizlikni berolmaydi.
2. DistributedLock ishlatish fikri keldi. DistributedLock sizga ma'lum resursni birdan ortiq protses ishlata olmasligini ta'minlab beradi. U orqali 100% ga bir vaqtda Jobning 2 ta nusxasi ishga tushmasligini taminlasa bo'ladi. Lekin bu ham meni muammolarimga to'liq yechim emas. Men Jobni 24 soatda bir marta aynan UTC 23:00 da ishga tushishini taminlashim kerak. Lock esa bunga mo'ljallanmagan. U ayni vaqtda 2 ta job ishga tushmasligini ta'minlaydi holos.
3. DistributedLock + DistributedCache yechimiga to'xtaldim. Bunda DistributedLock orqali bir vaqtni faqat bitta job ishlashini ta'minlayman. DistributedCache esa shu 24 soat ichida Job ishga tushganmi yo'qligi haqida ma'lumotni saqlab turadi. Masalan, Job ishga tushganda DistributedCache ga "IshgaTushdi=true" deb yozib qo'yaman va AbsoluteExpiration = Next(22:59:59) deb belgilayman. Job keyingi marta ishga tushayotganda DistributedCachedan shu entry bormi yo'qmi tekshiraman. Agar bor bo'lsa, demak bugun email jo'natgan bo'lamiz.
PS: MemoryCache dan DistributedCache ga o'tganimga sabab HangfireServer scale qilamiz, ya'ni bir nechta server nusxasi tengdanigna ishga tushirilishi mumkin. Bunday Scaled holatlar uchun MemoryCache ishlatish kategoricheskiy mumkin emas.
Kunda bir marta Business team uchun 24 soat ichida bo'lgan yangi transaksiyalarni analitikasini emailga jo'natib beradigan background service ustida ishlayotgan edim. Background Job uchun Hangfire Server ishlatyapman. Lekin yechimim optimalligi ustida uzoq o'ylaganim sari muammolar ko'payib boryapti.
1. Hangfire Service agar job fail bo'lsa (database, email client yoki shunga o'xshash exception tufayli) uni qayta navgatga qo'yadi va qayta ishga tushiradi. Buni o'ziga yarasha maummolari bor. Masalan, email jo'natib bo'lgandan keyin fail bo'lgan bo'lsa keyingi navbatda yana email yuboradi. Shuning uchun Hangfire maintainerlari re-entrancy degan maummo hal qilishni qattiq maslahat beradi. Ya'ni kodga kutilmaganda qayta kirib qolinsa nima qilish kerak.
Buni oldini olish uchun avval MemoryCachedan foydalandim. MemoryCache'ga Job boshlanganda yozib qo'yaman boshlanish vaqtini va unga expiration time beraman. Lekin yana muammoga duch keldim. MemoryCache thread-safe emas. Ya'ni Hangfire server bir nechta processlarni tengidan ishga tushirib run qiladi. Agar Job bir nechta processda tengidan ishga tushsa MemoryCache biz kutgan havfsizlikni berolmaydi.
2. DistributedLock ishlatish fikri keldi. DistributedLock sizga ma'lum resursni birdan ortiq protses ishlata olmasligini ta'minlab beradi. U orqali 100% ga bir vaqtda Jobning 2 ta nusxasi ishga tushmasligini taminlasa bo'ladi. Lekin bu ham meni muammolarimga to'liq yechim emas. Men Jobni 24 soatda bir marta aynan UTC 23:00 da ishga tushishini taminlashim kerak. Lock esa bunga mo'ljallanmagan. U ayni vaqtda 2 ta job ishga tushmasligini ta'minlaydi holos.
3. DistributedLock + DistributedCache yechimiga to'xtaldim. Bunda DistributedLock orqali bir vaqtni faqat bitta job ishlashini ta'minlayman. DistributedCache esa shu 24 soat ichida Job ishga tushganmi yo'qligi haqida ma'lumotni saqlab turadi. Masalan, Job ishga tushganda DistributedCache ga "IshgaTushdi=true" deb yozib qo'yaman va AbsoluteExpiration = Next(22:59:59) deb belgilayman. Job keyingi marta ishga tushayotganda DistributedCachedan shu entry bormi yo'qmi tekshiraman. Agar bor bo'lsa, demak bugun email jo'natgan bo'lamiz.
PS: MemoryCache dan DistributedCache ga o'tganimga sabab HangfireServer scale qilamiz, ya'ni bir nechta server nusxasi tengdanigna ishga tushirilishi mumkin. Bunday Scaled holatlar uchun MemoryCache ishlatish kategoricheskiy mumkin emas.
π4π€1
Forwarded from Wahidβs Blog (Wahid Abduhakimov)
DistributedLock va DistributedCache yordamida kechagi muammo RecurringJob(qayta takrorlanuvchi ish)ni tengdaniga birdan ortiq nusxasi ishga tushmasligi va belgilangan vaqtidan avval ishga tushib ketmasligini ta'minladim.
Lekin yana muammo chiqdi π
Hangfire Serverda RecurringJoblar CRON Expression yordamida jadvalga qo'yiladi. Masalan, * * * * * * har soniya amalga oshiriladigan ishni anglatuvchi CRON.
Aytaylik ishni boshlanish vaqti 00:00:00 va ish boshlanganda Hangfire CRON expressionga qarab keyingi ishga tushish vaqtini hisoblaydi, ya'ni 00:00:01 keyingi ishga tushish vaqti. Agar ish 5 soniya davom etsa va 00:00:05 ta tugasachi?
Hangfire kutubxonasi o'zi eng ko'pi bilan Minutely (har daqiqalik) ishlarni bajaradi. Men test uchun soniyalik CRON berib ko'rdim va jadval buzildi. Ya'ni ishning navbati o'ta tezligidan bittasi tugamay keyingisi boshlanib ketyapti.
O'zi aslida bir daqiqadan kam vaqtda jadval qo'yilgan ishlar mantiqsiz manimcha.
Sog' bo'lasla β
Lekin yana muammo chiqdi π
Hangfire Serverda RecurringJoblar CRON Expression yordamida jadvalga qo'yiladi. Masalan, * * * * * * har soniya amalga oshiriladigan ishni anglatuvchi CRON.
Aytaylik ishni boshlanish vaqti 00:00:00 va ish boshlanganda Hangfire CRON expressionga qarab keyingi ishga tushish vaqtini hisoblaydi, ya'ni 00:00:01 keyingi ishga tushish vaqti. Agar ish 5 soniya davom etsa va 00:00:05 ta tugasachi?
Hangfire kutubxonasi o'zi eng ko'pi bilan Minutely (har daqiqalik) ishlarni bajaradi. Men test uchun soniyalik CRON berib ko'rdim va jadval buzildi. Ya'ni ishning navbati o'ta tezligidan bittasi tugamay keyingisi boshlanib ketyapti.
O'zi aslida bir daqiqadan kam vaqtda jadval qo'yilgan ishlar mantiqsiz manimcha.
Sog' bo'lasla β
π3
Forwarded from MDC Uzbekistan
Github actions dan foydalanib CI/CD qilish
Do'stlar, avvalgi mavzularimizda Windows server bilan to'g'ridan to'g'ri ishlab, .NET ilovalarimizni deploy qilishni ko'rib chiqdik. O'ylaymizki, siz CI/CD haqida eshitgansiz. Masalan, Heroku servislaridan deployment uchun foydalangansiz, esingizda bo'lsa u yerda CI/CD sozlamalari qilingan edi. Ya'ni github/gitlab/azuredevops ga push qilish orqali, loyihamiz avtomatik tarzda build -> test -> deploy -> run bo'lardi. Ushbu mavzuni kengroq o'rganishimiz uchun Abduvohid ustozni mahorat darsimizga taklif qildik.
Barchangizni ushbu mahorat darsida kutib qolamiz. Kirsangiz xursand bo'lamiz, kirmasangiz hafa bo'lish yo'q )
Sana: 5-mart, 20:00
Havola: Zoom
Speaker: Wahid Abduhakimov
#githubactions #deployment #cicd
.NET Uzbekistan Community
ββββββββββ
Telegram | Instagram | Youtube
Do'stlar, avvalgi mavzularimizda Windows server bilan to'g'ridan to'g'ri ishlab, .NET ilovalarimizni deploy qilishni ko'rib chiqdik. O'ylaymizki, siz CI/CD haqida eshitgansiz. Masalan, Heroku servislaridan deployment uchun foydalangansiz, esingizda bo'lsa u yerda CI/CD sozlamalari qilingan edi. Ya'ni github/gitlab/azuredevops ga push qilish orqali, loyihamiz avtomatik tarzda build -> test -> deploy -> run bo'lardi. Ushbu mavzuni kengroq o'rganishimiz uchun Abduvohid ustozni mahorat darsimizga taklif qildik.
Barchangizni ushbu mahorat darsida kutib qolamiz. Kirsangiz xursand bo'lamiz, kirmasangiz hafa bo'lish yo'q )
Sana: 5-mart, 20:00
Havola: Zoom
Speaker: Wahid Abduhakimov
#githubactions #deployment #cicd
.NET Uzbekistan Community
ββββββββββ
Telegram | Instagram | Youtube
π9
EF Core Computed Columns
EntityFramework Core ma'lum ustunlarni qiymatini tashqaridan kiritmasdan hisoblab topish imkonini beradi. Shuni o'rganish uchun linkga bosing.
https://wahids.notion.site/EF-Core-Computed-Columns-0b19d5904a35403b91929e6ac4204f46
EntityFramework Core ma'lum ustunlarni qiymatini tashqaridan kiritmasdan hisoblab topish imkonini beradi. Shuni o'rganish uchun linkga bosing.
https://wahids.notion.site/EF-Core-Computed-Columns-0b19d5904a35403b91929e6ac4204f46
wahids on Notion
EF Core Computed Columns | Notion
Entity Framework (EF) Coredagi hisoblangan ustunlar (Computed Columns) DBdagi biror ustunni qiymatini tashqaridan kiritmasdan shunchaki hisoblab topib qiymat belgilash imkonini beradi.
β€3
Unit Test
Unit testlar yuqori sifatli .NET dasturlar yaratishning ajralmas qismi. Unit Test bu dasturni eng kichik komponentlarini ajratib olgan holda ularni toβgβri ishlashini tekshirish.
Batafsil π: https://bit.ly/3LJS6cN
Shu kabi teppa-tekin kontentlarni qo'llab quvvatlash uchun comment βοΈ & π like larni ezib yuboringlar!
Unit testlar yuqori sifatli .NET dasturlar yaratishning ajralmas qismi. Unit Test bu dasturni eng kichik komponentlarini ajratib olgan holda ularni toβgβri ishlashini tekshirish.
Batafsil π: https://bit.ly/3LJS6cN
Shu kabi teppa-tekin kontentlarni qo'llab quvvatlash uchun comment βοΈ & π like larni ezib yuboringlar!
π15π₯5β€2π³2
ASPNET CORE Web API Best Practices degan kurs tayyorlamoqchiman. Bir qancha videolardan iborat bo'ladi. Web API design qilishda yo'lga qo'yiladigan hatoliklar va ularni oldini olish uchun industriya standartlari qanday ekanini o'rgataman. Qiziqqanlar quloq tashlab turinglar π
π18π₯7π³1πΎ1
API Design Best Practices degan o'zbekcha video kurs tayyorlayapman.
Unda API dizayn qilishdagi xatolar va eng yaxshi usullarni o'rgataman. Shunday kursga o'zingiz uchun investitsiya qilasizmi?
Unda API dizayn qilishdagi xatolar va eng yaxshi usullarni o'rgataman. Shunday kursga o'zingiz uchun investitsiya qilasizmi?
Anonymous Poll
71%
Ha, sotib olaman
29%
Yo'q, qiziqmayman
π4β€2π2
Forwarded from Wahid Ustoz (only tech.)
This media is not supported in your browser
VIEW IN TELEGRAM
Bir shingil kod π
C# tilida
Kontent yoqsa yaqinlarga ulashib qo'llab yuboringlar!
Youtube | Instagram | TikTok | Telegram
C# tilida
string interpolation qanday ishlaydi?Kontent yoqsa yaqinlarga ulashib qo'llab yuboringlar!
Youtube | Instagram | TikTok | Telegram
π₯4π2