Isang halimbawa ng application na hinimok ng kaganapan batay sa mga webhook sa S3 object storage na Mail.ru Cloud Solutions

Isang halimbawa ng application na hinimok ng kaganapan batay sa mga webhook sa S3 object storage na Mail.ru Cloud Solutions
Rube Goldberg coffee machine

Pinapataas ng arkitektura na hinimok ng kaganapan ang kahusayan sa gastos ng mga mapagkukunang ginamit dahil ginagamit lang ang mga ito sa sandaling kailangan ang mga ito. Maraming mga opsyon sa kung paano ipatupad ito at hindi lumikha ng mga karagdagang cloud entity bilang mga application ng manggagawa. At ngayon ay magsasalita ako hindi tungkol sa FaaS, ngunit tungkol sa mga webhook. Magpapakita ako ng isang halimbawa ng tutorial ng paghawak ng mga kaganapan gamit ang mga webhook ng imbakan ng bagay.

Ilang salita tungkol sa pag-iimbak ng bagay at mga webhook. Nagbibigay-daan sa iyo ang storage ng object na mag-imbak ng anumang data sa cloud sa anyo ng mga object, na maa-access sa pamamagitan ng S3 o isa pang API (depende sa pagpapatupad) sa pamamagitan ng HTTP/HTTPS. Ang mga webhook ay karaniwang mga custom na HTTP callback. Ang mga ito ay karaniwang na-trigger ng isang kaganapan, tulad ng code na itinutulak sa isang repositoryo o isang komento na nai-post sa isang blog. Kapag naganap ang isang kaganapan, nagpapadala ang pinagmulang site ng HTTP na kahilingan sa URL na tinukoy para sa webhook. Bilang resulta, maaari kang gumawa ng mga kaganapan sa isang site na mag-trigger ng mga pagkilos sa isa pa (wiki). Sa kaso kung saan ang source site ay isang object storage, ang mga kaganapan ay nagsisilbing mga pagbabago sa mga nilalaman nito.

Mga halimbawa ng mga simpleng kaso kung kailan maaaring gamitin ang naturang automation:

  1. Paglikha ng mga kopya ng lahat ng mga bagay sa isa pang cloud storage. Ang mga kopya ay dapat gawin sa mabilisang kapag ang mga file ay idinagdag o binago.
  2. Awtomatikong paggawa ng isang serye ng mga thumbnail ng mga graphic na file, pagdaragdag ng mga watermark sa mga litrato, at iba pang mga pagbabago sa imahe.
  3. Notification tungkol sa pagdating ng mga bagong dokumento (halimbawa, ang isang distributed accounting service ay nag-upload ng mga ulat sa cloud, at ang financial monitoring ay tumatanggap ng mga notification tungkol sa mga bagong ulat, sinusuri at sinusuri ang mga ito).
  4. Ang bahagyang mas kumplikadong mga kaso ay kinabibilangan, halimbawa, pagbuo ng isang kahilingan sa Kubernetes, na gumagawa ng isang pod na may mga kinakailangang container, nagpapasa ng mga parameter ng gawain dito, at pagkatapos ng pagproseso ay nagko-collapse ang container.

Bilang halimbawa, gagawa kami ng variant ng gawain 1, kapag ang mga pagbabago sa Mail.ru Cloud Solutions (MCS) object storage bucket ay naka-synchronize sa AWS object storage gamit ang mga webhook. Sa isang tunay na na-load na kaso, ang asynchronous na gawain ay dapat ibigay sa pamamagitan ng pagrerehistro ng mga webhook sa isang pila, ngunit para sa pagsasanay na gawain gagawin namin ang pagpapatupad nang wala ito.

Pamamaraan ng trabaho

Ang protocol ng pakikipag-ugnayan ay inilarawan nang detalyado sa Gabay sa mga S3 webhook sa MCS. Ang scheme ng trabaho ay naglalaman ng mga sumusunod na elemento:

  • Serbisyo sa paglalathala, na nasa gilid ng storage ng S3 at nagpa-publish ng mga kahilingan sa HTTP kapag na-trigger ang webnhook.
  • Webhook na tumatanggap ng server, na nakikinig sa mga kahilingan sa serbisyo ng pag-publish ng HTTP at nagsasagawa ng mga naaangkop na pagkilos. Maaaring isulat ang server sa anumang wika; sa aming halimbawa, isusulat namin ang server sa Go.

Ang isang espesyal na tampok ng pagpapatupad ng mga webhook sa S3 API ay ang pagpaparehistro ng server ng pagtanggap ng webhook sa serbisyo sa pag-publish. Sa partikular, ang server ng pagtanggap ng webhook ay dapat kumpirmahin ang subscription sa mga mensahe mula sa serbisyo sa pag-publish (sa iba pang mga pagpapatupad ng webhook, karaniwang hindi kinakailangan ang kumpirmasyon ng subscription).

