SQL ma'lumotlar bazasi yordamida vaqtli hodisalar arxitekturasini yaratish

Mening savolimning nomi umumiydir, chunki men bu muammo umumiy tabiatni his qilyapman, lekin aniq bir misolni taqdim etishga tayyorman.

Biz ma'lumotlar bazasi jadvallari bilan boshqariladigan uy-joyli ish oqimini ishlatamiz. Ushbu jadvallar ichida ish oqimini ifodalovchi yo'nalishli grafik ga egadir. Grafikda bosqichlar va amallar mavjud; Ikki bosqichli tugunlar orasidagi chiziq chiziladi va natijada faoliyat tugunida bajariladigan kod mavjud. Kodni tezda kompilyatsiya qilish va amalga oshirish uchun CSScript-dan foydalanamiz.

Ish jarayoni doirasida topshiriq yozuvlari bajariladigan ishni ifodalaydi. Har bir topshiriq xml formatidagi ba'zi metadatalarni o'z ichiga oladi. Vazifa yozuvlari yo'naltirilgan grafikani harakatga keltiradi va kod topshiriq faoliyati orqali o'tadi. Shunday qilib, har bir bosqichda har bir bosqichda x ta miqdordagi vazifalar bo'lishi mumkin.

Faoliyatga oid topshiriqni bajarish uchun uni rejalashtirilishi kerak. Datetime, taskid, stepid va activityid o'z ichiga olgan jadval jadvali keyingi va qaerda bajarilganligini belgilaydi. Vaqti-vaqti bilan biz kerakli jadvallarni qaytaradigan so'rovlarni bajaramiz va keyinchalik qaytib kelgan har bir yozuv uchun biz faollik namunasini o'rnata olamiz va uni bajaramiz, topshiriq rekordini parametr sifatida topshiramiz.

Ushbu so'rov soniyada 10 marta ishlatilgan. Yaqinda so'rovlar ro'yxatini necha marta qaytarmasligini va agar bu son 60 ga teng bo'lsa, men so'rovlar oralig'ini soniyada bir martaga kamaytirishni hisoblayman va hisoblashni boshlayman. Agar hisob-kitob soni 60 ga etsa, intervalni bir daqiqada bir marta qisqartiraman. So'rov natijasidagi yozuvlar paydo bo'lsa, intervalni sekundiga 10 marta qaytarib qo'yaman va ro'yxatga olish jarayonini qayta boshlayman. Aniq effekt shundaki, jadvali jadvali jadal sur'atlar bilan band bo'lib, jim davrlar davomida so'roqqa olinmaydi. Biz bir oyda bir necha yuz dollarni, birgina oddiy o'zgarish bilan, bir oyda Azure nusxasini saqlashni kutamiz.

Mana mening savolim shu.

Bu, shubhasiz, so'rov shaklidir. Ma'lumotlar bazasi doimo ma'lumotlar bazasini muntazam so'roq qilmasdan turib, jadvalga yozilish vaqtida urish uchun "hodisaga asoslangan", qilishning usul bormi?

