Shembulli i një aplikacioni të drejtuar nga ngjarjet mbi webhooks në magazinimin e objekteve S3 të Mail.ru Cloud Solutions

Shembulli i një aplikacioni të drejtuar nga ngjarjet mbi webhooks në magazinimin e objekteve S3 të Mail.ru Cloud Solutions
Makinë kafeje Rube Goldberg

Arkitektura e drejtuar nga ngjarjet rrit efikasitetin e burimeve të përdorura, sepse ato aktivizohen vetëm në momentin kur janë të nevojshme. Ka shumë mënyra për të realizuar këtë dhe për të mos krijuar më shumë entitete në re si aplikacione punëtor. Sot do të flas jo për FaaS, por për webhooks. Do të tregoj një shembuj praktik me përpunimin e ngjarjeve duke përdorur webhooks të objektit.

Një fjalë për objektet e ruajtjes dhe për webhooks. Objektet e ruajtjes lejojnë ruajtjen e çdo të dhëne në re në formën e objekteve, të cilat janë të qasshme përmes S3 ose API tjetër (varësisht nga implementimi) përmes HTTP/HTTPS. Webhooks (webhooks) në përgjithësi janë thirrje të personalizuara për përgjigje në HTTP. Zakonisht ato aktivizohen nga një ngjarje, për shembull, dërgimi i kodit në një depo ose një koment i publikuar në një blog. Kur ndodh një ngjarje, faqja burimore dërgon një kërkesë HTTP në URL-në e specifikuar për webhook, duke bërë që ngjarjet në një faqe të bëjnë veprime në një tjetër. Në rastin kur faqja burimore është një objekt i ruajtjes, ndryshimet në përmbajtjen e saj shërbejnë si ngjarje.wiki)

Shembuj të rasteve të thjeshta ku mund të përdoret një automatizim i tillë:

  1. Krijimi i kopjeve tĂ« tĂ« gjitha objekteve nĂ« njĂ« objekt tĂ« ruajtjes tjetĂ«r. Kopjet duhet tĂ« krijohen “nĂ« flakĂ«â€, gjatĂ« çdo shtimi ose ndryshimi tĂ« skedarĂ«ve.
  2. Krijimi automatik i serive të miniaturave të skedarëve grafikë, shtimi i ujëra të shenjave në fotografi, modifikime të tjera të imazheve.
  3. Njoftimi për mbërritjen e dokumenteve të reja (për shembull, një shërbim të shpërndarjes së kontabilitetit e ngarkon në re raportet, dhe monitorimi financiar merr njoftime për raportet e reja, i kontrollon dhe i analizon ato).
  4. Raste pak më të komplikuara parashikojnë, për shembull, formimin e një kërkese për Kubernetes, e cila krijon një pod me kontenierë të nevojshëm, i kalon atij parametrat e detyrës dhe pas përpunimit e mbyll kontenierin.

Si një shembull, do të realizojmë variantin e detyrës 1, kur ndryshimet në bucket-in e objektit të ruajtjes Mail.ru Cloud Solutions (MCS) përmes webhooks sinkronizohen në objektin e ruajtjes AWS. Në një rast me ngarkesë reale, duhet të parashikohet puna asinkrone përmes regjistrimit të webhooks në një radhë, por për detyrën edukative do ta realizojmë pa këtë.

Skema e punës

Protokolli i ndërveprimit është përshkruar në detaje në udhëzimin për S3-webhooks në MCS. Në skemën e punës ka këto elemente:

  • ShĂ«rbimi i publikimit, i cili ndodhet nĂ« anĂ«n e ruajtjes S3 dhe publikon kĂ«rkesa HTTP kur aktivizohet webnhook.
  • Serveri i pranimit tĂ« webhooks, i cili dĂ«gjon thirrjet e shĂ«rbimit tĂ« publikimit nĂ«pĂ«rmjet HTTP dhe kryen veprimet pĂ«rkatĂ«se. Serveri mund tĂ« shkruhet nĂ« çdo gjuhĂ«, nĂ« shembullin tonĂ« ne do tĂ« shkruajmĂ« serverin nĂ« Go.