Alinsunod dito, ang server ng pagtanggap ng webhook ay dapat na sumusuporta sa dalawang pangunahing operasyon:

  • tumugon sa kahilingan ng serbisyo sa pag-publish upang kumpirmahin ang pagpaparehistro,
  • iproseso ang mga papasok na kaganapan.

Pag-install ng webhook receiving server

Upang patakbuhin ang webhook receiving server, kailangan mo ng Linux server. Sa artikulong ito, bilang isang halimbawa, gumagamit kami ng virtual na instance na idini-deploy namin sa MCS.

I-install natin ang kinakailangang software at ilunsad ang webhook receiving server.

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) ...

I-clone ang folder gamit ang webhook receiving server:

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.

Simulan natin ang server:

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

Mag-subscribe sa serbisyo sa pag-publish

Maaari mong irehistro ang iyong webhook receiving server sa pamamagitan ng API o web interface. Para sa pagiging simple, magrerehistro kami sa pamamagitan ng web interface:

  1. Pumunta tayo sa seksyon ng mga balde sa control room.
  2. Pumunta sa bucket kung saan iko-configure namin ang mga webhook at mag-click sa gear:

Isang halimbawa ng application na hinimok ng kaganapan batay sa mga webhook sa S3 object storage na Mail.ru Cloud Solutions

Pumunta sa tab na Webhooks at i-click ang Magdagdag:

Isang halimbawa ng application na hinimok ng kaganapan batay sa mga webhook sa S3 object storage na Mail.ru Cloud Solutions
Punan ang mga patlang:

Isang halimbawa ng application na hinimok ng kaganapan batay sa mga webhook sa S3 object storage na Mail.ru Cloud Solutions

ID β€” ang pangalan ng webhook.

Kaganapan - kung aling mga kaganapan ang ipapadala. Itinakda namin ang paghahatid ng lahat ng mga kaganapan na nangyayari kapag nagtatrabaho sa mga file (pagdaragdag at pagtanggal).

URL β€” webhook na tumatanggap ng address ng server.

Ang filter prefix/suffix ay isang filter na nagbibigay-daan sa iyong bumuo ng mga webhook para lang sa mga bagay na ang mga pangalan ay tumutugma sa ilang partikular na panuntunan. Halimbawa, para ma-trigger lang ng webhook ang mga file na may extension na .png, sa Filter suffix kailangan mong isulat ang "png".

Sa kasalukuyan, ang mga port 80 at 443 lamang ang sinusuportahan para sa pag-access sa webhook receiving server.

Pindutin natin Magdagdag ng kawit at makikita natin ang mga sumusunod:

Isang halimbawa ng application na hinimok ng kaganapan batay sa mga webhook sa S3 object storage na Mail.ru Cloud Solutions
Idinagdag ni Hook.

Ipinapakita ng webhook receiving server sa mga log nito ang progreso ng proseso ng pagpaparehistro ng hook:

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

Nakumpleto ang pagpaparehistro. Sa susunod na seksyon, titingnan namin nang mas detalyado ang algorithm ng pagpapatakbo ng server ng pagtanggap ng webhook.

Paglalarawan ng webhook receiving server

Sa aming halimbawa, ang server ay nakasulat sa Go. Tingnan natin ang mga pangunahing prinsipyo ng pagpapatakbo nito.

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

Isaalang-alang ang mga pangunahing pag-andar:

  • Ping() - isang ruta na tumutugon sa pamamagitan ng URL/ping, ang pinakasimpleng pagpapatupad ng liveness probe.
  • Webhook() - pangunahing ruta, URL/webhook handler:
    • Kinukumpirma ang pagpaparehistro sa serbisyo sa pag-publish (pumunta sa function na Pagkumpirma ng Subscription),
    • pinoproseso ang mga papasok na webhook (function ng Gorecords).
  • Ang mga function na HmacSha256 at HmacSha256hex ay mga pagpapatupad ng HMAC-SHA256 at HMAC-SHA256 na mga algorithm ng pag-encrypt na may output bilang isang string ng mga hexadecimal na numero para sa pagkalkula ng lagda.
  • pangunahing ay ang pangunahing pag-andar, nagpoproseso ng mga parameter ng command line at nagrerehistro ng mga humahawak ng URL.

Mga parameter ng command line na tinanggap ng server:

  • -port ay ang port kung saan makikinig ang server.
  • -address - IP address na pakikinggan ng server.
  • -script ay isang panlabas na programa na tinatawag para sa bawat papasok na kawit.

Tingnan natin ang ilan sa mga function:

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

}

Tinutukoy ng function na ito kung dumating ang isang kahilingan para kumpirmahin ang pagpaparehistro o isang webhook. Tulad ng sumusunod mula sa dokumentasyon, kung nakumpirma ang pagpaparehistro, ang sumusunod na istraktura ng Json ay matatanggap sa kahilingan sa 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":"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Β»
}

Ang query na ito ay kailangang masagot:

content-type: application/json

{"signature":Β«ea3fce4bb15c6de4fec365d36bcebbc34ccddf54616d5ca12e1972f82b6d37afΒ»}

Kung saan ang pirma ay kinakalkula bilang:

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