7
Nima demoqchi ekanini tushunmayapman. Bu keng qamrovli Azure nusxalari; Biz ishlatish uchun to'lov (CPU vaqti?).
qo'shib qo'ydi muallif sgwill, manba
@ErikEidt: Ehtimol, jadvalni yozadigan joylarni topdim va Server obyektidagi NextScheduleDate xususiyatini saqlash uchun o'sha joylarga kod qo'shing.
qo'shib qo'ydi muallif sgwill, manba
@ErikEidt: Ehtimol. Lekin ma'lum bir vaqt oralig'ida keshlangan to'plam bo'lishi kerak; so'rovning har qanday chaqirig'iga binoan, bir nechta reja yozuvlarini qaytarib olish mumkin va yangi reja yozuvlari doimo ularning vazifalarini bajarish vazifasi sifatida kiritiladi. Shuning uchun javob berish masalasi. kesh oralig'i qanchalik uzoq bo'lsa, javob vaqtingiz sekinroq bo'ladi va shuning uchun keshni to'ldirish uchun vaqti-vaqti bilan so'rovni bajarishim kerak.
qo'shib qo'ydi muallif sgwill, manba
@ Metyu: Ha, aniq.
qo'shib qo'ydi muallif sgwill, manba
@Maddy: GetDate() da SQL da DateTime.Now bilan bir xil ishni bajaradi. So'rov so'rovi quyidagicha: , bu erda ScheduleDate
qo'shib qo'ydi muallif sgwill, manba
@Matthew: Jadval o'zgarmasligi mumkin. Jadval yozuvi yozilgach, tizim GetDate() ni qo'lga olish uchun kutadi.
qo'shib qo'ydi muallif sgwill, manba
Keyingi vazifani bajarish uchun keshlash mumkinmi? Men sizning oldingizga JB-ga kelishni o'ylab qolaman deb o'ylardim, keyingi yozuvni keshlash uchun yoki JBda biror narsa o'zgarganda.
qo'shib qo'ydi muallif Ayyash, manba
Azure deb aytmoqchiman ... bu prem yoki bulutdami?
qo'shib qo'ydi muallif 조남진, manba
Oh, shuning uchun sizda rejalashtirilgan "DateTime" dagi DateTime.Now-ga teng yoki yo'qligini ko'rish uchun ushbu Schedule jadvaliga qaraydigan bir tizim mavjud.
qo'shib qo'ydi muallif Matthew, manba
Men aniq muammoni echishga harakat qilayotganingizni tushunish qiyin. SqlDependency so'rov natijasi o'zgartirilgan bo'lsa, mssql ilovasidan ishdan chiqadigan voqea. Menimcha, GetDate aslida nima qilayotganini tushunmayapman.
qo'shib qo'ydi muallif Matthew, manba
Siz jadvalni o'zgartirganda xabar olish uchun SqlDependency dan foydalanishni o'ylab ko'rdingizmi?
qo'shib qo'ydi muallif Matthew, manba

6 javoblar

Umumiy echim asenkron bildirishnomalarni qo'llab-quvvatlaydigan ma'lumotlar bazasidan foydalanishdir. Bir nechta:

  • Oracle - Allows registration for notification of changes on objects (object change notification or OCN) and changes in the results of specified queries (query result change notification or QRCN).
  • PostgreSQL - Simple notification containing a tag and an optional payload generated using the NOTIFY statement as a standalone command or as part of a function. (The latter could be part of a trigger.) Clients can subscribe to notifications by issuing a LISTEN statement and selecting on the connection handle (exactly how varies with language binding).
  • SQL Server - Built-in queuing system where clients can use a combination of the WAITFOR and RECEIVE statements to listen for events. May also have (or have had) Oracle-like OCN/QRCN.
  • Sybase - Has registered procedures that allow invocation of callbacks on the clients if they've asked for it. (Not positive about this one.)

Agar siz (MySQL, DB2) bo'lmaganlardan biriga yopishib qolsangiz, boshqa javoblarda tasvirlangan usullardan biri yordamida banddan tashqari amalga oshiriladi.

Ma'lumotlar bazasiga sizda biror narsa o'zgarganligi haqida xabar berish uchun sizda bir usul mavjud bo'lganda, keyingi voqea qancha davom etishi kerakligini belgilaydigan so'rovni bajarishingiz va keyinchalik xabar berish uchun kutishingiz mumkin. Xabarnoma olsangiz, so'rovni/kutish davrini takrorlang. Agar sizga xabar bermasangiz, bu siz hisoblagandagina kelgan vaqt va hodisaning nima bo'lishidan qat'i nazar, amalga oshirish vaqti keldi degan ma'noni anglatadi. Bu sizni ishonchli ma'lumotga ega bo'lishingiz kerak bo'lgan ma'lumotlar bazasini so'rab olgan nuqtaga tushirishi kerak.

4
qo'shib qo'ydi

Vaqtinchalik jadvalga ma'lumotlar bazasiga takroriy so'rovlar, ayniqsa, soniyada bir necha marta ovoz berishni talab qilsangiz, Schedule moslamalarni xotirada keshidan katta foyda olishingizni aytadi.