Veçoria e implementimit tĂ« webhooks nĂ« S3 API — regjistrimi i serverit tĂ« pranimit tĂ« webhooks nĂ« shĂ«rbimin e publikimit. NĂ« veçanti, serveri i pranimit tĂ« webhooks duhet tĂ« konfirmojĂ« abonimin pĂ«r mesazhet e shĂ«rbimit tĂ« publikimit (nĂ« implementime tĂ« tjera tĂ« webhooks zakonisht nuk kĂ«rkohet konfirmimi i abonimit).

Prandaj, serveri i pranimit të webhooks duhet të mbështesë dy operacione kryesore:

  • tĂ« pĂ«rgjigjet ndaj kĂ«rkesĂ«s sĂ« shĂ«rbimit tĂ« publikimit pĂ«r konfirmimin e regjistrimit,
  • tĂ« pĂ«rpunojĂ« ngjarjet e ardhura.

Instalimi i serverit të pranimit të webhooks

Për të nisur serverin e pranimit të webhooks do të nevojitet një server Linux. Në këtë artikel, për shembull, përdorim një instancë virtuale, të cilën e vendosim në MCS.

Do të instalojmë softuerin e nevojshëm dhe do të nisim serverin e pranimit të webhooks.

ubuntu@ubuntu-basic-1-2-10gb:~$ sudo apt-get install git
Leximi paketet... Kryer
Ngritja e pemës së varësive
Leximi i informacionit të gjendjes... Kryer
Paketat e mëposhtme u instaluan automatikisht dhe nuk kërkohen më:
 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
Përdorni 'sudo apt autoremove' për t'i hequr ato.
Paketa të sugjeruara:
 git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui 
gitk gitweb git-cvs git-mediawiki git-svn
Paketa të REJA do të instalohen:
 git
0 e përmirësuar, 1 e instaluar për herë të parë, 0 për t'u hequr dhe 46 të pa përmirësuara.
Duhet të shkarkoni 3915 kB arkiva.
Pas kësaj operacioni, 32.3 MB hapësirë shtesë disku do të përdoret.
Merrni:1 http://MS1.clouds.archive.ubuntu.com/ubuntu bionic-updates/main 
amd64 git amd64 1:2.17.1-1ubuntu0.7 [3915 kB]
Marrë 3915 kB në 1s (5639 kB/s)
Duke zgjedhur paketën git të pa përzgjedhur më parë.
(Leximi i bazës të të dhënave ... 53932 skedarë dhe direktorë aktualisht të instaluar.)
Duke u përgatitur për të nxjerrë .../git_12.17.1-1ubuntu0.7_amd64.deb ...
Duke u nxjerrë git (1:2.17.1-1ubuntu0.7) ...
Duke u konfiguruar git (1:2.17.1-1ubuntu0.7) ...

Klonojmë dosjen me serverin e pranimit të webhooks:

ubuntu@ubuntu-basic-1-2-10gb:~$ git clone
https://github.com/RomanenkoDenys/s3-webhook.git
Klonimi në 's3-webhook'...
remote: Numërimi i objekteve: 48, përfunduar.
remote: Numërimi i objekteve: 100% (48/48), përfunduar.
remote: Kompresimi i objekteve: 100% (27/27), përfunduar.
remote: Totali 114 (delta 20), ripërdorur 45 (delta 18), paketë-ruajtur 66
Pranimi i objekteve: 100% (114/114), 23.77 MiB | 20.25 MiB/s, përfunduar.
Zgjidhja e dleteve: 100% (49/49), përfunduar.

Do ta nisnim serverin:

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

Abonimi në shërbimin e publikimit

Mund ta regjistrosh serverin tënd për pranimin e webhooks përmes API-së ose ndërfaqes web. Për thjeshtësi, do ta regjistrojmë përmes ndërfaqes web:

  1. Shkoi te seksioni i buketeve në kabinetin e menaxhimit.
  2. Hybëm në buketën për të cilën do të konfigurojmë wДbhooks dhe klikojmë mbi diellin:

Shembulli i një aplikacioni të drejtuar nga ngjarjet mbi webhooks në magazinimin e objekteve S3 të Mail.ru Cloud Solutions

Shkulemi në tabin Webhooks dhe klikojmë Shto:

