How to handle double request, so the API still idempotent

แชร์
ฝัง
  • เผยแพร่เมื่อ 21 พ.ย. 2024

ความคิดเห็น • 124

  • @gchannelthedayyanto2604
    @gchannelthedayyanto2604 15 วันที่ผ่านมา +73

    Siapa yang kaget suaranya jadi English?😂

    • @ProgrammerZamanNow
      @ProgrammerZamanNow  15 วันที่ผ่านมา +6

      Google udah fitur auto dubbing

    • @dwikyputra1881
      @dwikyputra1881 15 วันที่ผ่านมา +3

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

    • @tegarpratama7389
      @tegarpratama7389 15 วันที่ผ่านมา +1

      itu pake tools apa ya? wkwk

    • @rifki2086
      @rifki2086 15 วันที่ผ่านมา +2

      Wkwk we baru tau ternyata bisa pilih bahasanya😂

    • @ikmalilbirri8895
      @ikmalilbirri8895 15 วันที่ผ่านมา

      ternyata tidak sendiri wkwk

  • @MartinCode-f8n
    @MartinCode-f8n 11 วันที่ผ่านมา +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 10 วันที่ผ่านมา +1

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

    • @ProgrammerZamanNow
      @ProgrammerZamanNow  3 วันที่ผ่านมา +1

      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 15 วันที่ผ่านมา +13

    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 15 วันที่ผ่านมา +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 15 วันที่ผ่านมา +1

      Tapi jika dihapusnya berdasarkan jangka waktu tertentu, problem tersebut solved

    • @abuhabibah8448
      @abuhabibah8448 15 วันที่ผ่านมา

      @@adninsijawa445 yes... Semacam ini

    • @rabi7331
      @rabi7331 15 วันที่ผ่านมา

      @@adninsijawa445 biasanya disimpan dalam jangka waktu tertentu

    • @bakajwd697
      @bakajwd697 15 วันที่ผ่านมา +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

  • @matarider1441
    @matarider1441 10 วันที่ผ่านมา +1

    terimakasih ilmunya mas..

  • @gunawanmigi2637
    @gunawanmigi2637 15 วันที่ผ่านมา +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 13 วันที่ผ่านมา

      ini sih case bikin bum waktu kedepannya 😁

    • @dwikyrizkya
      @dwikyrizkya 7 วันที่ผ่านมา

      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

  • @mawiwijna
    @mawiwijna 10 วันที่ผ่านมา +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  3 วันที่ผ่านมา

      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 11 วันที่ผ่านมา +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.

  • @abuhabibah8448
    @abuhabibah8448 15 วันที่ผ่านมา +6

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

    • @dolanan5039
      @dolanan5039 15 วันที่ผ่านมา +2

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

    • @seigaish
      @seigaish 11 วันที่ผ่านมา

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

  • @ilhamsa01
    @ilhamsa01 15 วันที่ผ่านมา +9

    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 15 วันที่ผ่านมา +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 14 วันที่ผ่านมา

      @@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 14 วันที่ผ่านมา

      @@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 14 วันที่ผ่านมา

      @@bakajwd697 saya tadi reply kok hilang ya replynya

    • @ilhamsa01
      @ilhamsa01 14 วันที่ผ่านมา

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

  • @MuhammadIlyas-om2jw
    @MuhammadIlyas-om2jw 5 วันที่ผ่านมา

    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  3 วันที่ผ่านมา

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

  • @arisudarma7569
    @arisudarma7569 10 วันที่ผ่านมา +1

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

  • @andinofaturahman3649
    @andinofaturahman3649 15 วันที่ผ่านมา +3

    double request kemungkinan besar race condition juga,

  • @fahrizkyputra6551
    @fahrizkyputra6551 15 วันที่ผ่านมา +11

    laravel bisa pake firstOrCreate atau updateOrCreate

    • @muhammadfathurachman8412
      @muhammadfathurachman8412 14 วันที่ผ่านมา

      bener ini

    • @raincodemyid
      @raincodemyid 4 วันที่ผ่านมา

      Kalau CRUD biasa emang bisa, Kalau Case nya pembayaran kan repot 😂

  • @arifsubarkah9569
    @arifsubarkah9569 15 วันที่ผ่านมา

    bikin part 2 pak, untuk case proses transaksi.

  • @Dymagination2030
    @Dymagination2030 15 วันที่ผ่านมา +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 15 วันที่ผ่านมา +1

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

  • @enjun2071
    @enjun2071 14 วันที่ผ่านมา

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

  • @falahudinhalimshariski8358
    @falahudinhalimshariski8358 15 วันที่ผ่านมา +1

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

  • @pandathedeveloper6660
    @pandathedeveloper6660 15 วันที่ผ่านมา

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

  • @berthojoris
    @berthojoris 15 วันที่ผ่านมา +2

    Eloquent laravel punya Upserts yang handling case ini nih 💥

    • @brainplusplus1
      @brainplusplus1 15 วันที่ผ่านมา +1

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

    • @berthojoris
      @berthojoris 15 วันที่ผ่านมา

      @@brainplusplus1 ia define aja skunya

  • @jenn9233
    @jenn9233 15 วันที่ผ่านมา +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

  • @hafidhpradipta811
    @hafidhpradipta811 9 วันที่ผ่านมา

    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  3 วันที่ผ่านมา

      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

  • @khaerulfikri
    @khaerulfikri 15 วันที่ผ่านมา

    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 🙏

  • @ilhampahrurroji4006
    @ilhampahrurroji4006 15 วันที่ผ่านมา +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

  • @levihookofficial
    @levihookofficial 10 วันที่ผ่านมา

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

  • @regiismayanapratama5738
    @regiismayanapratama5738 15 วันที่ผ่านมา +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 11 วันที่ผ่านมา

      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

  • @saluran1733
    @saluran1733 วันที่ผ่านมา

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

  • @glennsteven7420
    @glennsteven7420 15 วันที่ผ่านมา

    di beberapa bahasa pemograman bisa gunain upsert jika di support

  • @AmbriBlack
    @AmbriBlack 12 วันที่ผ่านมา

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

  • @pramusintokhanif5979
    @pramusintokhanif5979 15 วันที่ผ่านมา

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

  • @mudziahutama7787
    @mudziahutama7787 15 วันที่ผ่านมา

    upsert (update or insert) adalah kunci

  • @alexlie9435
    @alexlie9435 15 วันที่ผ่านมา

    Bahas quarkus dong bang 😅

  • @bakajwd697
    @bakajwd697 15 วันที่ผ่านมา

    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 12 วันที่ผ่านมา

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

    • @bakajwd697
      @bakajwd697 10 วันที่ผ่านมา

      @@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 10 วันที่ผ่านมา

      @@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 5 วันที่ผ่านมา

      @@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

  • @makisetakashi
    @makisetakashi 15 วันที่ผ่านมา

    use transactions and use rabbit MQ to handle queue

  • @gustibisman4022
    @gustibisman4022 15 วันที่ผ่านมา

    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?

  • @IyanSR
    @IyanSR 15 วันที่ผ่านมา

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

  • @lutfiikbalmajid3128
    @lutfiikbalmajid3128 9 วันที่ผ่านมา

    pake upsert aja, create and update if exist

    • @ProgrammerZamanNow
      @ProgrammerZamanNow  3 วันที่ผ่านมา

      bisa, tapi tetap harus ada kolom yang unique

  • @rikikrismawan1831
    @rikikrismawan1831 15 วันที่ผ่านมา

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

    • @abuhabibah8448
      @abuhabibah8448 15 วันที่ผ่านมา

      204, commandnya sukses tp data tdk ditemukan

  • @iqbalrivaldi2856
    @iqbalrivaldi2856 15 วันที่ผ่านมา

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

    • @Tom-ft3do
      @Tom-ft3do 15 วันที่ผ่านมา

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

  • @fandhipray
    @fandhipray 15 วันที่ผ่านมา +1

    apakah idempotency ini menggunakan token csrf saja sudah cukup ??

    • @ProgrammerZamanNow
      @ProgrammerZamanNow  3 วันที่ผ่านมา

      tidak ada hubungannya antara idempotency sama csrf

  • @reinjin2371
    @reinjin2371 15 วันที่ผ่านมา

    anjay.., hasil setup mobile

  • @Lukmandst
    @Lukmandst 15 วันที่ผ่านมา

    hmm baru tau ada yg namanya idempotent

  • @patahgaming
    @patahgaming 15 วันที่ผ่านมา +4

    njir tiba tiba bahasa ingris

  • @qwerty_501
    @qwerty_501 15 วันที่ผ่านมา

    Skunya itu cara buatnya gimana pak

  • @bjoey6000
    @bjoey6000 8 วันที่ผ่านมา

    kaget suaranya gak kyk biasanya

  • @novodewa
    @novodewa 15 วันที่ผ่านมา

    ❤❤❤❤❤

  • @hendyghsta
    @hendyghsta 15 วันที่ผ่านมา

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

  • @farrel6788
    @farrel6788 15 วันที่ผ่านมา

    kalau usernya memang beli iphone 2 kali gimana?

    • @ardhyui
      @ardhyui 15 วันที่ผ่านมา

      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 15 วันที่ผ่านมา

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

    • @abuhabibah8448
      @abuhabibah8448 15 วันที่ผ่านมา

      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 15 วันที่ผ่านมา

      ​@@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 15 วันที่ผ่านมา

      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

  • @saiba-b7l
    @saiba-b7l 15 วันที่ผ่านมา

    saya taunya impotent bg

  • @rusman_plat_d
    @rusman_plat_d 15 วันที่ผ่านมา

    suaranya beda ya?

    • @ProgrammerZamanNow
      @ProgrammerZamanNow  15 วันที่ผ่านมา

      Lagi serak

    • @ahanafi-id
      @ahanafi-id 15 วันที่ผ่านมา

      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 15 วันที่ผ่านมา

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

    • @rusman_plat_d
      @rusman_plat_d 15 วันที่ผ่านมา

      @@ProgrammerZamanNow bukan seraknya pa, audionya jadi bahasa inggris

    • @danangardianto4717
      @danangardianto4717 15 วันที่ผ่านมา

      Fitur baru audio track

  • @laluibnuhidaytullah73
    @laluibnuhidaytullah73 15 วันที่ผ่านมา

    pleasee pak pake bahasa indonesia ehe 🙏🏼

    • @ProgrammerZamanNow
      @ProgrammerZamanNow  15 วันที่ผ่านมา +1

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

    • @laluibnuhidaytullah73
      @laluibnuhidaytullah73 13 วันที่ผ่านมา

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