精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聽叔一句勸,消息隊列的水太深,你把握不住!

開發 前端
在微服務開發中我們經常會引入消息中間件實現業務解耦,執行異步操作, 現在讓我們來看看使用消息中間件的好處和弊端。

 [[400400]]

本文轉載自微信公眾號「JAVA日知錄」,作者單一色調 。轉載本文請聯系JAVA日知錄公眾號。

很多人在做架構設計時往往會“過度設計”,簡單問題復雜化,上來就引一堆中間件,我想大概原因主要有下面兩點:

為了秀(學)技術而架構

我們常說技術是為業務服務的,不能為了技術而技術,為了秀技術引入一堆復雜架構這是要不得的。

考慮問題不全面,或者說廣度不夠,不知道如何簡單化

舉個栗子,假設有一個高并發的用戶平臺需要處理注冊(寫)及登錄查詢(讀)功能,在數據庫層做了主從同步。

有人為了解決主從同步延時問題引入了一個Redis,想實現寫主庫的時候同時寫Redis,然后讀的時候直接讀Redis,用以避免了主從延時同步問題,這就是典型的考慮問題不全面,這雖然可以解決主從延時問題,但是又會導致雙寫一致性事務問題的產生,那不如直接把主從同步的方式改成強同步復制直接從數據庫層面保證了一致性。

那你可能會說改成強同步復制不是會增加響應時間進而影響系統吞吐量嗎,那咱還可以對用戶做個分庫,多做幾個主從同步出來不就可以了嗎?

誒誒誒,跑題了,今天咱不是說消息隊列嗎?

哦,言歸正傳。今天我們說說消息隊列的問題,希望看完本文大家在引入消息隊列的時候先想一想,是不是一定要引入?引入消息隊列后產生的問題能不能解決?

消息隊列的作用

在微服務開發中我們經常會引入消息中間件實現業務解耦,執行異步操作, 現在讓我們來看看使用消息中間件的好處和弊端。

首先需要肯定是使用消息組件有很多好處,其中最核心的三個是:解耦、異步、削峰。

  • 解耦:客戶端只要講請求發送給特定的通道即可,不需要感知接收請求實例的情況。
  • 異步:將消息寫入消息隊列,非必要的業務邏輯以異步的方式運行,加快響應速度。
  • 削峰:消息中間件在消息被消費之前一直緩存消息,消息處理端可以按照自己處理的并發量從消息隊列中慢慢處理消息,不會一瞬間壓垮業務。

當然消息中間件并不是銀彈,引入消息機制后也會有如下一些弊端:

  • 潛在的性能瓶頸:消息代理可能會存在性能瓶頸。幸運的是目前主流的消息中間件都支持高度的橫向擴展。
  • 潛在的單點故障:消息代理的高可用性至關重要,否則系統整體的可靠性將受到影響,幸運的是大多數消息中間件都是高可用的。
  • 額外的操作復雜性:消息系統是一個必須獨立安裝、配置和運維的系統組件,增加了運維的復雜度。

這些弊端我們借助消息中間件本身提供的擴展、高可用能力可以解決,但是要真正用好消息中間件我們還需要關注可能會遇到的一些設計難題。

消息隊列的設計難題

處理并發和順序消息

在生產環境中為了提高消息處理的能力以及應用程序的吞吐量,一般會將消費者部署多個實例節點。那么帶來的挑戰就是 如何確保每個消息只被處理一次,并且是按照他們的發送順序來處理的。

例如:假設有3個相同的接收方實例從同一個點對點通道讀取消息,發送方按順序發布了 Order Created、Order Updated 和 Order Cancelled 這3個事件消息。簡單的消息實現可能就會同事講每個消息給不同的接收方。若由于網絡問題導致延遲,消息可能沒有按照他們發出時的順序被處理,這將導致奇怪的行為,服務實例可能在另一個服務器處理 Order Created 消息之前處理 Order Cancelled消息。

