Nimûneyek serîlêdana bûyer-rêvebirinê ya ku li ser tevnhevokên di hilanîna tiştên S3 ya Mail.ru Cloud Solutions de ye.

Nimûneyek serîlêdana bûyer-rêvebirinê ya ku li ser tevnhevokên di hilanîna tiştên S3 ya Mail.ru Cloud Solutions de ye.
Makîneya qehweyê Rube Goldberg

Mîmariya-rêveberiya bûyerê lêçûniya çavkaniyên ku têne bikar anîn zêde dike, ji ber ku ew tenê gava ku hewce ne têne çalak kirin. Gelek vebijark hene ku meriv vê yekê çawa bicîh bîne û wekî serîlêdanên karkeran sazûmanên ewr ên zêde neafirîne. Û îro ez ê ne li ser FaaS, lê li ser webhook biaxivim. Ez ê lêkolînek dozê ya birêvebirina bûyerê bi tevnhevokên hilanîna tiştan nîşan bidim.

Çend peyvan li ser hilanîna tiştan û webhooks. Hilberîna tiştan destûrê dide te ku hûn her daneyê di nav ewr de di forma tiştên ku bi S3 an API-ya din ve têne peyda kirin (li gorî pêkanînê) bi riya HTTP/HTTPS hilînin. Webhooks bi gelemperî bangewaziyên HTTP yên xwerû ne. Ew bi gelemperî ji hêla bûyerek ve têne rêve kirin, wekî mînakek kodek li depoyek an şîroveyek ku li ser blogek hatî şandin. Dema ku bûyerek diqewime, malpera bingehîn daxwazek HTTP ji URL-ya ku ji bo webhook-ê hatî destnîşan kirin dişîne. Wekî encamek, hûn dikarin bûyeran li ser malperek bikin ku çalakiyên li ser yekî din bikin (wiki). Di rewşê de ku malpera çavkaniyê hilanînek tiştek e, guhertinên di naveroka wê de wekî bûyeran tevdigerin.

Nimûneyên rewşên hêsan ên ku otomasyonek weha dikare were bikar anîn:

  1. Kopiyên hemî tiştan di hilanîna ewrek din de biafirînin. Pêdivî ye ku kopiyên "li ser firînê" werin afirandin, digel her zêdekirin an guhartina pelan.
  2. Afirandina otomatîkî ya rêze nimûnên pelên grafîkî, lêzêdekirina nîşaneyên avê li wêneyan, guheztinên din ên wêneyê.
  3. Agahdariya di derbarê hatina belgeyên nû de (mînakî, karûbarek hesabkerî ya belavkirî raporên li ewr bar dike, û çavdêriya darayî agahdariyan di derbarê raporên nû de werdigire, wan kontrol dike û analîz dike).
  4. Bûyerên piçek tevlihevtir, mînakî, afirandina daxwazek ji Kubernetes re, ku bi konteynerên pêwîst re podek çêdike, pîvanên peywirê jê re derbas dike, û konteynerê piştî pêvajoyê hilweşîne.

Mînakî, em ê guhertoyek peywira 1-ê çêbikin, dema ku guheztinên di kepçeya hilanînê ya Mail.ru Cloud Solutions (MCS) de ku bi karanîna tevnhookan têne bikar anîn di hilanîna tiştên AWS de têne hevdem kirin. Di rewşek barkirî ya rastîn de, divê xebata asynchron bi tomarkirina webhooks di dorê de were peyda kirin, lê ji bo peywira perwerdehiyê em ê bêyî wê bicîhkirinê bikin.

Scheme kar

Protokola danûstendinê bi hûrgulî tête diyar kirin rêberê webhooks S3 li ser MCS. Plana xebatê hêmanên jêrîn hene:

  • Xizmeta Weşanê, ku li kêleka hilanîna S3 ye û dema ku webnhook dişewite daxwazên HTTP diweşîne.
  • server WebhookA ku li daxwazên karûbarê weşanê li ser HTTP guhdarî dike û çalakiya guncan digire. Pêşkêşkar dikare bi her zimanî were nivîsandin, di mînaka me de em ê serverê di Go de binivîsin.

Taybetmendiyek pêkanîna webhookan di S3 API de qeydkirina servera wergirtina webhook-ê li ser karûbarê weşanê ye. Bi taybetî, servera wergirê webhook divê abonetiya peyamên karûbarê weşandinê bipejirîne (di pêkanînên din ên webhook de, bi gelemperî ne hewce ye ku abonetiyê were pejirandin).

Li gorî vê yekê, servera wergirtina webhook divê du karûbarên sereke piştgirî bike:

  • bersivê bidin daxwazek karûbarê weşanê ya ji bo pejirandina qeydkirinê,
  • bûyerên hatinê birêve bibin.

Sazkirina wergirê webhook

Ji bo xebitandina servera wergirtina webhook, hûn hewceyê serverek Linux-ê ne. Di vê gotarê de, ji bo nimûne, em mînakek virtual bikar tînin, ku em li ser MCS-ê bicîh dikin.

