訊息佇列mq總結(重點看,比較了主流訊息佇列框架)
在面向服務架構中通過訊息代理(比如 RabbitMQ / Kafka等),使用生產者-消費者模式在服務間進行非同步通訊是一種比較好的思想。
因為服務間依賴由強耦合變成了鬆耦合。訊息代理都會提供持久化機制,在消費者負載高或者掉線的情況下會把訊息儲存起來,不會丟失。就是說生產者和消費者不需要同時線上,這是傳統的請求-應答模式比較難做到的,需要一箇中間件來專門做這件事。其次訊息代理可以根據訊息本身做簡單的路由策略,消費者可以根據這個來做負載均衡,業務分離等。
缺點也有,就是需要額外搭建訊息代理叢集(但優點是大於缺點的 ) 。
ZeroMQ 和 RabbitMQ/Kafka 不同,它只是一個非同步訊息庫,在套接字的基礎上提供了類似於訊息代理的機制。使用 ZeroMQ 的話,需要對自己的業務程式碼進行改造,不利於服務解耦。
RabbitMQ 支援 AMQP(二進位制),STOMP(文字),MQTT(二進位制),HTTP(裡面包裝其他協議)等協議。Kafka 使用自己的協議。
Kafka 自身服務和消費者都需要依賴 Zookeeper。
RabbitMQ 在有大量訊息堆積的情況下效能會下降,Kafka不會。畢竟AMQP設計的初衷不是用來持久化海量訊息的,而Kafka一開始是用來處理海量日誌的。
總的來說,RabbitMQ 和 Kafka 都是十分優秀的分散式的訊息代理服務,只要合理部署,不作,基本上可以滿足生產條件下的任何需求。