putlfAbsent()ning cheklovlari va o'zgarishlarni kuzatishni yaxshilash

putlfAbsent()ning cheklovlari va o'zgarishlarni kuzatishni yaxshilash

1. Kirish

Real-time monitoring tizimlarida ko'plab xizmatlar orasida ma'lum qiymat uchun hisoblash formulasining meta ma'lumotlarini sinxronlashtirish zarurati tez-tez uchraydi. Ushbu loyihada ham, hisoblash formulasini yaratish yoki o'zgartirish paytida hodisani e'lon qilib, boshqa xizmatlarga o'zgarishlarni yetkazish funktsiyasi kerak edi.

Birinchi amalga oshirishda bir xil hisoblash formulasini takroran yaratmaslik uchunConcurrentHashMapning putIfAbsent()metodidan foydalandik. Shartli ifodaga putIfAbsent()ni qo'shib, unga o'tgan holatda hisoblash formulasini uzatish hodisasini e'lon qilishni amalga oshirdik. Hisoblash formulasi odatda bir marta yaratilgandan so'ng o'zgarmas deb hisoblaganimiz sababli, faqat birinchi ro'yxatdan o'tishni qayta ishlash yetarli deb hisobladik.

Biroq, turli ishga tushirish senariylarini ko'rib chiqish jarayonida kutilmagan muammo topdik. Ba'zi hisoblash formulalari dastlab belgilangan qiymatlar tarkibiga qo'shimcha ravishda mavjud sensor signallari tarkibiga qarab hisoblash formulasiga o'zgarishlar kiritishi mumkin edi va mavjud tuzilma bu o'zgarishlarni aniqlay olmaydi.

Masalan, ba'zi bir hisoblash formulasi faqat A deb nomlangan signal mavjud bo'lganda quyidagicha yaratiladi.

 Value = A + 1.01

Biroq, ish jarayonida B deb nomlangan signalning true/false holatiga qarab hisoblash formulasi quyidagicha o'zgarishi mumkin.

 Value = A - 1.01

Ya'ni, bir xil hisoblash formulasi bo'lishiga qaramay, mavjud signal tarkibiga qarab hisoblash formulasi o'zgartirilishi mumkin.

Muammo shundaki, putIfAbsent()allaqachon ro'yxatga olingan kalituchun hech qanday ish bajarmasligini bildiradi. Shuning uchun, hisoblash formulasi o'zgarsa ham, mavjud qiymat saqlanadi va o'zgarish hodisasi ham chiqarilmaydi.

Natijada boshqa xizmatlar eng so'nggi hisoblash formulasini ololmaydi va xizmatlar orasida meta ma'lumotlar muvofiqligi buzilishi mumkin.

Bu maqolada dastlabki loyihalashda putIfAbsent()ni tanlash sababi va uning chegaralari, hamda replace()dan foydalanib o'zgarishni aniqlash va hodisalarni sinxronlashtirish jarayonini yaxshilash haqida qisqacha ma'lumot berishni rejalashtirmoqdaman.

2. Dastlabki loyihalash - putIfAbsent() dan foydalangan holda takroriy yaratilishni oldini olish

Avval loyihani boshlashtirmoqdan oldin, loyiha uchun ishlatiladigan hisoblash formulalarini ko'rib chiqdik. Dastlabki loyihalashda hisoblash formulalariga nazar tashlasak, ularning barchasi dastlabki sozlamalarni shart sifatida olgan hisoblash formulalari edi. Shuningdek, bunday bir marta yaratilgan formulalar dastlabki qiymatlar o'zgarmasa, operatsion jarayonda o'zgarmas ekanligini hisobga olib, hisoblash formulasini faqat bir marta saqlash kerak deb o'yladik.

Hisoblash formuli birinchi marta yaratilgan paytda xotirada saqlanishi va bir vaqtning o'zida boshqa xizmatlarga hisoblash formuli ma'lumotlarini uzatish uchun hodisani chiqarish tuzilmasi ishlab chiqildi.