Kafka 使用的解決方案是使用分片(分區)通道。整體解決方案分為三個部分:

  1. 一個主題通道由多個分片組成,每個分片的行為類似一個通道。
  2. 發送方在消息頭部指定分片鍵如orderId,Kafka使用分片鍵將消息分配給特定的分片。
  3. 將接收方的多個實例組合在一起,并將他們視為相同的邏輯接收方(消費者組)。kafka將每個分片分配給單個接收器,它在接收方啟動和關閉時重新分配分片。

如上圖所示,每個Order事件消息都將orderId作為其分片鍵。特定訂單的每個事件都發布到同一個分片。而且該分片中的消息始終由同一個接收方實例讀取,因此這樣就能夠保證按順序處理這些消息。

處理重復消息

引入消息架構必須要解決的另一個挑戰是處理重復消息。在理想情況下,消息代理應該只傳遞一次消息,但保證消息有且僅有一次的消息傳遞的成本通常很高。相反,很多消息組件承諾至少保證成功傳遞一次消息。

在正常情況下,消息組件只會傳遞一次消息。但是當客戶端、網絡或消息組件故障可能導致消息被多次傳遞。假設客戶端在處理消息后發送確認消息前,他的數據庫崩潰了,這時消息組件將再次發送未確認的消息,在數據庫重新啟動時向該客戶端發送。

處理重復消息有以下兩種不同的方法:

  • 編寫冪等消息處理程序
  • 跟蹤消息并丟棄重復項

編寫冪等消息處理器

如果應用程序處理消息的邏輯是滿足冪等的,那么重復消息就是無害的。程序的冪等性是指,即使這個應用被相同輸入參數多次重復調用時,也不會產生額外的效果。例如:取消一個已經取消的訂單,就是一個冪等性操作。同樣,創建一個已經存在的訂單操作也必是這樣。滿足冪等的消息處理程序可以被放心的執行多次,只要消息組件在傳遞消息時保持相同的消息順序。

但是不幸的是,應用程序通常不是冪等的。或者你現在正在使用的消息組件在重新傳遞消息時不會保留排序。重復或無序消息可能會導致錯誤。在這種情況下,你需要編寫跟蹤消息并丟棄重復消息的消息處理程序。

跟蹤消息并丟棄重復消息

考慮一個授權消費者信用卡的消息處理程序。它必須為每個訂單僅執行一次信用卡授權操作。這段應用程序每次調用時都會產生不同的效果。如果重復消息導致消息處理程序多次執行該邏輯,則應用程序的行為將不正確。執行此類應用程序邏輯的消息處理程序必須通過檢測和丟棄重復消息而讓它成為冪等的。

一個簡單的解決方案是消息接收方使用 message id 跟蹤他已處理的消息并丟棄任何重復項。例如,在數據庫表中存儲它消費的每條消息的 message id。

當接收方處理消息時,它將消息的 message id 作為創建和變更業務實體的事務的一部分記錄在數據表里。如上圖所示,接收方將包含message id 的行插入 PROCESSED_MESSAGE表。如果消息是重復的,則INSERT將失敗,接收方可以選擇丟棄該消息。

另一個解決方案是消息處理程序在應用程序表,而不是專門表中記錄 message id。當時用具有受限事務模型的NoSQL數據庫時,此方法特別有用,因為 NoSQL數據庫通常不支持將針對兩個表的更新作為數據庫事務。

處理事務性消息

服務通常需要在更新數據庫的事務中發布消息,數據庫更新和消息發送都必須在事務中進行,否則服務可能會更新數據庫然后在發送消息之前崩潰。

如果服務不以原子方式執行者兩個操作,則類似的故障可能使系統處于不一致狀態。

接下來我們看一下常用的保證事務消息的兩種解決方案,最后再看看現代消息組件RocketMQ的事務性消息解決方案。

使用數據庫表作為消息隊列

如果你的應用程序正在使用關系型數據庫,要保證數據的更新和消息發送之間的事務可以直接使用 事務性發件箱模式,Transactional Outbox。

此模式使用數據庫表作為臨時消息隊列。如上圖所示,發送消息的服務有個OUTBOX數據表,在進行INSERT、UPDATE、DELETE 業務操作時也會給OUTBOX數據表INSERT一條消息記錄,這樣可以保證原子性,因為這是基于本地的ACID事務。

