1. 程式人生 > >RESTful API 工具箱之冪等性(TODO)

RESTful API 工具箱之冪等性(TODO)

有一個比較不錯的解釋,點我
冪等性是某種操作固有的性質, 還是我們可以把所有型別的操作都可以實現為冪等的。有些操作天生就是冪等的, 譬如說, 取資料操作,複製操作,我執行無數次取資料操作或者複製操作, 結果和執行一次是一樣的。 有些操作就不是冪等的,像刪除操作,轉賬操作。 刪除第二次的時候,系統可能說這個資源已經不存在;轉賬操作執行第二次的時候,你就多轉了一倍的錢。客觀上,這種操作本質上就不可能是冪等的。如果要模擬冪等:就是說客戶可以嘗試多次去執行這個操作,就要先拿到唯一標示這次操作的id, 然後,拿著這個id去重試,伺服器就認得這次操作,如果這次操作,以執行完畢,返回OK給客戶端,如果還沒執行,就真正去執行這個請求,再返回OK給客戶。這個操作本質上只是被執行了一遍,但是這樣的設計可以讓客戶端重試多次,貌似成了一個冪等的操作。

關於如何實現一個冪等的取錢操作,基本思想就是,我先要取得一個transaction id, 用這個id去記錄這個取錢的操作是否已經執行過。客戶端每次嘗試取錢都要帶著這個id, 伺服器端就會知道這個transaction有沒有已經執行完畢。
我的疑問是

  1. 伺服器什麼時候可以把這些transaction id的資料清除掉?還是一直要存著?在我看來,一直存著這些資料,並沒有意義。一個可能的方案就是當客戶端知道自己的取錢操作已經成功執行的時候,可以額外發一個請求去刪掉對應的transaction id。而刪除操作是冪等的,客戶端可以使勁re-try直到刪除。
  2. 分散式事務是怎麼做到的?TODO:
  3. 還有其他方法實現冪等的取錢操作嗎?TODO: 非同步的方式?先去提交取錢這個Job, 然後可以嘗試去Get這個Job, 但是這個Job也要一個token去標記,有點類似。
  4. 冪等的好處是什麼? 冪等的取錢操作首要解決的問題就是在不使用分散式事務的情況下,避免了取錢操作錯誤地重複執行。但是該問題 的大背景是,網路不穩定。假如說網路是一種理想情況下完全穩定的,那麼,就不需要分散式事務或者冪等,因為我每次請求都可以正確執行並拿到結果。TODO