How to handle double request, so the API still idempotent

Поделиться
HTML-код
  • Опубликовано: 23 дек 2024

Комментарии • 135

  • @gchannelthedayyanto2604
    @gchannelthedayyanto2604 Месяц назад +76

    Siapa yang kaget suaranya jadi English?😂

    • @ProgrammerZamanNow
      @ProgrammerZamanNow  Месяц назад +6

      Google udah fitur auto dubbing

    • @dwikyputra1881
      @dwikyputra1881 Месяц назад +4

      iya lagi wkwk, tapi bagus jadinya bisa ngereach penonton luar indonesia juga

    • @tegarpratama7389
      @tegarpratama7389 Месяц назад +1

      itu pake tools apa ya? wkwk

    • @rifki2086
      @rifki2086 Месяц назад +2

      Wkwk we baru tau ternyata bisa pilih bahasanya😂

    • @ikmalilbirri8895
      @ikmalilbirri8895 Месяц назад

      ternyata tidak sendiri wkwk

  • @abuhabibah8448
    @abuhabibah8448 Месяц назад +15

    Cara yg lebih elegan adlh dgn melakukan caching transaksi. BE akan menyimpan transaksi d chace. Jika transaksi selesai (sukses ataupun gagal) maka transaksi dihapus dr cache. Atau jika sdh lewat jangka waktu tertentu maka transaksi dihapus dr cache. Dan yg disimpan d cache cukup hasil hash dr data2 yg dikirimkan.

    • @adninsijawa445
      @adninsijawa445 Месяц назад +2

      User call api POST, lalu cache di redis, jika sukses maka hapus data di redis, begitukah?
      Jika sudah sukses lalu user call api tersebut lagi, apa yang terjadi?

    • @adninsijawa445
      @adninsijawa445 Месяц назад +1

      Tapi jika dihapusnya berdasarkan jangka waktu tertentu, problem tersebut solved

    • @abuhabibah8448
      @abuhabibah8448 Месяц назад

      @@adninsijawa445 yes... Semacam ini

    • @rabi7331
      @rabi7331 Месяц назад

      @@adninsijawa445 biasanya disimpan dalam jangka waktu tertentu

    • @bakajwd697
      @bakajwd697 Месяц назад +1

      bener.. saya nerapin ini. karna, darimana kita tau itu tidak disengaja, atau memang mau insert 2x? kalo cuma andelin check di db datanya exist atau ga, masi ada possibility jg dia double insert

  • @kharismaster1
    @kharismaster1 11 дней назад

    data ganda seperti ini sering saya temui karena efek bouncing dari device user, biasanya terlihat dari timestamp dari data yang tersimpan, waktunya sama atau berdekatan. biasa terjadi kalau unique key bukan diatur dari database langsung, tetapi dari aplikasi. Data yang terkirim karena bouncing biasanya akan lolos dari pemeriksaan karena ketika diproses verifikasi, dua-duanya akan memeriksa hal yang sama diwaktu bersamaan atau berdekatan. untuk kasus seperti ini saya membuat form post memiliki id unik yang hanya bisa dipakai sekali

  • @ilhamsa01
    @ilhamsa01 Месяц назад +10

    practice yang aku tau bisanya pake header "Idempotency-Key" yang digenerate di client, terus di store di table Request... setiap request POST yang masuk ke api akan selalu check table ini untuk memastikan requestnya ga double...

    • @bakajwd697
      @bakajwd697 Месяц назад +1

      apakah idempotency keynya uuid aja?
      kalau iya, gimana kalau requestnya timeout?
      user/client akan retry, otomatis keynya ke generate baru kan? masih possible double insert

    • @ilhamsa01
      @ilhamsa01 Месяц назад

      @@bakajwd697 iya mas pake uuid sebagai keynya, ketika user retry dia tetap pake key yg sama, kecuali di refresh halaman, atau ulangi prosesnya dari awal ...

    • @ilhamsa01
      @ilhamsa01 Месяц назад

      @@bakajwd697 iya mas keynya pake uuid, ketika user retry tetap pake key yang sama, kecual user refresh halaman atau ulangin prosesnya dari awal...

    • @ilhamsa01
      @ilhamsa01 Месяц назад

      @@bakajwd697 saya tadi reply kok hilang ya replynya

    • @ilhamsa01
      @ilhamsa01 Месяц назад

      ​@@bakajwd697 iya mas key nya pake uuid, kalau retry masih pake key yang sama mas, kecuali user refresh halaman atau ulangi prosesnya dari awal

  • @Rizkiaqa
    @Rizkiaqa 19 дней назад

    Saya punya tambahan ide.
    Untuk button save/insert, saat klik langsung dibuat disabled aja. Kalau aku suka test button dengan double klik 😊

  • @mawiwijna
    @mawiwijna Месяц назад +1

    Harus didefinisikan dahulu kondisi yang menyebabkan 2 objek/data adalah sama (equal). Kemudian, sebelum Backend memproses insert, harus dilakukan dulu pengecekan terkait kesamaan objek yang akan di-insert dengan objek-objek yang sudah eksis di database. Jika ada kesamaan objek yang akan di-insert dengan objek yang sudah eksis di database, maka muncul peringatan.

    • @ProgrammerZamanNow
      @ProgrammerZamanNow  Месяц назад

      selama ada unique kolom, gak masalah, asal jangan tidak ada unique column, karena kalo request datang bareng2, maka secara otomatis dua dua nya waktu ngecek tidak akan dapat data, jadi dianggap masih kosong datanya, akhirnya dua dua nya akan create data baru

  • @mabdazizalfian715
    @mabdazizalfian715 Месяц назад +1

    yg sederhana memang pake unik key, tinggal check klo data nya blum ada maka create jika udah ada maka ubah jadi update untuk mereplace.

  • @MuhammadIlyas-om2jw
    @MuhammadIlyas-om2jw Месяц назад

    Sebenarnya idempotent di frontend ini simple, setiap request selalu buat state loading dan disable button untuk submit datanya, lalu clear form setelah prosesnya berhasil di submit, jadi kejadian double click dan ngirim data yang sama seharusnya ngga ada. Cuma terkadang buat frontend engineer yang kurang teliti, bisa aja state loading atau disablenya kelupaan, nah mungkin idempotent key bisa dibuat untuk prevent itu. Nah dengan case kaya gini, itulah kenapa unit test frontend ini perlu di implement.

    • @ProgrammerZamanNow
      @ProgrammerZamanNow  Месяц назад

      jangan terlalu percaya request dari FE, apalagi di html nya, bisa gampang diakalin misal di inspect element untuk enabled lagi form nya

  • @MartinCode-f8n
    @MartinCode-f8n Месяц назад +7

    ijin nimbrung,
    untuk POST create sebaiknya pakai request_id (di body) jadi jika user misal di FE nya klik button save 2x itu akan mengirimkan request_id yang sama sehingga di BE bisa memproses itu sebagai data yang sama

    • @sofyanmaulana3804
      @sofyanmaulana3804 Месяц назад +1

      @@MartinCode-f8n akhirnya, cuman baca komen ini bisa paham harus gimana, baca komen yang lain kurang cocok untuk newbie :' wkwk

    • @ProgrammerZamanNow
      @ProgrammerZamanNow  Месяц назад +3

      ini akan jadi PR tambahan, karena BE harus maintain request_id nya, apalagi request banyak banget, maka harus siapin tabel khusus untuk menyimpan data request_id nya, dan ini gak scale , lebih baik fokus di unique column di tabel nya saja

  • @abuhabibah8448
    @abuhabibah8448 Месяц назад +6

    Lebih baik tambah satu kolom yg isinya hasil hash dari kolom2 yg di insert (post) dan tipe kolom tersebut hrs unik.

    • @dolanan5039
      @dolanan5039 Месяц назад +2

      Biasanya pake apa hashingnya ? Soalnya kalo datanya besar kan proses hashingnya makan CPU juga

    • @seigaish
      @seigaish Месяц назад

      @@dolanan5039 klo hashnya di sisi client nya gmana bang?

    • @andhanautama1452
      @andhanautama1452 25 дней назад

      @@dolanan5039 md5 aja pak, gak terlalu berat kayak nya

  • @gunawanmigi2637
    @gunawanmigi2637 Месяц назад +3

    Yup ,bener bnget.. kembali lagi ke case..
    Ku pernah buat apps penjualan,
    Ad case dimana cust mau buat invoice based on po.. di po ad 2 barang yg sama tpi beda record tpi qty beda..
    Mereka maunya inputnya sma persis di PO (2record).
    Jdi emang begitu wkwkwkw 😂😂😂

    • @bagusSetyawan95
      @bagusSetyawan95 Месяц назад

      ini sih case bikin bum waktu kedepannya 😁

    • @dwikyrizkya
      @dwikyrizkya Месяц назад

      aku pernah juga om case begini, akhirnya bikin sistem konfirmasi aja. di UI, user dikasih prompt kalo POST request nya ada kemungkinan double request (dikasih restriction aja misalnya kalo request sebelumnya jarak terlalu deket, etc.) kalo user nya ok, dia konfirmasi dan UI akan kirim ulang request yg disertai sebuah flagging

  • @fahrizkyputra6551
    @fahrizkyputra6551 Месяц назад +11

    laravel bisa pake firstOrCreate atau updateOrCreate

  • @arisudarma7569
    @arisudarma7569 Месяц назад +1

    Coba baca konsep Atomic Lock, saya sering terapin di project, terutama kalau pakai Laravel udah ada fiturnya

  • @matarider1441
    @matarider1441 Месяц назад +1

    terimakasih ilmunya mas..

  • @andinofaturahman3649
    @andinofaturahman3649 Месяц назад +3

    double request kemungkinan besar race condition juga,

  • @falahudinhalimshariski8358
    @falahudinhalimshariski8358 Месяц назад +1

    bisa juga pakai update and insert seperti di mongoDB, update kalau sudah ada datanya, insert kalau belum ada datanya

  • @hafidhpradipta811
    @hafidhpradipta811 Месяц назад

    kalo misal fe nya pake react atau js framework yg lain. sesimple dibuat state loading buttonnya (ga bisa di klik hingga response selesai) dihandle dari sisi FE. nah tapi resiko juga sih misal manipulasi kode html atau js sehingga mekanisme state loading ga jalan atau yg aneh kondisi race dimana ada multi device masukin inputan yg sama dan dua2 nya berhasil. idealnya emg implement BE nya jga.

    • @ProgrammerZamanNow
      @ProgrammerZamanNow  Месяц назад

      walalupun sudah dijaga di FE, tetep BE harus jaga juga, karena FE gampang di manipulasi oleh user, karena bisa di edit misal via inspect element

    • @kucingmania9983
      @kucingmania9983 11 дней назад

      Saya juga sudah implementasikan baik menambahkan kolom unique sesuai video, tetapi syaa generate idempotent key di FE, hasil masih double.. karena setiap klik idempotentnya generate key baru. Mohon arahannya

  • @enjun2071
    @enjun2071 Месяц назад

    dulu ngide pake rate limit di middleware khusus case beginian wkwk, jadi di middleware check berdasarkan endpoint dan user_id dibatasin max 1x

  • @laluisariat-tamimi1511
    @laluisariat-tamimi1511 14 дней назад +1

    Saya seorang backend,
    Gimana kondisi nya gini
    Product punya kolom barcode_awal, nama, dan price
    Jadi setiap user klik send untuk input barang maka akan di simpan oleh backend ke tabel baru, dimana tabel baru tersebut mempunyai kolom baru yaitu new_barcode (uniq) ini di generate otomatis backend
    Saya punya masalah karena latensi tinggi user fe nya sering ngirim request lebih dari 1 dalam detik yang sama
    Saya sudah bantu di backend dengan nambahin validasi redis, dengan penanda value barcode_awal
    Saya check ip dan old barcode jika ada di chace dalam range waktu maka tolak, bahkan saya menggunakan throttle juga untuk api nya tapi masih saja kebobolan double request yg masuk ke tabel yg bisa kita lihat dari kolom barcode awal punya value yg sama
    Disini saya tidak memberikan uniq ke barcode_awal karena ada beberapa barang yang memang sama barcode_awalnya
    Seperti ac, ac luar dan ac dalam adalah 2 barang yg terpisah dengan 1 barcode_awal
    Mohon solusinya pak

  • @jenn9233
    @jenn9233 Месяц назад +1

    kalo di prisma orm pake upsert ya pak? bisa cek kalo ada data dengan sku yang sama replace alias update kalo belum ada create

  • @Dymagination2030
    @Dymagination2030 Месяц назад +2

    dulu pernah dapet kasus begini karena FEnya ga mau ubah (karena di apinya kalo dengan req sama akan muncul validasi duplicate) akhirnya, tampung respon pertama di redis, jika dalam waktu dekat ada request yang sama, jadikan response pertama di response kedua, jadi di FE seperti meruquest 1 aja

    • @jenn9233
      @jenn9233 Месяц назад +1

      Kenapa malah terlihat ribet ya? Apakah dengan menggunakan state loading untuk melakukan disabled button tidak mengatasi?

  • @bakajwd697
    @bakajwd697 Месяц назад +1

    1. Darimana tau itu ga disengaja, atau emang sengaja mau insert 2x?
    2. kenapa demonya sepsifik kasi usecase e-commerce? apaka ini titipan ordal kah? harusnya judulnya ganti. Handle double request pada E-COMMERCE 🤗
    di issue / questionnya nanyain bestpractice... at least ada jg scenario2 lain... kaya timeout, ga punya "SKU", disengaja atau ga disengaja, dll
    so, what is the best practice sir?

    • @AmbriBlack
      @AmbriBlack Месяц назад

      Nggak ada best practice sepertinya, karena kuncinya adalah di keunikan value dari data yang dikirim.

    • @bakajwd697
      @bakajwd697 Месяц назад

      @@AmbriBlack tapi ini udah jadi issue yg umum pak. kalau yg di video kan mengandalkan unique constraint dari DB. sementara ada use case lain dimana secara data emang ga masalah kalau datanya dobel. mungkin karena emang disengaja mau buat datanya lebih dari satu aja gitu..
      nah, tapi dobel yang ga disengaja karena faktor lain gimana validasinya?

    • @AmbriBlack
      @AmbriBlack Месяц назад

      @@bakajwd697 ya susah juga sih karena kebanyakan pada validasi unique data, ya meskipun misal ada cara mungkin kayak rate limiter tapi kadang itu juga nggak membantu.
      Kemungkinan cara - cara yang udah ada cuman bisa meminimalkan kesalahan bukan menghilangkan sepenuhnya.

    • @dimaswel
      @dimaswel Месяц назад

      @@bakajwd697 itu kayanya banyak solusinya, di vidio itu bisa pakai tambahan kolom buat handlenya, bisa aja lu bikin unique tapi nanti kl casenya ky yg di video itu ya bakal kebingungan usernya knp error sebetulnya bisa pake prefix juga pas insert

  • @arifsubarkah9569
    @arifsubarkah9569 Месяц назад

    bikin part 2 pak, untuk case proses transaksi.

  • @berthojoris
    @berthojoris Месяц назад +2

    Eloquent laravel punya Upserts yang handling case ini nih 💥

    • @brainplusplus1
      @brainplusplus1 Месяц назад +1

      tapi "kelemahannya" ya harus di define primary atau unique key, kalau enggak, gak bakalan jalan upsertnya

    • @berthojoris
      @berthojoris Месяц назад

      @@brainplusplus1 ia define aja skunya

  • @glennsteven7420
    @glennsteven7420 Месяц назад

    di beberapa bahasa pemograman bisa gunain upsert jika di support

  • @ilhampahrurroji4006
    @ilhampahrurroji4006 Месяц назад +1

    kang eko saya izin me re design website programmer zaman now untuk belajar mengimplementasikan hasil belajar saya, apakah boleh? kalo gak boleh gak apa2

  • @pandathedeveloper6660
    @pandathedeveloper6660 Месяц назад

    pak eko, saya request tutorial setup environment di VPS pak yang production ready 🙏

  • @pramusintokhanif5979
    @pramusintokhanif5979 Месяц назад

    bisa di DB nya pakai composite key, atau uniqe kolom seperti yang dijelaskan di video

  • @regiismayanapratama5738
    @regiismayanapratama5738 Месяц назад +1

    Terimakasih pak Eko. Mau tanya pak, kalau ingin idempotent tapi ada kemungkinan racing condition pada method post. Gimana ya cara handle nya?

    • @IbrahimAkbar
      @IbrahimAkbar Месяц назад

      mungkin bisa menggunakan count data terakhir sebagai unique id. contoh user A sudah input 1, cek dengan db count row, result 1, data yg kedua yg akan diinsert adalah: count + 1 = 2, maka unique id = user uuid + 2. dalam kondisi race condition, 2 data yg diinsert akan sama unique id nya: user uuid + 2 (karena pengecekan db count terakhir sama2 count = 1) kalau ingin result error: maka cukup perintah sql insert, kalau ingin result sukses, maka perintahnya adalah sql replace (replace where unique id = "user uuid + 2"). setelah data 2 berhasil dimasukkan, dan selanjutnya user A akan input kembali, maka unique id nya: user uuid + 3. mohon koreksi kalau ada kesalahan. terima kasih

  • @khaerulfikri
    @khaerulfikri Месяц назад

    Iya sih, kalau misalkan kita ngirim POST untuk generate API Key, itu bisa problem sih, respondnya yang ketangkep yang pertama, yang kedua gk ke result.. yah jadinya invalid. Makasih banyak mas ilmunya 🙏

  • @makisetakashi
    @makisetakashi Месяц назад +1

    use transactions and use rabbit MQ to handle queue

  • @lutfiikbalmajid3128
    @lutfiikbalmajid3128 Месяц назад

    pake upsert aja, create and update if exist

  • @mudziahutama7787
    @mudziahutama7787 Месяц назад

    upsert (update or insert) adalah kunci

  • @saluran1733
    @saluran1733 Месяц назад

    Pake insert ignore aja bisa gak si? 🤔
    Asal salah satu fieldnya dibikin jadi unique

  • @levihookofficial
    @levihookofficial Месяц назад

    ngerti cara kerja nya, tapi baru tau namanya indempoten 😅. paling ga bsa ngapalin istilah2 gini

  • @alexlie9435
    @alexlie9435 Месяц назад

    Bahas quarkus dong bang 😅

  • @iqbalrivaldi2856
    @iqbalrivaldi2856 Месяц назад

    Pak request cara kerja Jwt refresh token pake bagan seperti ini pak🙏

    • @Tom-ft3do
      @Tom-ft3do Месяц назад

      coba di cari lagi di video bang, sepertinya sudah pernah di bahas

  • @AmbriBlack
    @AmbriBlack Месяц назад

    Nggak kepikiran kalau ini yang namanya idempotent, yang ku paham ya pokoknya nggak ada entry double.

  • @gustibisman4022
    @gustibisman4022 Месяц назад

    Kalau misal sku nya udh ada di dB tapi yg insert orng lain berarti ke update tidak pak? Apakah nanti ada pengecekan juga by created at nya?

  • @fandhipray
    @fandhipray Месяц назад +1

    apakah idempotency ini menggunakan token csrf saja sudah cukup ??

  • @rikikrismawan1831
    @rikikrismawan1831 Месяц назад

    apakah jika data tidak di temukan ketika delete maka akan "Di Abaikan" sehingga responseya tetap 200 seperti ketika delete ?

    • @abuhabibah8448
      @abuhabibah8448 Месяц назад

      204, commandnya sukses tp data tdk ditemukan

  • @Lukmandst
    @Lukmandst Месяц назад

    hmm baru tau ada yg namanya idempotent

  • @qwerty_501
    @qwerty_501 Месяц назад

    Skunya itu cara buatnya gimana pak

  • @IyanSR
    @IyanSR Месяц назад

    Kaget pake bahasa Inggris, audio track nya otomatis kepilih ya kwwk

  • @patahgaming
    @patahgaming Месяц назад +4

    njir tiba tiba bahasa ingris

  • @bjoey6000
    @bjoey6000 Месяц назад

    kaget suaranya gak kyk biasanya

  • @reinjin2371
    @reinjin2371 Месяц назад

    anjay.., hasil setup mobile

  • @hendyghsta
    @hendyghsta Месяц назад

    kenapa ga di pasang primary key di database utk yg unique,
    dan di bbackend di kasih commit transaction, klo

  • @farrel6788
    @farrel6788 Месяц назад

    kalau usernya memang beli iphone 2 kali gimana?

    • @ardhyui
      @ardhyui Месяц назад

      kalau untuk kasus insert transaksi seperti ini bisa ditambahin key misalnya 'x-idempotency-key' di header saat request api, bisa berupa uuid yang penting unique setiap request dari sisi client, nanti di backend check aja kalau nilai x-idempotency-key udah ada di cache bisa di skip process insert transaksinya.

    • @farrel6788
      @farrel6788 Месяц назад

      @@ardhyui hmm kalau unique setiap request berarti backend ga akan bisa ngecek gasi?

    • @abuhabibah8448
      @abuhabibah8448 Месяц назад

      Bedakan antara beli 2 kali (berarti 2 transaksi) dengan dobel transaksi (dobel post), yg dibahas disini terjadi dobel post, jadi transaksi yg sama kekirim (post) 2 kali sebelum proses transaksi selesai.
      Transaksi disini bukan jual beli ya. Tapi transaksi sistem.

    • @ardhyui
      @ardhyui Месяц назад

      ​@@farrel6788 gak bisa gmn ya, kan tinggal bikin unique aja misalnya di tablenya di tambahin key unique untuk fieldnya misalnya idempotency_key, kalau insert yang sama pasti gagal, di sisi client juga bisa ditambahin fungsi misalnya pas on submit posisi tombolnya langsung disable biar gak double click. Di backend juga bisa di tambahin database locking biar row yang sedang diproses gak bisa diupdate sebelum transaksi selesai(commited).
      Bisa juga ditambahin validasi misalnya untuk user id dan nominal yang sama transaksi gak bisa dilakukan dalam beberapa waktu / dikasih timeout. Intinya sih karena request POST itu engga idempotent gimana cara handlenya supaya data itu gak double input kalau terjadi masalah misalnya karena jaringan lemot / user double click dsb.

    • @farrel6788
      @farrel6788 Месяц назад

      sebenernya tadi ga paham, kalau client ga sengaja ngirim dua request dan idempotency-key dari dua request itu berbeda, tapi setelah google2 lagi sudah paham

  • @rusman_plat_d
    @rusman_plat_d Месяц назад

    suaranya beda ya?

    • @ProgrammerZamanNow
      @ProgrammerZamanNow  Месяц назад

      Lagi serak

    • @ahanafi-id
      @ahanafi-id Месяц назад

      Iyaa haha bener, tadi awal buka pake hp kirain ini dari hp nya yg convert jadi english, pas buka pake PC sama ternyata wkwk

    • @RezaPrayoga236
      @RezaPrayoga236 Месяц назад

      @@ProgrammerZamanNow ehhh serak.. kirain berak kang..

    • @rusman_plat_d
      @rusman_plat_d Месяц назад

      @@ProgrammerZamanNow bukan seraknya pa, audionya jadi bahasa inggris

    • @danangardianto4717
      @danangardianto4717 Месяц назад

      Fitur baru audio track

  • @novodewa
    @novodewa Месяц назад

    ❤❤❤❤❤

  • @saiba-b7l
    @saiba-b7l Месяц назад

    saya taunya impotent bg

  • @laluibnuhidaytullah73
    @laluibnuhidaytullah73 Месяц назад

    pleasee pak pake bahasa indonesia ehe 🙏🏼

    • @ProgrammerZamanNow
      @ProgrammerZamanNow  Месяц назад +1

      tinggal diganti aja itu di video nya, bahasa nya jadi Indonesia

    • @laluibnuhidaytullah73
      @laluibnuhidaytullah73 Месяц назад

      @@ProgrammerZamanNow oh di audio track? nuhun kang eko 🙏🏼