O'zingizning dastur serverlaringiz gorizontal ravishda ölçeklenebilir va yuk tarqalgan bo'lsa, klasterinizdeki tugun onlayn bo'lsa, u global ish zarrachalar xavfsiz navbatini yaratish uchun boshlashni amalga oshirishi mumkin. In-xotira navbatida har bir jadval vazifasini bajarish mantiqiy bo'ladi, chunki u tartiblangan ma'lumotlar hisoblanadi. Bu avval sizning klasterdagi har bir tugun jarayoni uchun yagona ma'lumotlar bazasi so'rovini tashkil qiladi.

So'rovni qidiring

So'rovni o'tkazish bo'yicha sarf-harajat navbati bilan tartiblangan navbatning birinchi elementida ko'zga tashlanadi. Xotirada bo'lgan navbat bu operatsiyani nanosaniyadagi o'lchash mumkin. Eng erta element kerak bo'lsa, endi bu jarayon boshlanishi kerak.

Voqea sodir bo'lgan faoliyatni ishlab chiqarish

MQ kabi bir narsa foydali bo'lishi mumkin. Keyingi vazifani navbat bilan o'chirib qo'ysangiz, topshiriq ma'lumotlar bilan MQ-ga xabar yuborishingiz mumkin. Faoliyat namunalarini generatsiya qilish jarayonlari to'plami ushbu navbatni tinglashi mumkin, ya'ni olish uchun eng qulay yoki eng tez tugunni bildiradi va faoliyati bajarish uchun javobgarlikni oladi.

Yangi rejalashtirilgan vazifalar haqida nima desa bo'ladi ?!

Tizimga yangi reja topshiriqlarini qo'shish uchun boshqa tinglash jarayoni bilan boshqa MQdan foydalaning. Ma'lumotlar bazasi jadvallarini yangi reja va vazifalar bilan yangilash uchun mas'uliyatni o'z zimmasiga oladi. Xotira jarayoni ro'yxatlarining hammasini yangilash uchun hali ham kerak. Bunga erishishingiz mumkin bo'lgan turli xil usullar mavjud, biroq mavzu kabi bir narsa bunday ishlatish uchun ajoyib echimdir.

More information on Topics here: http://activemq.apache.org/how-does-a-queue-compare-to-a-topic.html

Har bir tugunni jarayoni yangi reja topshiriqlarini xotirada navbatda qo'llash uchun foydalanadigan Mavzuga obuna bo'lishi mumkin.

Nima uchun bu katta yondashuv?

Bu murakkabligi bor, lekin bu borada katta ahamiyatga ega, u o'lchovli, bardoshli, samarador va tezlik bilan qayta tiklanishi mumkin. Nodlar o'chirilishi yoki qo'shilishi mumkin va ma'lumotlar bazasi faqatgina yangi tugunni ishga tushirishga to'g'ri keladigan tarzda ishga tushiriladigan hisob yozuvi sifatida ishlatiladi.

1
qo'shib qo'ydi
MQ mahsulotmi yoki texnikasi bormi?
qo'shib qo'ydi muallif sgwill, manba
@RobertHarvey hammi? Buni qo'llab-quvvatlaydigan qator mahsulotlar mavjud. Azure'dan foydalanishingiz mumkin bo'lgan to'liq xabar almashish platformasi mavjud ko'rinadi. azure .microsoft.com/en-us/documentation/articles/& hellip;
qo'shib qo'ydi muallif maple_shaft, manba
Azure Service Bus avtoulovi o'z navbatida siz kerakli bo'lgan barcha narsani beradigan xabarlar navbatini taqdim etishni va shuningdek nashr qilish/obuna bo'lishni (Mavzular?) O'xshaydi. Ayniqsa, Xizmat Avtobus bilan Brokered Xabarlar a>
qo'shib qo'ydi muallif maple_shaft, manba

Bu hodisalarga asoslangan yechim emas, lekin bu sizning muayyan muammoingizga alternativ echim bo'lishi mumkin deb o'ylayman.

