ActiveMq | 異步投遞

異步投遞是什麼?

ActiveMQ支持同步、異步兩種發送的模式將消息發送到broker,模式的選擇對發送延時有巨大的影響。producer能 達到怎樣的產出率
(產出率=發送數據總量/時間)主要受發送延時的影響,使用異步發送可以顯著的提高發送的性能。

ActiveMQ默認使用異步發送的模式:除非明確指定使用同步發送的方式或者在未使用事務的前提下發送持久化的消息,這兩種情況都是同步發送的。
如果你沒有使用事務且發送的是持久化的消息,每一-次發送都是同步發送的且會阻塞producer直到broker返回一個確認,表示消息已
經被安全的持久化到磁盤。確認機制提供了消息安全的保障,但同時會阻塞客戶端帶來了很大的延時。

很多高性能的應用,允許在失敗的情況下有少量的數據丟失。如果你的應用滿足這個特點,你可以使用異步發送來提高生產率,即使發送的是持久化的消息

異步發送
它可以最大化produer端的發送效率。我們通常在發送消息量比較密集的情況下使用異步發送,它可以很大的提升Producer性能;
不過這也帶來了額外的問題,
就是需要消耗較多的Client端內存同時也會導致broker端性能消耗增加;
此外它不能有效的確保消息的發送成功。在useAsyncSend=true的情況 下客戶端需要容忍消息丟失的可能。

如何開啓異步投遞?

在這裏插入圖片描述

異步發送如何確認發送成功?

設置消息回調

ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        activeMQConnectionFactory.setUseAsyncSend(true);
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Queue queue = session.createQueue(ACTIVEMQ_QUEUE_NAME);
        ActiveMQMessageProducer activeMQMessageProducer = (ActiveMQMessageProducer)session.createProducer(queue);
        try {
            for (int i = 0; i < 3; i++) {
                TextMessage textMessage = session.createTextMessage("tx msg--" + i);
                textMessage.setJMSMessageID(UUID.randomUUID().toString()+"orderAtguigu");
                final String  msgId = textMessage.getJMSMessageID();
                activeMQMessageProducer.send(textMessage, new AsyncCallback() {
                    public void onSuccess() {
                        System.out.println("成功發送消息Id:"+msgId);
                    }

                    public void onException(JMSException e) {
                        System.out.println("失敗發送消息Id:"+msgId);
                    }
                });
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章