Mail.ru Cloud Solutions S3 ob'yekt xotirasidagi veb-huklarga asoslangan voqealarga asoslangan dasturga misol.

Mail.ru Cloud Solutions S3 ob'yekt xotirasidagi veb-huklarga asoslangan voqealarga asoslangan dasturga misol.
Rube Goldberg qahva mashinasi

Voqealarga asoslangan arxitektura ishlatiladigan resurslarning iqtisodiy samaradorligini oshiradi, chunki ular faqat kerak bo'lganda foydalaniladi. Buni qanday amalga oshirish va ishchi ilovalar sifatida qo'shimcha bulut ob'ektlarini yaratmaslik bo'yicha ko'plab variantlar mavjud. Va bugun men FaaS haqida emas, balki webhooks haqida gapiraman. Ob'ektni saqlash veb-huklari yordamida hodisalarni boshqarishning o'quv namunasini ko'rsataman.

Ob'ektni saqlash va veb-huklar haqida bir necha so'z. Ob'ektlarni saqlash har qanday ma'lumotlarni bulutda S3 yoki HTTP/HTTPS orqali boshqa API (amalga oshirishga qarab) orqali kirish mumkin bo'lgan ob'ektlar ko'rinishida saqlash imkonini beradi. Webhuklar odatda maxsus HTTP qo'ng'iroqlaridir. Ular odatda kodning omborga ko'chirilishi yoki blogda e'lon qilingan sharh kabi voqea tomonidan qo'zg'atiladi. Voqea sodir bo'lganda, manba sayti veb-huk uchun belgilangan URL manziliga HTTP so'rovini yuboradi. Natijada siz bir saytdagi voqealarni boshqa saytdagi harakatlarni tetiklashi mumkin (Wiki). Agar manba sayt ob'ektni saqlash joyi bo'lsa, voqealar uning mazmuniga o'zgartirishlar sifatida harakat qiladi.

Bunday avtomatlashtirishdan foydalanish mumkin bo'lgan oddiy holatlarga misollar:

  1. Boshqa bulutli xotirada barcha ob'ektlarning nusxalarini yaratish. Fayllar qo'shilgan yoki o'zgartirilganda nusxalar tezda yaratilishi kerak.
  2. Grafik fayllarning bir qator eskizlarini avtomatik yaratish, fotosuratlarga moybo'yoqli belgilar qo'shish va boshqa tasvirni o'zgartirish.
  3. Yangi hujjatlarning kelishi to'g'risida bildirishnoma (masalan, taqsimlangan buxgalteriya xizmati bulutga hisobotlarni yuklaydi va moliyaviy monitoring yangi hisobotlar haqida bildirishnomalarni oladi, ularni tekshiradi va tahlil qiladi).
  4. Biroz murakkabroq holatlar, masalan, Kubernetes-ga so'rovni yaratishni o'z ichiga oladi, u zarur konteynerlar bilan podkastni yaratadi, unga vazifa parametrlarini uzatadi va ishlov berilgandan so'ng konteynerni yiqadi.

Misol tariqasida, biz Mail.ru Cloud Solutions (MCS) ob'ektlarini saqlash paqiridagi o'zgarishlar AWS ob'ektlarini saqlashda veb-huklar yordamida sinxronlashtirilganda, biz 1-topshiriqning variantini qilamiz. Haqiqiy yuklangan holatda, asinxron ish veb-huklarni navbatda ro'yxatdan o'tkazish orqali ta'minlanishi kerak, ammo o'quv topshirig'i uchun biz bu holda amalga oshiramiz.

Ishlar sxemasi

O'zaro ta'sir protokoli batafsil tavsiflangan MCS da S3 vebhuklari bo'yicha qo'llanma. Ish sxemasi quyidagi elementlarni o'z ichiga oladi:

  • Nashriyot xizmati, bu S3 saqlash tomonida joylashgan va webnhook ishga tushirilganda HTTP so'rovlarini nashr etadi.
  • Webhook qabul qiluvchi server, HTTP nashriyot xizmatidan so'rovlarni tinglaydi va tegishli harakatlarni bajaradi. Server istalgan tilda yozilishi mumkin, bizning misolimizda biz serverni Go-da yozamiz.

