使用場景
- 應用解耦合:應用之間不用直接調用,可以通過隊列來傳遞消息,完成通信。
- 異步任務:隊列可以用來執行異步任務,任務提交方無需等待結果。
- 削峯填谷:在突發流量時,可以通過隊列做緩衝,不會對後端服務產生較大的壓力,當峯值過去時,可以逐漸消費堆積的數據,來填平流量的低谷。
- 消息廣播:一寫多讀
消息協議
- JMS:是Java的消息服務,規定了Java使用消息服務的API,Spring提供了支持JMS的組件。
- AMQP:是高級消息隊列協議,是應用層協議的開放標準,AMQP不從API層進行限定,而是直接定義網絡交換的數據格式,因此支持跨語言的能力。
常用的消息隊列
- RabbitMQ:支持AMQP、XMPP、SMPP等多種協議,比較重量級,單機吞吐量在萬級。
- ActiveMQ:可以部署於代理模式和P2P模式,支持多種協議,單機吞吐量在萬級,不夠請求,隊列較多的情況支持不是很好。有較低概率丟失消息。
- RocketMQ:單機支持10萬級的吞吐量,使用Java開發,具有高吞吐量,高可用性的特點,適合在大規模分佈式系統中應用。
- Kafka:高性能跨語言分佈式消息隊列,單機吞吐量可以達到10萬級,消息延遲在毫秒級,kafka是完全的分佈式系統,broker、producer、consumer都是原生自動支持分佈式,依賴於zookeeper做分佈式協調,kafka支持一寫多讀,消息可以被多個客戶端消費,消息有可能會重複但是不會丟失。
常用的數據庫中間件
數據庫中間件一般提供了讀寫分離、數據庫水平擴展的能。
- Sharding-Sphere:開源分佈式數據庫中間件解決方案,由Sharding-JDBC、Sharding-Proxy、Sharding-Sidecar幾個獨立的產品組成,使用不同的場景,這幾個產品都提供標準化的數據分片、讀寫分離、柔性事務和數據治理功能,可適用於Java同構異構語言,容器,雲原生等應用場景。
- Mycat:提供分庫分表能,基於Proxy代理模式,後端可以基於多種數據庫實現,代理模式對性能會有一定的影響。