大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java基礎學習:Java并發程序設計教程

Java基礎學習:Java并發程序設計教程

更新時間:2020-04-28 12:47:11 來源:動力節點 瀏覽2109次

    1.服務接口的冪等設計

    冪等:每次請求重復調用的結果都是一樣的。

    分布式服務中的提交接口一般都需要進行冪等校驗。例如做支付接口,如果一筆支付在網絡異常時進行兩次,或者更多次調用。沒有控制冪等的設計,那么可能會導致進行多次支付,而系統中只有一筆訂單,造成的影響不言而喻。

    冪等性一般可以用一個請求號和請求來源來記錄,將請求號和請求來源存入redis里面,如果有重復的過來,就直接拒絕,也可以針對請求和請求來源做唯一索引,這樣帶有重復數據提交過來的時候就會落庫失敗。

    當然也可能會有不同的請求號的重復提交,比如用戶第1次申請的時候,卡住了,然后用戶返回之后可以點擊第2次申請,這樣就會導致重復點擊了兩次支付。這樣一般的做法就是添加一個樂觀鎖機制,根據用戶這一筆錢的支付狀態,或者是用戶的版本來進行比對,如果比對失敗,說明可能是重復的支付,那么就直接拒絕掉。

    2.mq分布式系統的應用,以及mq消息不丟失的設計

    mq一般用來作為分布式系統的解耦合調用,系統的削峰填谷(入隊隊列滿之后,拒絕新的事件入隊,也可以適當避免系統低峰時間請求數量太少了而導致的系統資源浪費),系統的消息分發,做延遲隊列來處理一些定時的任務等。

    mq的類型也是多種多樣,如何選型也是比較關鍵的因素。例如最近很火的kafka,因為它的高吞吐量,零拷貝快速持久化消息著稱;rabbitmq,以它對多種消息傳輸協議,支持靈活的消息路由,負載均衡策略和保證消息不丟失的策略而廣受企業追捧;activemq,以它支持多種語言客戶端,能夠實現多種高級應用聞名;rocketmq,能夠支持大量的消息堆積,精準控制消息順序,消息過濾等多種功能......不同的mq應用場景也不一樣,諸君需要根據系統屬性來合理選擇。

    mq中如何確保消息不丟失?以rabbitmq為例。如果是生產者丟失消息,沒有正確的發送到mq中。為了確保消息不丟失,mq生產者發送的時候要設置持久化參數,那么mq接收到生產者傳送過來的消息時,會首先把mq消息,持久化到磁盤,持久化完成之后才會返回,給生產者一個ack,生產者收到這個ack之后,說明消息已經成功傳輸到mq上,否則生產者將會重復傳送這一條消息。消息傳到mq上以后,還要確保消息能夠成功的發送給消費者,且消費者能夠成功的處理完消息,因此可以設置消費者處理消息完成之后,再返回ack到mq,mq收到消費者回傳的ack之后才會將消息移出隊列,否則則會重復發送。

    3.redis分布式系統應用

    數據緩存(通過redis緩存的數據可以更快的進行訪問,保證db不會因為壓力太大出現異常,同時可以增強系統吞吐量,但是需要準確的控制緩存數據與db數據之間的一致性,否則可能會造成臟讀。如何保證緩存命中率是個比較復雜的事情,需要根據系統屬性來對緩存屬性進行設計,同時也要兼顧到緩存穿透一類的問題)。

    分布式鎖(使用redis的setnx函數,利用此函數的原子特性,將需要鎖的對象唯一性的一些字段添入其中,設置過期時間。其他線程過來,發現對象被鎖之后,采用自旋的方式重復獲取對象一段時間,如果占用對象的線程釋放對象之后便可以獲取到對象鎖,否則直接拋出失敗)。

    分布式冪等性接口(同樣使用setnx函數的特性,根據來源傳輸的唯一性請求號來進行加鎖)。

    處理隊列(類似于用redis來實現一個mq隊列的功能,不過沒有mq那么完全的一個保證消息不丟失的機制,需要衡量利弊使用)。

    bitmap(用來記錄一些大數據位的數據結構,可以用來做布隆過濾器,進行緩存條件的過濾,可以防止緩存穿透,緩存擊穿)。

    4.線程及線程池的使用,種類,以及線程池的設計

    放一張線程狀態轉換圖(清晰明了,相信不用我多做解釋):

Java基礎學習:Java并發程序設計教程

    線程池可以分為四大類(Executors工具類),單例線程池(顧名思義,是初始化核心線程和最大線程數只有一的線程池,一般用來對線程進入的先后順序進行依次執行。),固定線程池(固定的核心線程數和最大線程數,可以根據機器的核載量來決定線程池的大小),緩存線程池(初始化核心線程數為0,阻塞隊列為同步的,且最大線程數不做限制的一個線程。這類線程時可以根據具體請求來決定線程池數量的大小,收放自如,但是不做最大線程數的限制,但是可能會引起機器壓力過大線程數過多等問題),定時任務線程池(創建一個定長的,可以按周期定時執行的線程池)

    線程池初始化的幾個參數:如果選擇用自定義線程池ThreadPoolExecutor來初始化線程池(這種方式也是阿里推薦使用的,直接用Executors工具類可能會導致),需要注意的幾個參數(核心線程數,最大線程數,隊列選型,拒絕策略)。隊列類型:ArrayBlockingQueue,PriorityBlockingQueue:有界隊列,隊列滿時會創建新線程直到最大線程數,隊列滿時按照拒絕策略返回;LinkedBlockingQueue:無界隊列,隊列不限制大小,不過需要注意如果隊列一直增加會導致oom;SynchronousQueue:同步隊列,一般用于cache類型的線程池;拒絕策略:AbortPolicy:丟棄任務并拋出RejectedExecutionException異常。DiscardPolicy:也是丟棄任務,但是不拋出異常。DiscardOldestPolicy:丟棄隊列最前面的任務,然后重新嘗試執行任務。CallerRunsPolicy:由調用線程處理該任務。

 以上就是動力節點java培訓機構的小編針對“Java基礎學習:Java并發程序設計教程”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 97影院支持微信微博观看 | 在线播放精品视频 | 四虎永久免费地址 | 日韩午夜小视频 | 成人黄性视频 | 黄色成人在线视频 | 日日噜噜噜夜夜爽爽狠狠图片 | 特级中国aaa毛片 | 黄色在线观看网站 | 欧美一区二区三区精品国产 | 欧美日韩在线成人 | 一级毛片免费播放视频 | 真正全免费视频a毛片 | 天天干天天拍天天射 | 青青热久久国产久精品秒播 | 国产精品18 | 欧美色网 | 日韩伦理一区二区 | 色久影院| 国产麻豆永久视频 | 日日草夜夜草 | 99久久精品国产亚洲 | 免费观看黄色a一级录像 | 激情伊人网| 天天骑夜夜操 | 亚洲精品一区二区中文 | 四虎影院最新地址 | 成人午夜影院在线观看 | 国产成人精品免费大全 | 成人激情小视频 | 国产精品a人片在线观看 | 久久久精品久久久久久久久久久 | 99久久99久久免费精品蜜桃 | 99精品视频免费在线观看 | 色老久久精品偷偷鲁一区 | 欧美狠狠入鲁的视频极速 | avav好色| 美女视频黄视大全视频免费网址 | 精品久久久久久久久久久久久久久 | 日日天日日夜日日摸 | 狠干在线|