S3 API-da vebhuklarni amalga oshirishning o'ziga xos xususiyati veb-hukni qabul qiluvchi serverni nashriyot xizmatida ro'yxatdan o'tkazishdir. Xususan, vebhukni qabul qiluvchi server nashriyot xizmatidan xabarlarga obuna bo'lishni tasdiqlashi kerak (boshqa webhook ilovalarida odatda obunani tasdiqlash talab qilinmaydi).

Shunga ko'ra, webhook qabul qiluvchi server ikkita asosiy operatsiyani qo'llab-quvvatlashi kerak:

  • ro'yxatdan o'tishni tasdiqlash uchun nashriyot xizmatining so'roviga javob berish,
  • kiruvchi hodisalarni qayta ishlash.

Webhook qabul qiluvchi serverni o'rnatish

Webhook qabul qiluvchi serverni ishga tushirish uchun sizga Linux serveri kerak bo'ladi. Ushbu maqolada, misol sifatida, biz MCS-da o'rnatadigan virtual misoldan foydalanamiz.

Kerakli dasturiy ta'minotni o'rnatamiz va webhook qabul qiluvchi serverni ishga tushiramiz.

ubuntu@ubuntu-basic-1-2-10gb:~$ sudo apt-get install git
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  bc dns-root-data dnsmasq-base ebtables landscape-common liblxc-common 
liblxc1 libuv1 lxcfs lxd lxd-client python3-attr python3-automat 
python3-click python3-constantly python3-hyperlink
  python3-incremental python3-pam python3-pyasn1-modules 
python3-service-identity python3-twisted python3-twisted-bin 
python3-zope.interface uidmap xdelta3
Use 'sudo apt autoremove' to remove them.
Suggested packages:
  git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui 
gitk gitweb git-cvs git-mediawiki git-svn
The following NEW packages will be installed:
  git
0 upgraded, 1 newly installed, 0 to remove and 46 not upgraded.
Need to get 3915 kB of archives.
After this operation, 32.3 MB of additional disk space will be used.
Get:1 http://MS1.clouds.archive.ubuntu.com/ubuntu bionic-updates/main 
amd64 git amd64 1:2.17.1-1ubuntu0.7 [3915 kB]
Fetched 3915 kB in 1s (5639 kB/s)
Selecting previously unselected package git.
(Reading database ... 53932 files and directories currently installed.)
Preparing to unpack .../git_1%3a2.17.1-1ubuntu0.7_amd64.deb ...
Unpacking git (1:2.17.1-1ubuntu0.7) ...
Setting up git (1:2.17.1-1ubuntu0.7) ...

Jildni webhook qabul qiluvchi server bilan klonlash:

ubuntu@ubuntu-basic-1-2-10gb:~$ git clone
https://github.com/RomanenkoDenys/s3-webhook.git
Cloning into 's3-webhook'...
remote: Enumerating objects: 48, done.
remote: Counting objects: 100% (48/48), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 114 (delta 20), reused 45 (delta 18), pack-reused 66
Receiving objects: 100% (114/114), 23.77 MiB | 20.25 MiB/s, done.
Resolving deltas: 100% (49/49), done.

Serverni ishga tushiramiz:

ubuntu@ubuntu-basic-1-2-10gb:~$ cd s3-webhook/
ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ sudo ./s3-webhook -port 80

Nashriyot xizmatiga obuna bo'ling

Webhook qabul qiluvchi serveringizni API yoki veb-interfeys orqali ro'yxatdan o'tkazishingiz mumkin. Oddiylik uchun biz veb-interfeys orqali ro'yxatdan o'tamiz:

  1. Keling, chelaklar bo'limiga o'tamiz nazorat xonasida.
  2. Biz veb-huklarni sozlaydigan chelakka o'ting va tishli tugmani bosing:

Mail.ru Cloud Solutions S3 ob'yekt xotirasidagi veb-huklarga asoslangan voqealarga asoslangan dasturga misol.

Webhooks yorlig'iga o'ting va Qo'shish-ni bosing:

Mail.ru Cloud Solutions S3 ob'yekt xotirasidagi veb-huklarga asoslangan voqealarga asoslangan dasturga misol.
Maydonlarni to'ldiring:

Mail.ru Cloud Solutions S3 ob'yekt xotirasidagi veb-huklarga asoslangan voqealarga asoslangan dasturga misol.

ID - vebhuk nomi.

Voqea - qaysi voqealarni uzatish. Biz fayllar bilan ishlashda (qo'shish va o'chirish) sodir bo'ladigan barcha hodisalarni uzatishni o'rnatdik.