Shuningdek, ushbu funksiyalarning bir nechta iplar tomonidan bir vaqtda kirilishi mumkin bo'lgan muhitda ishlashi kerakligi uchun, hisoblash formuli ma'lumotlarini saqlovchi kesh sifatida ConcurrentHashMapdan foydalandik. Dastlabki amalga oshirish juda oddiy edi.

image1.png

putIfAbsent()belgilangan Keymavjud bo'lmaganda qiymatni saqlaydi va allaqachon mavjud bo'lsa, mavjud qiymatni qaytaradi. Shunday qilib, dastlabki hisoblash formulasi yaratilgandagina voqeani chiqara oldik va bir xil hisoblash formulasiga takroriy voqea yuz berishini tabiiy ravishda oldini olsak bo'ldi.

O'shanda hisoblash formulasi bir marta yaratilganda o'zgarmaydi deb o'yladik. Chunki, dastlabki sozlash qiymati hech qachon o'zgarishsiz qoladigan doimiy qiymat edi. Agar o'zgaradigan bo'lsa ham, xizmatni qayta ishga tushirish orqali xotirani yangilab, yangi hisoblash formulalarini qayta yaratishingiz mumkin deb o'yladik.

3. Yangi hisoblash formulasi talablarini ko'rib chiqish jarayonida topilgan muammo

Dastlabki amalga oshirishni tugatgach, boshqa hisoblash formullari haqidagi talablarni ko'rib chiqish uchrashuviga qatnashdim. Ushbu funksiyani joriy dasturiy ish bilan aloqasi bo'lmagan boshqa hisoblash funktsiyalariga oid edi, ammo talablarni ko'rib chiqayotganda, eski dizaynga ta'sir ko'rsatishi mumkin bo'lgan jihatni kashf etdim.

Uchrashuvda muhokama qilingan ba'zi hisoblash formulalari faqat dastlabki sozlash qiymatidan foydalanish bilan cheklanmay, sensor signallarining mavjudligi yoki signallarning qiymatiga qarab hisoblash formulasi o'zgarishi mumkin edi.

Masalan, ma'lum bir sensor signali mavjud bo'lmasa, faqat A’dan foydalanib hisoblashni bajaradi, ammo ushbu sensor normal sharoitda yig'ilishi boshlanganida, A va B’ni birgalikda ishlatadigan hisoblash formulasi bilan o'zgartirilishi kerak edi. Yoki B signalining qiymati true/false bo'yicha hisoblash formulasi o'zgarishi kerak edi.

Ushbu talablarni ko'rib chiqish jarayonida joriy amalga oshirilgan putIfAbsent()asosiye tuzilmasini qayta ko'rib chiqdim. Va eski tuzilmada allaqachon yaratilgan hisoblash formulasining o'zgarishini sezish mumkin emasligining faktini kashf etdim.

4. Hisoblash formulasi o'zgarishini aniqlash uchun talablarni qayta belgilash

Mavjud tuzilma hisoblash formulasining dastlabki yaratilishi paytida voqea chiqarish talabini qondirgan edi. Biroq yangi talablar asosida, bu yetarli emas edi. Hisoblash formulasining o'zgartirilishi mumkin bo'lsa, dastlabki yaratilishdan tashqari, o'zgarishni ham aniqlash imkoniyati bo'lishi kerak edi.

Tizimni to'g'ri tashkil etish uchun quyidagi shartlarni qondiradigan yangi tuzilma kerak edi.

1. Hisoblash formulasining dastlabki yaratilishi paytida voqea chiqarish

2. Hisoblash formulasining o'zgartirilishi paytida voqea chiqarish

3. Hisoblash formulasining bir xil bo'lgan taqdirda voqea chiqarilmasligi

4. Ko'p ipli muhitda ham xavfsiz ishlashi

putIfAbsent()faqat dastlabki yaratilishni boshqara olardi. Allaqachon ro'yxatga olingan Keyuchun yangi hisoblash formulasini kiritishdan qat'i nazar, solishtirish yoki o'zgarish bor-yo'qligini tekshirish imkoniyati yo'q edi. Shuning uchun hisoblash formulasining o'zgarishini aniqlay oladigan alohida tuzilma kerak edi.

