併發設計之A系統調用B系統

A-->B前端

    A在發送請求以前,用樂觀鎖,減小對B的重複調用,這樣必定程度上是冪等性。數據庫

    好比A系統支付功能,要調用B系統進行支付操做,可是前端對"支付"按鈕不進行控制,即用戶會不斷屢次點擊支付按鈕,這時A系統會不斷的發送請求給B系統(每點擊一次就發送一次),若是B系統沒有作冪等性設計,那就出問題了,以下圖1所示:bash

                                                 圖1  用戶的屢次請求在A系統中觸發了不少個線程,A也對應的屢次調用B線程

    咱們是否能夠在A系統就把相同的線程過濾掉,以下圖2所示:設計

                             圖2 用戶的屢次請求在A系統中觸發了不少個線程,可是都被A過濾了,最後發到B的只有一個請求code

    圖2中的是怎麼實現的呢,能夠在A系統的數據庫中建立一張表,因爲A系統中支付,因此必定存在一個訂單Id,咱們就使用這個訂單Id,加上版本號,來生成一條記錄,這樣屢次支付同一個訂單的請求,就只有一個線程會發送到B。用了數據庫的樂觀鎖。blog

+----------+------------+------+-----+---------+----------------+
| Field    | Type       | Null | Key | Default | Extra          |
+----------+------------+------+-----+---------+----------------+
| id       | bigint(20) | NO   | PRI | NULL    | auto_increment |
| order_id | bigint(20) | YES  |     | NULL    |                |
| version  | int(11)    | YES  |     | 0       |                |
+----------+------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

    每一個線程都執行update table set version=version+1 where order_id=#{orderId};這個就經過樂觀鎖,只有一個線程會成功修改這條記錄,咱們只讓修改version成功的那個線程發送請求到B。rem

相關文章
相關標籤/搜索