URL — vebhuk qabul qiluvchi server manzili.

Filtr prefiksi/suffiksi - bu faqat nomlari ma'lum qoidalarga mos keladigan ob'ektlar uchun veb-huklarni yaratishga imkon beruvchi filtr. Masalan, webhook faqat .png kengaytmali fayllarni ishga tushirishi uchun, in Filtr qo‘shimchasi siz "png" yozishingiz kerak.

Hozirda webhook qabul qiluvchi serverga kirish uchun faqat 80 va 443 portlar qo'llab-quvvatlanadi.

Keling, bosing Kanca qo'shing va biz quyidagilarni ko'ramiz:

Mail.ru Cloud Solutions S3 ob'yekt xotirasidagi veb-huklarga asoslangan voqealarga asoslangan dasturga misol.
Kanca qo'shildi.

Webhukni qabul qiluvchi server o'z jurnallarida kancani ro'yxatdan o'tkazish jarayonining borishini ko'rsatadi:

ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ sudo ./s3-webhook -port 80
2020/06/15 12:01:14 [POST] incoming HTTP request from 
95.163.216.92:42530
2020/06/15 12:01:14 Got timestamp: 2020-06-15T15:01:13+03:00 TopicArn: 
mcs5259999770|myfiles-ash|s3:ObjectCreated:*,s3:ObjectRemoved:* Token: 
E2itMqAMUVVZc51pUhFWSp13DoxezvRxkUh5P7LEuk1dEe9y URL: 
http://89.208.199.220/webhook
2020/06/15 12:01:14 Generate responce signature: 
3754ce36636f80dfd606c5254d64ecb2fd8d555c27962b70b4f759f32c76b66d

Roʻyxatdan oʻtish tugallandi. Keyingi bo'limda biz webhook qabul qiluvchi serverning ishlash algoritmini batafsil ko'rib chiqamiz.

Webhook qabul qiluvchi serverning tavsifi

Bizning misolimizda server Go da yozilgan. Keling, uning faoliyatining asosiy tamoyillarini ko'rib chiqaylik.

package main

// Generate hmac_sha256_hex
func HmacSha256hex(message string, secret string) string {
}

// Generate hmac_sha256
func HmacSha256(message string, secret string) string {
}

// Send subscription confirmation
func SubscriptionConfirmation(w http.ResponseWriter, req *http.Request, body []byte) {
}

// Send subscription confirmation
func GotRecords(w http.ResponseWriter, req *http.Request, body []byte) {
}

// Liveness probe
func Ping(w http.ResponseWriter, req *http.Request) {
    // log request
    log.Printf("[%s] incoming HTTP Ping request from %sn", req.Method, req.RemoteAddr)
    fmt.Fprintf(w, "Pongn")
}

//Webhook
func Webhook(w http.ResponseWriter, req *http.Request) {
}

func main() {

    // get command line args
    bindPort := flag.Int("port", 80, "number between 1-65535")
    bindAddr := flag.String("address", "", "ip address in dot format")
    flag.StringVar(&actionScript, "script", "", "external script to execute")
    flag.Parse()

    http.HandleFunc("/ping", Ping)
    http.HandleFunc("/webhook", Webhook)

log.Fatal(http.ListenAndServe(*bindAddr+":"+strconv.Itoa(*bindPort), nil))
}