5. ConcurrentHashMap ning replace() funksiyasidan foydalanib o'zgarishni aniqlash

Dastlab, mavjud qiymatini ko'rib chiqqanidan so'ng, solishtirish va o'zgarish bor-yo'qligini aniqlash usuli ham ko'rilib chiqilgan edi.

image2.png

Biroq bu usul ko'p ipli muhitda xavfsiz emas edi. Masalan, ikkita ip bir vaqtning o'zida bir xil hisoblash formula ma'lumotlarini o'zgartirishga urinishsa, ikkala ip ham mavjud qiymatni ko'rib chiqqanidan so'ng o'zgarish bo'lgan deb hisoblay olishadi. Bu holda bir xil hisoblash formulasidagi o'zgarish uchun voqealar takroriy chiqarilishi ehtimoli mavjud.

Shuning uchun, ushbu muammoni hal qilish uchun ConcurrentHashMapda taqdim etilgan replace() metodidan foydalandim.

image3.png

replace(key, oldValue, newValue)hozirgi Mapda saqlangan qiymat oldValuebilan bir xil bo'lganida newValuega o'zgartiradi. Ya'ni, quyidagi usulda ishlaydi.

image4.png

agar boshqa ip avval qiymatni o'zgartirgan bo'lsa, hozirgi Mapning qiymati allaqachon oldValuebo'lmaydi. Bunday holatda replace()bo'ladi falseni qaytaradi va qiymatni almashtirishni amalga oshirolmaydi. Shuning uchun faqat haqiqatan ham hisob-kitob formulasini o'zgartirishga muvaffaq bo'lgan iplar hodisa chiqarishi mumkin. Nihoyat replace()ning qaytargan qiymatini foydalanib, hodisa chiqishi yoki chiqmasligini belgiladik.

Buning orqali hisob-kitob formulasini o'zgartirish sodir bo'lgan hollarda faqat hodisalarni chiqarishga erishildi, shuningdek, bir vaqtda ko'p ipli muhitda sodir bo'lishi mumkin bo'lgan takroriy hodisalar muammosi ham oldini olish mumkin bo'ldi.

6. Xulosa qilib

bu funksiyani rivojlantirish jarayonida dastlab faqat hisob-kitob formulasining takroriy yaratilishini oldini olishga qaratilgan edik. Dastlabki talablarni hisobga olganda putIfAbsent()dan foydalanish orqali yaratilgan tuzilma yetarli ko'rinardi. Haqiqatan ham bir xil hisob-kitob formulasini takroriy saqlash va takroriy hodisalarni chiqarishdan samarali tarzda saqlanishimiz mumkin edi.

Ammo yangi hisob-kitob formulasiga oid talablarni ko'rib chiqish jarayonida hisob-kitob formulasining ish jarayonida o'zgartirilishi mumkinligi ehtimolini aniqladik va mavjud dizaynning bunday vaziyatni boshqarishi mumkin emasligini tasdiqladik. Buni hal qilish uchun hisob-kitob formulasining dastlabki yaratilishi bilan bir qatorda o'zgartirilganligini aniqlay olish uchun tuzilmani takomillashtirdik, ConcurrentHashMapning replace()multithreadli muhitda xavfsiz ishlashini ta'minlash uchun foydalanildi.

Ushbu tajriba orqali hozirgi talablarni qondirishdan tashqari kelajakda yuz berishi mumkin bo'lgan stsenariylarni ham hisobga olishning ahamiyati haqida yana bir bor his qildim. Shuningdek, faqat funksiyani amalga oshirish bilan cheklanmasdan, turli stsenariylarni ko'rib chiqish va loyihalashdagi cheklovlarni aniqlab, tuzatish jarayoni ham rivojlanishning muhim qismi ekanligini o'rgandim.

Yang

Site footer