前言
在rabbitmq中有兩種消息處理的模式,一種是推模式/訂閱模式/投遞模式(也叫push模式),消費者調用channel.basicConsume方法訂閱隊列后,由RabbitMQ主動將消息推送給訂閱隊列的消費者;另一種是拉模式/檢索模式(也叫pull模式),需要消費者調用channel.basicGet方法,主動從指定隊列中拉取消息。
- 推模式:消息中間件主動將消息推送給消費者
- 拉模式:消費者主動從消息中間件拉取消息
推模式(push)
1:推模式接收消息是最有效的一種消息處理方式。channel.basicConsume(queneName,consumer)方法將信道(channel)設置成投遞模式,直到取消隊列的訂閱為止;在投遞模式期間,當消息到達RabbitMQ時,RabbitMQ會自動地、不斷地投遞消息給匹配的消費者,而不需要消費端手動來拉取,當然投遞消息的個數還是會受到channel.basicQos的限制。
2:推模式將消息提前推送給消費者,消費者必須設置一個緩沖區緩存這些消息。優點是消費者總是有一堆在內存中待處理的消息,所以當真正去消費消息時效率很高。缺點就是緩沖區可能會溢出。
3:由於推模式是信息到達RabbitMQ后,就會立即被投遞給匹配的消費者,所以實時性非常好,消費者能及時得到最新的消息。
拉模式(pull)
1:如果只想從隊列中獲取單條消息而不是持續訂閱,則可以使用channel.basicGet方法來進行消費消息。
2:拉模式在消費者需要時才去消息中間件拉取消息,這段網絡開銷會明顯增加消息延遲,降低系統吞吐量。
3:由於拉模式需要消費者手動去RabbitMQ中拉取消息,所以實時性較差;消費者難以獲取實時消息,具體什么時候能拿到新消息完全取決於消費者什么時候去拉取消息。
結論
1:不能在循環中使用拉模式來模擬推模式,因為拉模式每次都需要去消息中間件中拉取消息來消費,所以會嚴重影響RabbitMQ性能。
2:要想實現高吞吐量,消費者需要使用推模式。