Nermalava pêwîst saz bikin û servera wergirtina webhook dest pê bikin.

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

Peldanka bi servera wergirtina webhook re klon bikin:

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.

Ka em serverê dest pê bikin:

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

Aboneya karûbarê weşangeriyê

Hûn dikarin servera wergirtina webhook-a xwe bi navgîniya API an navbeynkariya malperê tomar bikin. Ji bo sadebûnê, em ê bi navgîniya webê qeyd bikin:

  1. Biçe beşa kepçeyan di odeya kontrolê de.
  2. Em diçin hundurê kelê, ji bo ku em ê webhooks mîheng bikin, û li ser pêlavê bikirtînin:

Nimûneyek serîlêdana bûyer-rêvebirinê ya ku li ser tevnhevokên di hilanîna tiştên S3 ya Mail.ru Cloud Solutions de ye.

Herin tabloya Webhooks û lê zêde bike bikirtînin:

Nimûneyek serîlêdana bûyer-rêvebirinê ya ku li ser tevnhevokên di hilanîna tiştên S3 ya Mail.ru Cloud Solutions de ye.
Qadan dagirin:

Nimûneyek serîlêdana bûyer-rêvebirinê ya ku li ser tevnhevokên di hilanîna tiştên S3 ya Mail.ru Cloud Solutions de ye.

ID - navê webhook.

Bûyer - çi bûyeran bişînin. Em veguhestina hemî bûyerên ku dema ku bi pelan re dixebitin (zêdekirin û jêbirin) diqewimin destnîşan dikin.

URL - navnîşana servera wergirtina webhook.

Pêşgir/paşgira Parzûnê - Parzûnek ku destûrê dide te ku hûn tenê ji bo tiştên ku navên wan bi hin qaîdeyan re hevûdu dikin tevnhookan çêbikin. Mînakî, ji bo ku webhook tenê li ser pelên bi dirêjkirina .png bixebite, li Paşgira Parzûnê divê hûn "png" binivîsin.

Heya nuha, tenê portên 80 û 443 ji bo gihîştina servera wergirtina webhook têne piştgirî kirin.

Werin em çap bikin Hook lê zêde bike û em ê jêrîn bibînin:

Nimûneyek serîlêdana bûyer-rêvebirinê ya ku li ser tevnhevokên di hilanîna tiştên S3 ya Mail.ru Cloud Solutions de ye.
Hook lê zêde kir.

Pêşkêşkara wergirtina webhook di têketinan de pêşkeftina pêvajoya qeydkirina hookê nîşan dide:

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

Qeydkirin qediya. Di beşa pêş de, em ê bi hûrgulî algorîtmaya servera wergirtina webhook-ê binirxînin.

Danasîna servera webhook

Di mînaka me de, server di Go de hatî nivîsandin. Ka em prensîbên bingehîn ên xebata wê analîz bikin.

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

Fonksiyonên sereke bifikirin:

  • Ping() - rêyek ku bersivê dide URL / ping, pêkanîna herî hêsan a vekolînek zindî ye.
  • Webhook () - rêça sereke, URL/karkerê webhook:
    • qeydkirina li ser karûbarê weşangeriyê piştrast dike (diçe fonksiyona Tesdîqkirina Subscription),
    • tevnhookên hatinî desteser dike (fonksiyona Gorecords).
  • Fonksiyonên HmacSha256 û HmacSha256hex pêkanînên algorîtmayên şîfrekirinê yên HMAC-SHA256 û HMAC-SHA256 ne ku bi derketinê re wekî rêzek hejmarên hexadecimal ji bo hesabkirina îmzeyê ne.
  • sereke fonksiyona sereke ye, vebijarkên rêza fermanê digire û rêvebirên URL-ê tomar dike.

Vebijarkên rêzika fermanê ku ji hêla serverê ve têne pejirandin:

  • -port ew bendera ku server dê lê guhdarî bike ye.
  • -navnîşan navnîşana IP-ya ku server dê lê guhdarî bike ye.
  • -skrîpt - bernameyek derveyî ku li ser her çengek hatî gazî kirin.

Ka em hûrgulî li hin taybetmendiyan binihêrin:

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

}

Ev fonksiyon diyar dike ka ew daxwazek pejirandina qeydkirinê ye an webhook e. Wekî ku ji belgekirin, di doza pejirandina qeydkirinê de, avahiya Json ya jêrîn di daxwaznameya Postê de tê wergirtin:

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

Divê ev daxwaz bê bersivandin:

content-type: application/json

{"signature":«ea3fce4bb15c6de4fec365d36bcebbc34ccddf54616d5ca12e1972f82b6d37af»}

Li ku derê îmze wekî tê hesibandin:

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

Ger webhookek bigihîje, wê hingê avahiya Daxwaza Postê bi vî rengî xuya dike:

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