Menga aytsam, muammoga uchragan yoki beqaror bo'lmagan xotirada saqlanadigan ma'lumotni saqlash yoki saqlashga qaror qilsangiz, xavfli/mukofot savdosini to'xtatish uchun odatiy holga tushasiz. Vaqtinchalik bo'lmagan xotira arzonroq va xavfsizroq bo'lishi mumkin, ammo ma'lumotni olish ancha uzoqlashadi va odatda o'lchov tizimi tuzilmalari bilan cheklanadi.

Har bir vazifa uchun ta'riflagan ushbu metadata, albatta, ma'lumotlar bazasida saqlanayotgandek bo'lgani kabi, sizning uzoq muddatli rejalashtirilgan narsalaringiz kabi ko'rinadi. Lekin sizning postingizda keyingi ishga tushirish uchun nima qilish kerakligini bilish uchun ma'lumotlar bazasini doimiy ravishda ko`rish jarayonini tasvirlab berasiz. Ushbu darhol navbatingiz dastur uchun juda muhimdir, lekin dastur men uchun kecha yopilgandan keyin, albatta, davom ettirishi kerak kabi narsalarga o'xshamaydi. Sizning ilovangiz hozir nima qilish kerakligini bilish va keyin oldinga harakat qilish kerak.

Men muhim refactor bo'lishi mumkin bo'lgan narsalarni yoritib berayotgan bo'lishi mumkin, lekin men sizning rejalashtirgichingizning ushbu qismini ma'lumotlar bazasidan o'chirib tashlay olmaysizmi yoki ma'lumotlar strukturasi ko'rinishidagi dastur qatlamiga qadar ko'tarolmaysizmi? Vaqtni rejalashtirilgan barcha vazifalar uchun to'g'ridan-to'g'ri so'roq qilish o'rniga, bu faqat keyingi vaqt segmentida ishlatilishi kerak bo'lgan uzoq vaqt rejalangan vazifalarni aniqlash uchun bir soat (yoki siz aniqlagan har qanday vaqt segmenti) deb aytdi va ularni dastur qatlamining ma'lumotlar strukturasi, bu sizning ilova qilishingiz kerak bo'lgan ma'lumotlar bazasi miqdorini sezilarli darajada kamaytiradi. Sizning rejalashtirgichingiz keyinchalik darhol topshiriqlarni bajarish uchun bevosita ushbu mahalliy ma'lumotlarni saqlash tizimini so'rashi mumkin. Bu, albatta, sizning rejalashtiruvchi sinfingizning ushbu jurnali vaqti segmentidan xabardor bo'lishini va har qanday rejalashtirilgan vazifalarni bevosita ma'lumotlar tuzilmasiga (ma'lumotlar bazasiga qarshi) joylashtirishini talab qiladi.

Lekin natija, aslida sizda mavjud bo'lgan bir xil tizim bo'lishi mumkin, bundan tashqari siz darhol uzoq muddatli saqlash uchun ma'lumotlar bazasini cheklashni hisobga olasiz.

1
qo'shib qo'ydi

Men tushunganimdek, vazifani bajarish kerak

  • Endi ishga tushirish kerak
  • Yoki bu faqat yangi vazifa bilan yaratilgan
  • Yoki faqat keyingi bosqichga o'tib,
  • ni ishlatishga tayyor

Sizning ishlashingiz kerak bo'lgan vazifa qachon ishga tushishi kerak bo'lganidan bir necha soniya o'tgach ishlaydi? (Men emas deb o'ylayman)

Shuning uchun yangi so'rovlarni har 60 soniyada va vazifa jadvaliga qo'shganda har bir ishni bajarish uchun so'rovni bajaring. Bu yangi yaratilgan "ishga tushirish" vazifalari tezkor, ammo kamroq ovozga ega bo'lishiga olib keladi.

Yoki vazifaga jadvalga qo'shilganda xabar olish uchun SqlDependency dasturidan foydalaning. So'ngra so'rovingiz pastroq bo'ladi, keyingi vazifaga qadar, shuning uchun ham bajariladigan vazifa qadar.

