我舉個例子,我們以前做過一個mysql binlog
同步的系統,壓力還是非常大的,日同步資料要達到上億,就是說資料從一個mysql 函式庫原封不動地同步到另一個mysql 函式庫裡面去(mysql -> mysql)。常見的一點在於說例如大數據 team,就需要同步一個 mysql 函式庫過來,對公司的業務系統的資料做各種複雜的操作。
你在mysql 裡增刪改一條數據,對應出來了增刪改3 條 binlog
日誌,接著這三條 binlog
發送到MQ 裡面,再消費出來依次執行,起碼得保證人家是依照順序來的吧?不然本來是:增加、修改、刪除;你楞是換了順序給執行成刪除、修改、增加,不全錯了麼。
本來這個資料同步過來,應該最後這個資料被刪除了;結果你搞錯了這個順序,最後這個資料保留下來了,資料同步就出錯了。
先看看順序會錯亂的兩個場景:
RabbitMQ:一個 queue,多個 consumer。例如,生產者向 RabbitMQ 裡發送了三條數據,順序依序是 data1/data2/data3,壓入的是 RabbitMQ 的記憶體佇列。有三個消費者分別從 MQ 消費這三條資料中的一條,結果消費者2先執行完操作,把 data2 存入資料庫,然後是 data1/data3。這不明顯亂了。
Kafka:比如說我們建了一個 topic,有三個 partition。生產者在寫的時候,其實可以指定一個key,比如說我們指定了某個訂單id 作為key,那麼這個訂單相關的數據,一定會被分發到同一個partition 中去,而且這個partition 中的數據一定是有順序的。
消費者從 partition 取出來資料的時候,也一定是有順序的。到這裡,順序還是 ok 的,沒有錯亂。接著,我們在消費者裡可能會搞多個執行緒來並發處理訊息。因為如果消費者是單執行緒消費處理,而處理比較耗時的話,例如處理一則訊息耗時幾十 ms,那麼 1 秒鐘只能處理幾十則訊息,這吞吐量太低了。而多個線程並發跑的話,順序可能就亂掉了。
解決方案
RabbitMQ
拆分多個queue,每個queue 一個consumer,就是多一些queue 而已,確實是麻煩點;或者就一個queue 但是對應一個consumer,然後這個consumer 內部用內存隊列做排隊,然後分發給底層不同的worker 來處理。
Kafka
一個 topic,一個 partition,一個 consumer,內部單執行緒消費,單執行緒吞吐量太低,一般不會用這個。
寫N 個記憶體queue,具有相同key 的資料都到同一個記憶體queue;然後對於N 個線程,每個執行緒分別消費一個記憶體queue 即可,這樣就能保證順序性。
以上是mysql怎麼保證訊息的順序性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

ACID屬性包括原子性、一致性、隔離性和持久性,是數據庫設計的基石。 1.原子性確保事務要么完全成功,要么完全失敗。 2.一致性保證數據庫在事務前後保持一致狀態。 3.隔離性確保事務之間互不干擾。 4.持久性確保事務提交後數據永久保存。

MySQL既是數據庫管理系統(DBMS),也與編程語言緊密相關。 1)作為DBMS,MySQL用於存儲、組織和檢索數據,優化索引可提高查詢性能。 2)通過SQL與編程語言結合,嵌入在如Python中,使用ORM工具如SQLAlchemy可簡化操作。 3)性能優化包括索引、查詢、緩存、分庫分錶和事務管理。

MySQL使用SQL命令管理數據。 1.基本命令包括SELECT、INSERT、UPDATE和DELETE。 2.高級用法涉及JOIN、子查詢和聚合函數。 3.常見錯誤有語法、邏輯和性能問題。 4.優化技巧包括使用索引、避免SELECT*和使用LIMIT。

MySQL是一種高效的關係型數據庫管理系統,適用於存儲和管理數據。其優勢包括高性能查詢、靈活的事務處理和豐富的數據類型。實際應用中,MySQL常用於電商平台、社交網絡和內容管理系統,但需注意性能優化、數據安全和擴展性。

SQL和MySQL的關係是標準語言與具體實現的關係。 1.SQL是用於管理和操作關係數據庫的標準語言,允許進行數據的增、刪、改、查。 2.MySQL是一個具體的數據庫管理系統,使用SQL作為其操作語言,並提供高效的數據存儲和管理。

InnoDB使用redologs和undologs確保數據一致性和可靠性。 1.redologs記錄數據頁修改,確保崩潰恢復和事務持久性。 2.undologs記錄數據原始值,支持事務回滾和MVCC。

EXPLAIN命令的關鍵指標包括type、key、rows和Extra。 1)type反映查詢的訪問類型,值越高效率越高,如const優於ALL。 2)key顯示使用的索引,NULL表示無索引。 3)rows預估掃描行數,影響查詢性能。 4)Extra提供額外信息,如Usingfilesort提示需要優化。

Usingtemporary在MySQL查詢中表示需要創建臨時表,常見於使用DISTINCT、GROUPBY或非索引列的ORDERBY。可以通過優化索引和重寫查詢避免其出現,提升查詢性能。具體來說,Usingtemporary出現在EXPLAIN輸出中時,意味著MySQL需要創建臨時表來處理查詢。這通常發生在以下情況:1)使用DISTINCT或GROUPBY時進行去重或分組;2)ORDERBY包含非索引列時進行排序;3)使用複雜的子查詢或聯接操作。優化方法包括:1)為ORDERBY和GROUPB


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境