Li gorî vê yekê, li gorî daxwazê, hûn hewce ne ku hûn fêm bikin ka meriv çawa daneyê pêvajoyê dike. Min qeyd wekî nîşanker hilbijart "Type":"SubscriptionConfirmation", ji ber ku ew di daxwaza pejirandina abonetiyê de heye û di webhook de tune. Li ser bingeha hebûn/nebûna vê têketinê di daxwaza POST-ê de, pêkanîna bêtir bernameyê diçe fonksiyonê. SubscriptionConfirmation, an nav fonksiyonek GotRecords.

Em ê fonksiyona SubscriptionConfirmation bi hûrgulî nebînin; ew li gorî prensîbên ku di belgekirin. Hûn dikarin koda çavkaniyê ji bo vê fonksiyonê li vir bibînin depoyên git yên projeyê.

Fonksiyona GotRecords daxwaza hatinê pars dike û ji bo her tiştê Tomarê gazî skrîptek derveyî (ku navê wê di parametreya -scriptê de derbas bûye) bi pîvanên jêrîn dike:

  • navê kepçeyê
  • mifteya objeyê
  • çalakî:
    • kopî - heke di daxwaziya orîjînal de Navê bûyerê = ObjectCreated | PutObject | PutObjectCopy
    • jêbirin - heke di daxwaza eslî de ye EventName = ObjectRemoved | DeleteObject

Bi vî rengî, heke hookek bi daxwazek Postê tê, wekî ku tête diyar kirin mezintir, û parameter -script=script.sh wê hingê dê skrîpt wiha were gotin:

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

Pêdivî ye ku were fêm kirin ku ev servera wergirtina webhook ne çareseriyek hilberînek bêkêmasî ye, lê mînakek hêsan a pêkanîna gengaz e.

Mînaka xebatê

Werin em pelên kepçeya sereke ya li MCS-ê bi kepçeya hilanînê ya li AWS-ê re hevdeng bikin. Kevirê sereke jê re myfiles-ash tê gotin, ji kepçeya hilanînê re myfiles-backup tê gotin (veavakirina kelê di AWS de li derveyî çarçoveya vê gotarê ye). Li gorî vê yekê, gava ku pelek di kepçeya sereke de tê danîn, divê kopiya wê di hilanînê de xuya bibe, gava ku ew ji ya sereke were derxistin, divê di hilanînê de were jêbirin.

Em ê bi kepçeyan re bi karûbarê awscli re bixebitin, ku hem bi hilanîna ewr MCS û hem jî bi hilanîna ewr a AWS re hevaheng e.

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

Werin em gihîştina S3 MCS API-yê mîheng bikin:

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

Werin em gihîştina API-ya AWS S3 mîheng bikin:

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

Ka em gihîştinê kontrol bikin:

Ji AWS re:

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

Ji bo MCS, dema ku emrê dimeşîne, --endpoint-url lê zêde bike:

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

Gihîştin.

Naha em skrîptekê ji bo pêvajokirina çengê tê binivîsin, bila jê re bibêjin 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

Em serverê dest pê dikin:

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

Ka em kontrol bikin ka ew çawa dixebite. Bi rêya MCS web interface pelê test.txt li kepçeya myfiles-ash zêde bike. Têketinên di konsolê de destnîşan dikin ku daxwazek ji servera webhook re hate kirin:

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

Ka em naveroka kepçeya myfiles-backup-ê di AWS de kontrol bikin:

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

Naha, bi navgîniya tevnvîsê, pelê ji kepçeya myfiles-ash jêbirin.

Têketinên serverê:

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

Naveroka kulikê:

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

Pelê jêbirin, pirsgirêk çareser kirin.

Encam û ToDo

Hemî kodên ku di vê gotarê de têne bikar anîn ev e di depoya min de. Ji bo qeydkirina webhookan jî mînakên nivîsan û mînakên jimartina îmzeyan jî hene.

Ev kod ji mînakek wêdetir tiştek nîne ku hûn çawa dikarin di çalakiyên xwe de webhookên S3 bikar bînin. Wekî ku min di destpêkê de got, heke hûn plan dikin ku serverek wusa di hilberînê de bikar bînin, hûn bi kêmanî hewce ne ku serverê ji bo xebata asynchron ji nû ve binivîsin: webhookên hatinê di rêzek (RabbitMQ an NATS) de tomar bikin, û ji wir ew dikarin bêne pars kirin û ji hêla serîlêdanên karker ve têne pêvajoyê kirin. Wekî din, bi hatinek girseyî ya webhookan re, dibe ku hûn bi kêmbûna çavkaniyên serverê re rûbirû bibin da ku peywiran biqedînin. Hebûna rêzan dihêle hûn server û karkeran belav bikin, û her weha di bûyera têkçûn de pirsgirêkan bi peywirên dubare çareser bikin. Di heman demê de tê xwestin ku têketinê bi rengek berfirehtir û standardkirî biguhezînin.

Bextê te xweş bî

Li ser mijarê bêtir bixwînin:

Source: www.habr.com

Add a comment