0
qo'shib qo'ydi
Bu so'rovni bajarish vaqtida va topshiriqlar bajarilgan vaqt orasida rejalashtirilgan yozuvlarni olmaydi.
qo'shib qo'ydi muallif sgwill, manba
Shuning uchun yangi so'rovlarni har 60 soniyada topish uchun so'rovni bajaring ... Vaqt oralig'ida men so'rov natijalarining qaytib kelmasligi bilan bog'liq sonini hisoblovchi yangi kodni qo'shdim. Agar bu son ma'lum bir chegaraga kelsa, men so'rov natijalari ro'yxatga olingan yozuvlarga olib kelgunga qadar so'rov oralig'ini qisqartiraman.
qo'shib qo'ydi muallif sgwill, manba
Ishga kirishish kerak bo'lgan ishni bajarish vaqti tugab, bir necha soniya o'tgach ishlaydi. - Ha. Vazifalar yukni muvozanatlash sabablari bo'yicha aniq bir asosda rejalashtiriladi, shuning uchun ular qachon ishlashlari kerakligi juda muhimdir.
qo'shib qo'ydi muallif sgwill, manba
@RobertHarvey, shuning uchun so'rovingiz keyingi polga qancha vaqt kutish kerakligini, ammo yangi vazifalar yaratilayotganda qandaydir mantiq bilan kurashish kerakligini bildiradi.
qo'shib qo'ydi muallif user1114, manba
@RobertHarvey, keyingi bir necha soniyalarda ishlaydigan ishni qaytarib bera olasizmi, keyin ularni C# tomonida mantiq bilan ishlashni kechiktira olasizmi?
qo'shib qo'ydi muallif user1114, manba
@RobertHarvey, lekin ularni rejalashtirgan dastur sizning nazorat ostingizda .....
qo'shib qo'ydi muallif user1114, manba

Fikrlashim mumkin bo'lgan yagona narsa, vazifani bajarish kerak bo'lgan Kuzatuvchi jarayonini proaktif ravishda xabardor qilish uchun veb-xizmat qo'ng'iroqlaridan foydalanishdir.

Bir qadam oldinga borib, bu vazifani bajarish uchun zarur bo'lgan ma'lumotni davom etayotgan navbatga xabar yuborish uchun RabbitMQ kabi bildirishnoma tizimidan foydalanishingiz mumkin. Kuzatuvchi ushbu navbatga obuna bo'lishi va faqatgina ma'lumotlar bazasiga ishlov berishi mumkin.

Aytish kerakki, RabbitMQ serverining pastga tushib ketgan holatlarida siz kutishyotgan ishni bajarishingiz kerak bo'ladi - bu sizning sistemangizga yuqori darajada xatolarga chidamli bo'lishga bo'lgan ehtiyojni oshiradi.

0
qo'shib qo'ydi

Siz buni so'rovsiz hal qilishingiz mumkin.

Men faqat vaqt voqealari bilan qiziqasiz deb o'ylayman.

  • Barcha ma'lumotlar bazasi jadvali mavjud emas.
  • Sizda "getNextEvent" sql-so'rovi mavjud. Unda keyingi minimal hodisa-datetime amalga oshirilmaydi.
  • getNextEvent, hodisa-datetime-navbatining o'zgarishi yoki vaqt-hodisa-xatti-harakat tugashi bilan har safar bajariladi.
  • agar bu hodisani datetime oldin now (oldin) bo'lsa, unda voqea kechiktirilgan va darhol bajarilishi mumkin.
  • agar bu hodisalar-datetime kelgusida bo'lsa, voqea-hodisalar vaqti o'sha datetime qadar uxlashi mumkin.

Batareya samaradorligi va Android signal-soati bu bilan ishlaydi

0
qo'shib qo'ydi
@Robert: Uzr so'rayman, siz aynan shu fikrga ega bo'lgan savol-sharhni ko'rmadim. Buni batafsilroq tushuntirishlar sifatida ko'rib chiqing.
qo'shib qo'ydi muallif naught101, manba