Asosiy funktsiyalarni ko'rib chiqing:

  • Ping() - URL/ping orqali javob beruvchi marshrut, tiriklik tekshiruvining eng oddiy amalga oshirilishi.
  • Webhook() - asosiy marshrut, URL/webhook ishlov beruvchisi:
    • nashriyot xizmatida ro'yxatdan o'tishni tasdiqlaydi (Obunani tasdiqlash funktsiyasiga o'ting),
    • kiruvchi webhuklarni qayta ishlaydi (Gorecords funktsiyasi).
  • HmacSha256 va HmacSha256hex funktsiyalari HMAC-SHA256 va HMAC-SHA256 shifrlash algoritmlarining amalga oshirilishi bo'lib, imzoni hisoblash uchun o'n oltilik raqamlar qatori sifatida chiqariladi.
  • main asosiy funksiya bo'lib, buyruq qatori parametrlarini qayta ishlaydi va URL ishlov beruvchilarini ro'yxatga oladi.

Server tomonidan qabul qilingan buyruq qatori parametrlari:

  • -port - bu server tinglaydigan port.
  • -adres - server tinglaydigan IP-manzil.
  • -skript - bu har bir kiruvchi kanca uchun chaqiriladigan tashqi dastur.

Keling, ba'zi funktsiyalarni batafsil ko'rib chiqaylik:

//Webhook
func Webhook(w http.ResponseWriter, req *http.Request) {

    // Read body
    body, err := ioutil.ReadAll(req.Body)
    defer req.Body.Close()
    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    // log request
    log.Printf("[%s] incoming HTTP request from %sn", req.Method, req.RemoteAddr)
    // check if we got subscription confirmation request
    if strings.Contains(string(body), 
""Type":"SubscriptionConfirmation"") {
        SubscriptionConfirmation(w, req, body)
    } else {
        GotRecords(w, req, body)
    }

}

Bu funksiya roʻyxatdan oʻtishni tasdiqlash soʻrovi yoki vebhuk kelganligini aniqlaydi. dan quyidagicha hujjatlar, agar ro'yxatdan o'tish tasdiqlansa, Post so'rovida quyidagi Json tuzilishi olinadi:

POST http://test.com HTTP/1.1
x-amz-sns-messages-type: SubscriptionConfirmation
content-type: application/json

{
    "Timestamp":"2019-12-26T19:29:12+03:00",
    "Type":"SubscriptionConfirmation",
    "Message":"You have chosen to subscribe to the topic $topic. To confirm the subscription you need to response with calculated signature",
    "TopicArn":"mcs2883541269|bucketA|s3:ObjectCreated:Put",
    "SignatureVersion":1,
    "Token":«RPE5UuG94rGgBH6kHXN9FUPugFxj1hs2aUQc99btJp3E49tA»
}

Bu so'rovga javob berish kerak:

content-type: application/json

{"signature":«ea3fce4bb15c6de4fec365d36bcebbc34ccddf54616d5ca12e1972f82b6d37af»}

Imzo quyidagicha hisoblanadi:

signature = hmac_sha256(url, hmac_sha256(TopicArn, 
hmac_sha256(Timestamp, Token)))

Agar veb-huk kelsa, Post so'rovining tuzilishi quyidagicha ko'rinadi:

POST <url> HTTP/1.1
x-amz-sns-messages-type: SubscriptionConfirmation

{ "Records":
    [
        {
            "s3": {
                "object": {
                    "eTag":"aed563ecafb4bcc5654c597a421547b2",
                    "sequencer":1577453615,
                    "key":"some-file-to-bucket",
                    "size":100
                },
            "configurationId":"1",
            "bucket": {
                "name": "bucketA",
                "ownerIdentity": {
                    "principalId":"mcs2883541269"}
                },
                "s3SchemaVersion":"1.0"
            },
            "eventVersion":"1.0",
            "requestParameters":{
                "sourceIPAddress":"185.6.245.156"
            },
            "userIdentity": {
                "principalId":"2407013e-cbc1-415f-9102-16fb9bd6946b"
            },
            "eventName":"s3:ObjectCreated:Put",
            "awsRegion":"ru-msk",
            "eventSource":"aws:s3",
            "responseElements": {
                "x-amz-request-id":"VGJR5rtJ"
            }
        }
    ]
}

Shunga ko'ra, so'rovga qarab, ma'lumotlarni qanday qayta ishlash kerakligini tushunishingiz kerak. Ko'rsatkich sifatida kirishni tanladim "Type":"SubscriptionConfirmation", chunki u obunani tasdiqlash so'rovida mavjud va vebhukda mavjud emas. POST so'rovida ushbu yozuvning mavjudligi/yo'qligi asosida dasturning keyingi bajarilishi funksiyaga o'tadi. SubscriptionConfirmation, yoki funksiyaga kiriting GotRecords.

Biz obunani tasdiqlash funksiyasini batafsil ko'rib chiqmaymiz, u ushbu maqolada keltirilgan printsiplarga muvofiq amalga oshiriladi. hujjatlar. Ushbu funktsiyaning manba kodini quyidagi manzilda ko'rishingiz mumkin loyiha git omborlari.

GotRecords funktsiyasi kiruvchi so'rovni tahlil qiladi va har bir Record ob'ekti uchun tashqi skriptni (uning nomi -script parametrida o'tkazilgan) parametrlari bilan chaqiradi:

  • paqir nomi
  • ob'ekt kaliti
  • harakat:
    • nusxa ko'chirish - agar original so'rovda EventName = ObjectCreated | PutObject | PutObjectCopy
    • o'chirish - agar asl so'rovda EventName = ObjectRemoved | Ob'ektni o'chirish

Shunday qilib, ta'riflanganidek, Post so'rovi bilan ilgak kelsa oliy, va -script=script.sh parametri boʻlsa, skript quyidagicha chaqiriladi:

script.sh  bucketA some-file-to-bucket copy

Shuni tushunish kerakki, ushbu veb-huk qabul qiluvchi server to'liq ishlab chiqarish yechimi emas, balki mumkin bo'lgan amalga oshirishning soddalashtirilgan namunasidir.

Ishga misol

Keling, fayllarni MCS-dagi asosiy paqirdan AWS-dagi zaxira paqirga sinxronlashtiramiz. Asosiy paqir myfiles-ash deb ataladi, zaxirasi myfiles-backup deb ataladi (AWS-dagi chelak konfiguratsiyasi ushbu maqola doirasidan tashqarida). Shunga ko'ra, fayl asosiy paqirga qo'yilganda, uning nusxasi zaxirada paydo bo'lishi kerak va u asosiydan o'chirilganda, u zaxirada o'chirilishi kerak.

Biz MCS bulutli xotirasi va AWS bulutli xotirasi bilan mos keladigan awscli yordam dasturidan foydalangan holda chelaklar bilan ishlaymiz.

ubuntu@ubuntu-basic-1-2-10gb:~$ sudo apt-get install awscli
Reading package lists... Done
Building dependency tree
Reading state information... Done
After this operation, 34.4 MB of additional disk space will be used.
Unpacking awscli (1.14.44-1ubuntu1) ...
Setting up awscli (1.14.44-1ubuntu1) ...

S3 MCS API ga kirishni sozlaymiz:

ubuntu@ubuntu-basic-1-2-10gb:~$ aws configure --profile mcs
AWS Access Key ID [None]: hdywEPtuuJTExxxxxxxxxxxxxx
AWS Secret Access Key [None]: hDz3SgxKwXoxxxxxxxxxxxxxxxxxx
Default region name [None]:
Default output format [None]:

AWS S3 API ga kirishni sozlaylik:

ubuntu@ubuntu-basic-1-2-10gb:~$ aws configure --profile aws
AWS Access Key ID [None]: AKIAJXXXXXXXXXXXX
AWS Secret Access Key [None]: dfuerphOLQwu0CreP5Z8l5fuXXXXXXXXXXXXXXXX
Default region name [None]:
Default output format [None]:

Keling, kirishlarni tekshiramiz:

AWS uchun:

ubuntu@ubuntu-basic-1-2-10gb:~$ aws s3 ls --profile aws
2020-07-06 08:44:11 myfiles-backup

MCS uchun buyruqni ishga tushirishda siz —endpoint-url-ni qo'shishingiz kerak:

ubuntu@ubuntu-basic-1-2-10gb:~$ aws s3 ls --profile mcs --endpoint-url 
https://hb.bizmrg.com
2020-02-04 06:38:05 databasebackups-0cdaaa6402d4424e9676c75a720afa85
2020-05-27 10:08:33 myfiles-ash

Kirildi.

Endi keling, kiruvchi kancani qayta ishlash uchun skript yozamiz, keling, uni s3_backup_mcs_aws.sh deb ataymiz.

#!/bin/bash
# Require aws cli
# if file added — copy it to backup bucket
# if file removed — remove it from backup bucket
# Variables
ENDPOINT_MCS="https://hb.bizmrg.com"
AWSCLI_MCS=`which aws`" --endpoint-url ${ENDPOINT_MCS} --profile mcs s3"
AWSCLI_AWS=`which aws`" --profile aws s3"
BACKUP_BUCKET="myfiles-backup"

SOURCE_BUCKET=""
SOURCE_FILE=""
ACTION=""

SOURCE="s3://${SOURCE_BUCKET}/${SOURCE_FILE}"
TARGET="s3://${BACKUP_BUCKET}/${SOURCE_FILE}"
TEMP="/tmp/${SOURCE_BUCKET}/${SOURCE_FILE}"

case ${ACTION} in
    "copy")
    ${AWSCLI_MCS} cp "${SOURCE}" "${TEMP}"
    ${AWSCLI_AWS} cp "${TEMP}" "${TARGET}"
    rm ${TEMP}
    ;;

    "delete")
    ${AWSCLI_AWS} rm ${TARGET}
    ;;

    *)
    echo "Usage: 