OUTBOX表充當臨時消息隊列,然后我們在引入一個消息中繼(MessageRelay)的服務,由他從OUTBOX表中讀取數據并發布消息到消息組件。

消息中繼的實現可以很簡單,只需要通過定時任務定期從OUTBOX表中拉取最新未發布的數據,獲取到數據后將數據發送給消息組件,最后將完成發送的消息從OUTBOX表中刪除即可。

使用事務日志發布事件

另外一種保證事務性消息的方式是基于數據庫的事務日志,也就是所謂的數據變更捕獲,Change Data Capture,簡稱CDC。

一般數據庫在數據發生變更的時候都會記錄事務日志(Transaction Log),比如MySQL的binlog。事務日志可以簡單的理解成數據庫本地的一個文件隊列,它主要記錄按時間順序發生的數據庫表變更記錄。

這里我們利用alibaba開源的組件canal結合MySQL來說明下這種模式的工作原理。

更多操作說明可以參考官方文檔:https://github.com/alibaba/canal

canal工作原理

  • canal 模擬 MySQL slave 的交互協議,把自己偽裝成一個MySQL的 slave節點 ,向 MySQL master 發送dump 協議;
  • MySQL master 收到 dump 請求,開始推送 binary log 給 slave (即 canal );
  • canal 解析 binary log 對象(原始為 byte 流),然后可以將解析后的數據直接發送給消息組件。

RocketMQ事務消息解決方案

Apache RocketMQ在4.3.0版中已經支持分布式事務消息,RocketMQ采用了2PC的思想來實現了提交事務消息,同時增加一個補償邏輯來處理二階段超時或者失敗的消息,如下圖所示。

RocketMQ實現事務消息主要分為兩個階段:正常事務的發送及提交、事務信息的補償流程。

整體流程為:

  • 正常事務發送與提交階段

1、生產者發送一個半消息給MQServer(半消息是指消費者暫時不能消費的消息)

2、服務端響應消息寫入結果,半消息發送成功

3、開始執行本地事務

4、根據本地事務的執行狀態執行Commit或者Rollback操作

  • 事務信息的補償流程

1、如果MQServer長時間沒收到本地事務的執行狀態會向生產者發起一個確認回查的操作請求

2、生產者收到確認回查請求后,檢查本地事務的執行狀態

3、根據檢查后的結果執行Commit或者Rollback操作 補償階段主要是用于解決生產者在發送Commit或者Rollback操作時發生超時或失敗的情況。

在生產者使用RocketMQ發送事務消息的時候我們也會借鑒第一種方案即自建一張事務日志表,然后在執行本地事務的時候同時生成一條事務日志記錄,讓本地事務與日志事務在同一個方法中,同時添加 @Transactional 注解,保證兩個操作事務是一個原子操作。這樣如果事務日志表中有這個本地事務的信息,那就代表本地事務執行成功,需要Commit,相反如果沒有對應的事務日志,則表示沒執行成功,需要Rollback。

 

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2021-06-02 11:28:53

查詢權責分離

2023-11-06 08:31:58

業務代碼多線程

2021-03-10 08:16:06

Nacos集群搭建微服務

2025-01-16 09:35:08

Ubuntukdump數據

2019-01-22 08:31:10

2013-03-22 10:53:42

PyConPython

2011-03-28 15:48:52

批量數據綁定

2011-03-24 10:24:45

批量數據綁定

2019-11-15 18:00:18

MySQLSQL數據庫

2013-05-10 10:56:09

2023-09-05 23:34:52

Kubernetes云原生

2024-09-18 07:00:00

消息隊列中間件消息隊列

2014-12-16 08:58:17

甲骨文Oracle數據庫選件

2009-03-10 18:10:12

LinuxUbuntu技巧

2012-02-09 09:41:22

2011-06-13 09:25:01

斷號

2021-02-19 09:19:11

消息隊列場景

2022-08-01 10:01:11

JavaScript語言代碼庫

2015-08-03 10:21:04

設計模式表達
點贊
收藏

51CTO技術棧公眾號