Shembulli i një aplikacioni të drejtuar nga ngjarjet mbi webhooks në magazinimin e objekteve S3 të Mail.ru Cloud Solutions
Plotësojmë fushat:

Shembulli i një aplikacioni të drejtuar nga ngjarjet mbi webhooks në magazinimin e objekteve S3 të Mail.ru Cloud Solutions

ID — emri i webhooks.

Ngjarja — cilat ngjarje do tĂ« dĂ«rgohen. Ne i vunĂ« tĂ« gjitha ngjarjet qĂ« ndodhin gjatĂ« punĂ«s me skedarĂ«t (shtimi dhe fshirja).

URL — adresa e serverit pĂ«r pranimin e webhooks.

Filtri prefix/suffix — filtri qĂ« lejon krijimin e webhooks vetĂ«m pĂ«r objekte, emrat e tĂ« cilĂ«ve pĂ«rputhen me disa rregulla tĂ« caktuara. PĂ«r shembull, qĂ« webhook tĂ« aktivizohet vetĂ«m pĂ«r skedarĂ«t me zgjerim .png, nĂ« Filtri suffix duhet tĂ« shkruhet «png».

Aktualisht, mbështeten vetëm portet 80 dhe 443 për lidhjen me serverin e pranimit të webhooks.

Të klikojmë Shto hook dhe do të shohim të mëposhtmen:

Shembulli i një aplikacioni të drejtuar nga ngjarjet mbi webhooks në magazinimin e objekteve S3 të Mail.ru Cloud Solutions
Hook u shtua.

Serveri i pranimit të webhooks në logë tregon kalimin e procesit të regjistrimit të hook-it:

ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ sudo ./s3-webhook -port 80
2020/06/15 12:01:14 [POST] kërkesë HTTP e ardhur nga 
95.163.216.92:42530
2020/06/15 12:01:14 Mori 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 Generohet nënshkrimi i përgjigjes: 
3754ce36636f80dfd606c5254d64ecb2fd8d555c27962b70b4f759f32c76b66d

Regjistrimi përfundoi. Në seksionin e ardhshëm do të shqyrtojmë me detaje algoritmin e punës së serverit për pranimin e webhooks.

Përshkrimi i serverit për pranimin e webhooks

Në shembullin tonë, serveri është shkruar në Go. Le të shqyrtojmë parimet kryesore të punës së tij.

package main

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

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

// Dërgo konfirmimin e abonimit
func SubscriptionConfirmation(w http.ResponseWriter, req *http.Request, body []byte) {
}

// Dërgo konfirmimin e abonimit
func GotRecords(w http.ResponseWriter, req *http.Request, body []byte) {
}

// Probe e gjallërisë
func Ping(w http.ResponseWriter, req *http.Request) {
    // log kërkesën
    log.Printf("[%s] kërkesë HTTP Ping e ardhur nga %sn", req.Method, req.RemoteAddr)
    fmt.Fprintf(w, "Pongn")
}

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

func main() {

    // merr argumentet e linjës komandës
    bindPort := flag.Int("port", 80, "numri midis 1-65535")
    bindAddr := flag.String("address", "", "adresa IP në formatin e pikave")
    flag.StringVar(&actionScript, "script", "", "skripti i jashtëm për të ekzekutuar")
    flag.Parse()

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

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

Le të shqyrtojmë funksionet kryesore:

  • Ping() — ruta qĂ« pĂ«rgjigjet nĂ« URL/ping, implementimi mĂ« i thjeshtĂ« i probe-s sĂ« gjallĂ«risĂ«.
  • Webhook() — ruta kryesore, pĂ«rpunuesi i URL/webhook:
    • konfirmon regjistrimin nĂ« shĂ«rbimin e publikimit (kalon nĂ« funksionin SubscriptionConfirmation),
    • pĂ«rpunon webhooks e ardhura (funksioni GotRecords).
  • Funksionet HmacSha256 dhe HmacSha256hex — implementimet e algoritmeve tĂ« enkriptimit HMAC-SHA256 dhe HMAC-SHA256 me daljen si njĂ« varg numrash heksadecimal pĂ«r llogaritjen e nĂ«nshkrimit.
  • main — funksioni kryesor, pĂ«rpunon parametrat e linjĂ«s komandĂ«s dhe regjistron pĂ«rpunuesit e URL.

Parametrat e linjës komandës që pranon serveri:

  • -port — porta, mbi tĂ« cilĂ«n serveri do tĂ« dĂ«gjoi.
  • -address — Adresa IP, qĂ« do tĂ« dĂ«gjoi serveri.
  • -script — programi i jashtĂ«m qĂ« thirret pĂ«r çdo hook tĂ« ardhur.

Le të shqyrtojmë në detaje disa funksione:

//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)
    }

}