#!/bin/bash
# Require aws cli
# if file added — copy it to backup bucket
# if file removed — remove it from backup bucket
# Variables
ENDPOINT_MCS="https://hb.bizmrg.com"
AWSCLI_MCS=`which aws`" --endpoint-url ${ENDPOINT_MCS} --profile mcs s3"
AWSCLI_AWS=`which aws`" --profile aws s3"
BACKUP_BUCKET="myfiles-backup"
SOURCE_BUCKET="${1}"
SOURCE_FILE="${2}"
ACTION="${3}"
SOURCE="s3://${SOURCE_BUCKET}/${SOURCE_FILE}"
TARGET="s3://${BACKUP_BUCKET}/${SOURCE_FILE}"
TEMP="/tmp/${SOURCE_BUCKET}/${SOURCE_FILE}"
case ${ACTION} in
"copy")
${AWSCLI_MCS} cp "${SOURCE}" "${TEMP}"
${AWSCLI_AWS} cp "${TEMP}" "${TARGET}"
rm ${TEMP}
;;
"delete")
${AWSCLI_AWS} rm ${TARGET}
;;
*)
echo "Usage: ${0} sourcebucket sourcefile copy/delete"
exit 1
;;
esac
sourcebucket sourcefile copy/delete" exit 1 ;; esac

Serverni ishga tushiramiz:

ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ sudo ./s3-webhook -port 80 -
script scripts/s3_backup_mcs_aws.sh

Keling, bu qanday ishlashini ko'rib chiqaylik. orqali MCS veb-interfeysi test.txt faylini myfiles-ash paqiriga qo'shing. Konsol jurnallari vebhuk serveriga so'rov yuborilganligini ko'rsatadi:

2020/07/06 09:43:08 [POST] incoming HTTP request from 
95.163.216.92:56612
download: s3://myfiles-ash/test.txt to ../../../tmp/myfiles-ash/test.txt
upload: ../../../tmp/myfiles-ash/test.txt to 
s3://myfiles-backup/test.txt

AWS-dagi myfiles-zaxira paqirining mazmunini tekshirib ko'raylik:

ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ aws s3 --profile aws ls 
myfiles-backup
2020-07-06 09:43:10       1104 test.txt

Endi veb-interfeys orqali biz faylni myfiles-ash paqiridan o'chirib tashlaymiz.

Server jurnallari:

2020/07/06 09:44:46 [POST] incoming HTTP request from 
95.163.216.92:58224
delete: s3://myfiles-backup/test.txt

Paqir tarkibi:

ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ aws s3 --profile aws ls 
myfiles-backup
ubuntu@ubuntu-basic-1-2-10gb:~$

Fayl o'chiriladi, muammo hal qilinadi.

Xulosa va topshiriq

Ushbu maqolada ishlatiladigan barcha kodlar mening omborimda. Shuningdek, veb-huklarni ro'yxatdan o'tkazish uchun skriptlar va imzolarni hisoblash misollari mavjud.

Ushbu kod o'z faoliyatingizda S3 veb-huklaridan qanday foydalanishingiz mumkinligi haqidagi misoldan boshqa narsa emas. Avval aytganimdek, agar siz ishlab chiqarishda bunday serverdan foydalanishni rejalashtirmoqchi bo'lsangiz, hech bo'lmaganda asinxron ish uchun serverni qayta yozishingiz kerak: kiruvchi veb-huklarni navbatda (RabbitMQ yoki NATS) ro'yxatdan o'tkazing va u yerdan ularni tahlil qiling va qayta ishlang. ishchi ilovalari bilan. Aks holda, veb-huklar ommaviy ravishda kelganda, vazifalarni bajarish uchun server resurslarining etishmasligiga duch kelishingiz mumkin. Navbatlarning mavjudligi server va ishchilarni taqsimlash imkonini beradi, shuningdek, ishlamay qolganda takroriy vazifalar bilan bog'liq muammolarni hal qiladi. Shuningdek, jurnalni batafsilroq va standartlashtirilganga o'zgartirish tavsiya etiladi.

Omad tilaymiz!

Mavzu bo'yicha ko'proq o'qish:

Manba: www.habr.com

a Izoh qo'shish