日韩精品国产一区| 国内一区在线| 国产精品成人在线视频| av一级久久| 久久精品一二三| 国产精品久久久久久久久免费 | 黄色片一区二区三区| 在线国产一区| 国产视频精品一区二区三区| 在线观看av日韩| 三级网站视频在在线播放| 成人国产一区二区三区精品| 国产成人一区二区三区电影| 免费在线观看a级片| 五月激激激综合网色播| 欧美久久高跟鞋激| 成人在线免费在线观看| 韩国av网站在线| av在线播放成人| 亚洲一区二区少妇| 国产免费www| 亚洲国内自拍| 色综合天天视频在线观看| 91精品久久久久久久久不口人 | 色偷偷久久人人79超碰人人澡| 色综合天天狠天天透天天伊人| 亚洲精品免费网站| 亚洲自拍一区在线观看| 欧美高清影院| 国产欧美精品一区| 国产精品一区二区a| 国产在线一级片| 亚洲视频1区| 色综合久综合久久综合久鬼88 | 国产做受69高潮| 91视频青青草| 91免费精品| 在线观看91久久久久久| 一本色道综合久久欧美日韩精品 | 日本蜜桃在线观看视频| 一区二区三区在线观看国产| 一区二区三区四区视频在线| 韩国中文字幕2020精品| 97精品久久久午夜一区二区三区| 国产成人av一区二区三区| 91影院在线播放| 美国毛片一区二区| 国产精品爽爽ⅴa在线观看| 日本一区二区三区精品| 欧美二区不卡| 欧美国产在线视频| 免费在线观看日韩| 欧美日韩国产亚洲一区| 色中色综合影院手机版在线观看| www.xxxx日本| 综合在线视频| 久久综合免费视频影院| 欧美做爰爽爽爽爽爽爽| 一区二区在线| 欧美国产在线视频| 欧美三级韩国三级日本三斤在线观看 | 一区二区成人国产精品 | 精品少妇无遮挡毛片| 黄色亚洲网站| 在线观看欧美黄色| 久久黄色片网站| 国产精品久久久久久久久久久久久久久 | 久久久久久久成人| 日本系列第一页| 国产精品普通话对白| 欧美一级大片在线免费观看| 超碰在线观看91| 日本成人中文字幕| 91亚洲国产成人精品性色| 性欧美8khd高清极品| 99国产精品一区| 欧美一级二级三级| 日韩欧美小视频| 亚洲综合久久久久| 国产极品美女高潮无套久久久| 欧洲一级精品| 欧美一区二区三区在线看| 怡红院一区二区| 久草精品在线| 久久精品中文字幕一区| 久久久久国产精品夜夜夜夜夜| 日韩网站在线| 国产精品视频午夜| 超碰在线观看99| 久久综合九色综合97婷婷 | 日韩成人av一区二区| 在线日韩网站| 大量国产精品视频| 五月天婷婷激情| 激情国产一区二区| 狠狠综合久久av| 92国产在线视频| 亚洲成av人片一区二区梦乃| 杨幂毛片午夜性生毛片| 亚洲精品视频一二三区| 亚洲一区二区久久久| 日本中文字幕免费在线观看| 免费亚洲婷婷| 99久久综合狠狠综合久久止| 黄色av网站在线看| 亚洲影院理伦片| 污污网站免费看| 欧美一区 二区| 欧美超级免费视 在线| 欧美一区二区三区网站| 国产91在线|亚洲| 亚洲欧美久久234| 末成年女av片一区二区下载| 8x福利精品第一导航| 免费在线观看你懂的| 午夜欧美精品久久久久久久| 国产精品久久综合av爱欲tv| 色综合视频在线| 1024成人网| 午夜dv内射一区二区| 国产中文欧美日韩在线| 一个色综合导航| 国产情侣自拍av| 风流少妇一区二区| 91社在线播放| www.久久| 在线成人免费网站| 国产精品免费精品一区| 成人免费av资源| 久久观看最新视频| 四虎影视国产精品| 在线观看欧美视频| 最近免费中文字幕大全免费版视频| 成人综合在线观看| 蜜臀在线免费观看| 国产免费区一区二区三视频免费| 中文字幕日韩精品在线| 91丨九色丨海角社区| 久久先锋影音av鲁色资源| 国产综合中文字幕| 国产成人福利av| 欧美肥婆姓交大片| 亚洲AV无码精品色毛片浪潮| 日韩理论片中文av| 天堂av在线8| 91久久电影| 91在线视频精品| 中文字幕免费高清电视剧网站在线观看 | 中文字幕乱码在线观看| 久久久久久久av麻豆果冻| 人妻有码中文字幕| 精品国产乱码久久久久久蜜坠欲下 | 亚洲精品国产一区| 国产精品亲子伦av一区二区三区| 在线视频日韩精品| 亚洲资源在线播放| 亚洲欧美日韩国产另类专区| 亚洲AV无码久久精品国产一区| 伊人青青综合网| 国产99视频精品免费视频36| 欧美黄色视屏| 亚洲精品久久久久久久久| 五月天激情国产综合婷婷婷| 久久精品亚洲国产奇米99| 免费看黄色一级大片| 爽成人777777婷婷| 亚洲永久在线观看| 国产免费拔擦拔擦8x在线播放 | 99中文视频在线| 不卡一本毛片| 亚洲美女www午夜| 曰批又黄又爽免费视频| 亚洲欧美色图小说| 无码任你躁久久久久久老妇| 久久国产福利| 欧美 另类 交| 嗯用力啊快一点好舒服小柔久久| 97超级碰碰碰久久久| 成人欧美一区| 日韩欧美国产综合一区| 9i看片成人免费看片| 国产精品久久看| 亚洲少妇中文字幕| 丝袜美腿亚洲色图| 国产日韩欧美大片| 亚洲亚洲免费| 91视频免费网站| 在线中文字幕播放| 精品国产一区二区三区久久| 黄色片一区二区| 欧美日韩另类一区| 国产在线综合网| 国产女同性恋一区二区| 久久国产免费视频| 日本最新不卡在线| 国产va亚洲va在线va| 精品视频免费在线观看| 国产高清在线精品一区二区三区| 姬川优奈av一区二区在线电影| 欧美老女人性视频| 91精品国产91久久久久游泳池| 精品欧美乱码久久久久久1区2区| 欧美三级网站在线观看| 亚洲成人精品一区二区| 国产亚洲精品久久久久久豆腐| av电影一区二区| 女王人厕视频2ⅴk| 日本欧美久久久久免费播放网| 18黄暴禁片在线观看| 欧美freesextv| 欧美色欧美亚洲另类七区| 日韩精品一区二区三区中文字幕 | 中文字幕在线不卡视频| 日本护士做爰视频| 国产伦精品一区二区三区免费迷| 日本999视频| 国产精品一区毛片| 人人妻人人澡人人爽欧美一区 | 久久人体大胆视频| 成人精品一区| 亚洲乱码国产乱码精品精天堂| 亚洲精品18在线观看| 91麻豆精品国产91久久久久久| 日本中文字幕在线观看视频| 欧美日韩另类字幕中文| 免费在线黄色片| 亚洲最大色网站| 青青青在线免费观看| 国产精品久久二区二区| 国产成人精品无码免费看夜聊软件| 成人性视频免费网站| 91在线第一页| 激情综合网天天干| 亚洲一区二区福利视频| 麻豆精品一区二区| 日本久久久久久久久久久久| 日韩高清在线不卡| 激情视频综合网| 日日摸夜夜添夜夜添国产精品| 91九色丨porny丨国产jk| 国产一区二区三区四区老人| 青青草视频国产| 亚洲图片在线| 国产亚洲黄色片| 亚洲日产国产精品| 国产av天堂无码一区二区三区| 亚洲三级视频| 国产成人a亚洲精v品无码| 国产精品社区| chinese少妇国语对白| 日韩高清在线一区| 最新免费av网址| 国产美女久久久久| 少妇精品无码一区二区| 成人午夜精品在线| 国产精品久久无码| 国产性做久久久久久| www久久久久久久| 亚洲欧洲性图库| 激情小说中文字幕| 精品久久久久久久久久久久久| 精品欧美一区二区三区免费观看| 色综合久久久久网| 久久精品偷拍视频| 欧美一区在线视频| 人妻精品一区一区三区蜜桃91| 日韩av中文字幕在线播放| 韩国三级av在线免费观看| 最近2019中文字幕大全第二页 | 久久久综合色| 国产性生活免费视频| 亚洲欧洲综合| 国产精品拍拍拍| 国产黄色精品网站| 欧美bbbbb性bbbbb视频| 中文字幕不卡的av| 麻豆视频在线观看| 欧美日韩视频在线| 亚洲一级视频在线观看| 欧美不卡在线视频| 国产精品久久久久一区二区国产| 精品国产一区二区三区四区在线观看| 少女频道在线观看免费播放电视剧| 国内精品伊人久久| 国产精品诱惑| 99re6热在线精品视频播放速度| 欧美尿孔扩张虐视频| 亚洲国产成人不卡| 18成人免费观看视频| 香港日本韩国三级网站| 成人国产在线观看| 一本一本久久a久久| 午夜一区二区三区在线观看| 中文字幕在线观看欧美| 欧美精品一区二| 欧美人xxx| 日本精品免费观看| 一区二区三区视频播放| 日韩精品伦理第一区| 国内成人在线| 91亚洲免费视频| 91蝌蚪porny| 久久国产免费观看| 欧美性生活大片视频| 欧美在线 | 亚洲| 久久这里只有精品视频首页| 日韩av福利| 国产伦精品一区二区三区视频孕妇| 不卡av一区二区| 男人的天堂99| 东方aⅴ免费观看久久av| 秋霞网一区二区三区| 欧美日韩免费一区| 欧美一级淫片免费视频魅影视频| 另类图片亚洲另类| 另类一区二区三区| 欧美下载看逼逼| 在线亚洲欧美| 日本一区二区免费视频| 亚洲乱码日产精品bd| 亚洲影院一区二区三区| 亚洲深夜福利在线| 咪咪网在线视频| 国产精品区一区| 欧美日韩免费观看一区=区三区| 中文av一区二区三区| 国产人妖乱国产精品人妖| 91看片在线播放| 精品动漫一区二区三区在线观看| av片在线观看| 91综合免费在线| 希岛爱理av一区二区三区| 网站一区二区三区| 国产人成亚洲第一网站在线播放 | 黄色一级片一级片| 91福利国产精品| 国产在线观看黄| 日本伊人精品一区二区三区介绍 | 国产精品av免费观看| 国产美女娇喘av呻吟久久| 网爆门在线观看| 欧美另类高清zo欧美| 免费的黄网站在线观看| 成人h视频在线| 小处雏高清一区二区三区| 天堂在线一区二区三区| 综合婷婷亚洲小说| av观看在线免费| 欧美精品成人在线| 欧美电影在线观看免费| 国产免费黄色av| 久久精品欧美日韩精品| 五月婷婷丁香在线| 日韩最新在线视频| 国产精品成人3p一区二区三区| 国产女人18毛片| 成人国产视频在线观看| 国产精品视频一区在线观看| 亚洲欧美在线免费观看| 精品网站在线| 天堂v在线视频| 成人污污视频在线观看| 毛片在线免费视频| 国产亚洲成av人片在线观看桃| 久久久国产精品网站| 在线精品日韩| 成人国产精品视频| 久久精品视频7| 久久久国产精品亚洲一区| 中文字幕一区二区三区日韩精品 | 免费看av不卡| 亚洲精品中文字幕乱码三区不卡| 国内精品免费**视频| 日本少妇裸体做爰| 国产一区二区美女视频| 国产色99精品9i| 浮妇高潮喷白浆视频| 国产精品丝袜一区| www.天堂av.com| 欧美一二三视频| 亚洲一区在线| 国产精品一级黄片| 欧美日本韩国一区二区三区视频| 青草视频在线免费直播| 日本一区视频在线观看免费| 国内精品久久久久影院色| 五月天婷婷丁香| 色系列之999| 久久夜色精品国产噜噜av小说| 五月婷婷之综合激情| 亚洲一区二区三区自拍| 成人在线观看网站| 国产精品免费一区二区三区四区 | 91人人澡人人爽| 在线观看网站黄不卡| 美女精品导航| 亚洲综合视频一区| 久久综合色综合88| 成人精品在线播放| 国产欧美日韩视频|