Kung may dumating na webhook, ganito ang hitsura ng istraktura ng kahilingan sa Post:

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

Alinsunod dito, depende sa kahilingan, kailangan mong maunawaan kung paano iproseso ang data. Pinili ko ang entry bilang indicator "Type":"SubscriptionConfirmation", dahil ito ay nasa kahilingan sa pagkumpirma ng subscription at wala sa webhook. Batay sa presensya/kawalan ng entry na ito sa kahilingan ng POST, ang karagdagang pagpapatupad ng programa ay mapupunta sa function. SubscriptionConfirmation, o sa function GotRecords.

Hindi namin isasaalang-alang ang pagpapaandar ng SubscriptionConfirmation nang detalyado; ito ay ipinatupad ayon sa mga prinsipyong itinakda sa dokumentasyon. Maaari mong tingnan ang source code para sa function na ito sa project git repository.

Ang GotRecords function ay nag-parse ng papasok na kahilingan at para sa bawat Record object ay tumatawag ng isang panlabas na script (na ang pangalan ay naipasa sa -script parameter) kasama ang mga parameter:

  • pangalan ng balde
  • susi ng bagay
  • aksyon:
    • kopyahin - kung sa orihinal na kahilingan EventName = ObjectCreated | PutObject | PutObjectCopy
    • tanggalin - kung sa orihinal na kahilingan EventName = ObjectRemoved | DeleteObject

Kaya, kung dumating ang isang kawit na may kahilingan sa Post, gaya ng inilarawan sa itaas, at ang parameter -script=script.sh pagkatapos ay tatawagin ang script ng mga sumusunod:

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

Dapat itong maunawaan na ang webhook receiving server na ito ay hindi isang kumpletong solusyon sa produksyon, ngunit isang pinasimpleng halimbawa ng isang posibleng pagpapatupad.

Halimbawa ng trabaho

I-synchronize natin ang mga file mula sa pangunahing bucket sa MCS patungo sa backup na bucket sa AWS. Ang pangunahing bucket ay tinatawag na myfiles-ash, ang backup ay tinatawag na myfiles-backup (ang bucket configuration sa AWS ay lampas sa saklaw ng artikulong ito). Alinsunod dito, kapag ang isang file ay inilagay sa pangunahing bucket, ang kopya nito ay dapat lumitaw sa backup na isa, at kapag ito ay tinanggal mula sa pangunahing isa, dapat itong tanggalin sa backup na isa.

Makikipagtulungan kami sa mga bucket gamit ang awscli utility, na tugma sa parehong MCS cloud storage at AWS cloud storage.

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) ...

I-configure natin ang access sa S3 MCS API:

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]:

I-configure natin ang access sa AWS S3 API:

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]:

Suriin natin ang mga access:

Sa AWS:

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

Para sa MCS, kapag pinapatakbo ang command kailangan mong idagdag ang β€”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

Na-access.

Ngayon, magsulat tayo ng script para sa pagproseso ng papasok na kawit, tawagin natin itong 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=""
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

Simulan natin ang server:

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

Tingnan natin kung paano ito gumagana. Sa pamamagitan ng MCS web interface idagdag ang test.txt file sa myfiles-ash bucket. Ipinapakita ng mga console log na may ginawang kahilingan sa webhook server:

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

Tingnan natin ang mga nilalaman ng myfiles-backup bucket sa 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

Ngayon, sa pamamagitan ng web interface, tatanggalin namin ang file mula sa myfiles-ash bucket.

Mga log ng server:

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

Mga nilalaman ng bucket:

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

Ang file ay tinanggal, ang problema ay nalutas.

Konklusyon at ToDo

Ang lahat ng code na ginamit sa artikulong ito ay sa aking imbakan. Mayroon ding mga halimbawa ng mga script at mga halimbawa ng pagbibilang ng mga lagda para sa pagpaparehistro ng mga webhook.

Ang code na ito ay hindi hihigit sa isang halimbawa kung paano mo magagamit ang S3 webhooks sa iyong mga aktibidad. Tulad ng sinabi ko sa simula, kung plano mong gumamit ng ganoong server sa paggawa, kailangan mong isulat muli ang server para sa asynchronous na gawain: irehistro ang mga papasok na webhook sa isang pila (RabbitMQ o NATS), at mula doon i-parse ang mga ito at iproseso ang mga ito sa mga aplikasyon ng manggagawa. Kung hindi, kapag dumarating nang malaki ang mga webhook, maaari kang makatagpo ng kakulangan ng mga mapagkukunan ng server upang makumpleto ang mga gawain. Ang pagkakaroon ng mga pila ay nagpapahintulot sa iyo na ipamahagi ang server at mga manggagawa, pati na rin ang paglutas ng mga problema sa paulit-ulit na mga gawain sa kaso ng mga pagkabigo. Maipapayo rin na baguhin ang pag-log sa isang mas detalyado at mas standardized.

Good luck!

Higit pang pagbabasa sa paksa:

Pinagmulan: www.habr.com

Magdagdag ng komento