Ky funksion pĂ«rcakton se çfarĂ« ka ardhur — njĂ« kĂ«rkesĂ« pĂ«r konfirmimin e regjistrimit ose njĂ« webhook. Siç tregohet nga dokumentacion, nĂ« rastin e konfirmimit tĂ« regjistrimit, struktura e mĂ«poshtme JSON vjen nĂ« kĂ«rkesĂ«n Post:

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":"Keni zgjedhur të abonoheni në temën $topic. Për të konfirmuar abonimin duhet të përgjigjeni me nënshkrimin e llogaritur",
    "TopicArn":"mcs2883541269|bucketA|s3:ObjectCreated:Put",
    "SignatureVersion":1,
    "Token":"RPE5UuG94rGgBH6kHXN9FUPugFxj1hs2aUQc99btJp3E49tA"
}

Në këtë kërkesë duhet të përgjigjen:

content-type: application/json

{"signature":"ea3fce4bb15c6de4fec365d36bcebbc34ccddf54616d5ca12e1972f82b6d37af"}

Ku nënshkrimi llogaritet si:

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

Nëse vjen një webhook, struktura e kërkesës Post duket kështu:

POST  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"
            }
        }
    ]
}

Prandaj, në varësi të kërkesës, duhet të kuptohet se si të përpunohen të dhënat. Kam zgjedhur si tregues regjistrimin "Type":"SubscriptionConfirmation", pasi ajo është e pranishme në kërkesën për konfirmimin e abonimit dhe nuk është e pranishme në webhook. Në varësi të pranishmërisë/mungesës së kësaj shënimi në kërkesën POST, ekzekutimi i mëtejshëm i programit kalon ose në funksionin SubscriptionConfirmation, ose në funksionin GotRecords.

Funksioni SubscriptionConfirmation nuk do ta shqyrtojmë me hollësi, ai është realizuar sipas parimeve të paraqitura në dokumentacion. Mund të shqyrtoni kodin burimor të këtij funksioni në repo git të projektit.

Funksioni GotRecords analizon kërkesën e ardhshme dhe për çdo objekt Record thërret skriptin e jashtëm (emri i të cilit është dhënë në parametrin -script) me parametrat:

  • emri i bucket-it
  • çelĂ«si i objektit
  • veprimi:
    • copy — nĂ«se nĂ« kĂ«rkesĂ«n e burimit EventName = ObjectCreated | PutObject | PutObjectCopy
    • delete — nĂ«se nĂ« kĂ«rkesĂ«n e burimit EventName = ObjectRemoved | DeleteObject

Pra, nëse erdhi një hook me kërkesën Post, siç u përmend më sipër, dhe parametrin -script=script.sh atëherë skripti do të thirret në këtë mënyrë:

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

Duhet të kuptohet se ky server që pranon webhook është një zgjidhje e pa përfunduar prodhimi, por një shembull i thjeshtë i një zbatimi të mundshëm.

Një shembull i punës

Do tĂ« bĂ«jmĂ« sinkronizimin e skedarĂ«ve tĂ« bucket-it kryesor nĂ« MCS nĂ« bucketin rezervĂ« nĂ« AWS. Bucket-i kryesor quhet myfiles-ash, rezervi — myfiles-backup (konfigurimi i bucket-it nĂ« AWS tejkalon kĂ«tĂ« artikull). Prandaj, kur njĂ« skedar vendoset nĂ« bucket-in kryesor, njĂ« kopje e tij duhet tĂ« shfaqet nĂ« rezervĂ«, kur hiqet nga kryeso, duhet tĂ« hiqet nĂ« rezervĂ«.

Do të punojmë me bucket-at duke përdorur utilitarin awscli, i cili është i përshtatshëm si për ruajtjen në re MCS ashtu edhe për ruajtjen në re AWS.

ubuntu@ubuntu-basic-1-2-10gb:~$ sudo apt-get install awscli
Duke lexuar listat e paketave... U përfundua
Duke ndërtuar pemën e varësive
Duke lexuar informacionin e gjendjes... U përfundua
Pas kësaj operacioni, 34.4 MB hapësirë shtesë do të përdoret.
Duke u hapur awscli (1.14.44-1ubuntu1) ...
Duke e vendosur awscli (1.14.44-1ubuntu1) ...

Të konfiguroni qasjen në API S3 MCS:

ubuntu@ubuntu-basic-1-2-10gb:~$ aws configure --profile mcs
AWS Access Key ID [None]: hdywEPtuuJTExxxxxxxxxxxxxx
AWS Secret Access Key [None]: hDz3SgxKwXoxxxxxxxxxxxxxxxxxx
Emri i rajonit të parazgjedhur [None]:
Format i daljes së parazgjedhur [None]:

Të konfiguroni qasjen në API S3 AWS:

ubuntu@ubuntu-basic-1-2-10gb:~$ aws configure --profile aws
AWS Access Key ID [None]: AKIAJXXXXXXXXXXXX
AWS Secret Access Key [None]: dfuerphOLQwu0CreP5Z8l5fuXXXXXXXXXXXXXXXX
Emri i rajonit të parazgjedhur [None]:
Format i daljes së parazgjedhur [None]:

Të kontrollojmë qasjet:

Për AWS:

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

PĂ«r MCS, kur ekzekutohet komandĂ«n duhet tĂ« shtoni —endpoint-url:

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

Qasja është marrë.

Tani do të shkruajmë një skript për të trajtuar webhook-un e ardhshëm, do ta quajmë s3_backup_mcs_aws.sh

#!/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

Nisni serverin:

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

Të kontrollojmë se si do të funksionojë. Përmes ndërfaqes në web MCS do të shtojmë skedarin test.txt në bucket-in myfiles-ash. Në log-un në konsolë shihet se një kërkesë është bërë në serverin e webhook-eve:

2020/07/06 09:43:08 [POST] kërkesë HTTP e ardhshme nga 
95.163.216.92:56612
shkarkimi: s3://myfiles-ash/test.txt në ../../../tmp/myfiles-ash/test.txt
ngarkimi: ../../../tmp/myfiles-ash/test.txt në 
s3://myfiles-backup/test.txt

Të kontrollojmë përmbajtjen e bucket-it myfiles-backup në AWS:

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

Tani do të heqim skedarin nga bucket-i myfiles-ash përmes ndërfaqes në web.

Log-et e serverit:

2020/07/06 09:44:46 [POST] kërkesë HTTP e ardhshme nga 
95.163.216.92:58224
fshim: s3://myfiles-backup/test.txt

Përmbajtja e bucket-it:

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

Skedari është hequr, detyra është zgjidhur.

Përfundimi dhe ToDo

I gjithë kodi i përdorur në këtë artikull ndodhet në deponinë time. Aty janë gjithashtu shembuj skriptesh dhe shembuj numërimi të nënshkrimeve për regjistrimin e webhook-eve.

Ky këtij kodi është vetëm një shembull se si mund të përdoren webhooks S3 në aktivitetin tuaj. Siç thashë në fillim, nëse planifikoni të përdorni këtë server në prodhim, është thelbësore të rishkruani serverin për punë asinkrone: webhooks që vijnë duhet të regjistrohen në një radhë (RabbitMQ ose NATS), dhe nga aty të përpunohen nga aplikacionet punëtore. Në të kundërt, nëse ka një fluks masiv të webhooks, mund të përballeni me mungesë burimesh në server për të përfunduar detyrat. Prania e radhëve lejon që serveri dhe punëtorët të shpërndahen, si dhe të zgjidhen problemet me ripërsëritjen e detyrave në rast dështimi. Gjithashtu, është e preferueshme të ndryshoni regjistrimin në një formë më të detajuar dhe më të standardizuar.

Suksese!

Lexo më shumë mbi këtë temë:

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster