06activeMQ其他问题

消息的发送策略

持久化消息

默认情况下,生产者发送的消息是持久化的。消息发送到broker之后,producer会等待broker对这条消息的处理情况的反馈。

这个过程性能和开销是比较大的,因为这个时候在broker上不但要做消息的接收,同时还要根据自身的设置策略做持久化存储。为了提高持久化发送的性能,可以设置进行异步发送。

activeMQ提供了异步发送的设置方法。

//创建连接工厂
    ActiveMQConnectionFactory connectionFactory =
            new ActiveMQConnectionFactory("tcp://localhost:61617");

    connectionFactory.setUseAsyncSend(true);
    //创建连接
    Connection connection = connectionFactory.createConnection();
    connection.start();

回执窗口大小设置

在同步模式下,消息发送端会等待broker对消息的反馈,直到broker接收消息。在异步模式下producer是非阻塞的,是不知道broker的反馈状态的,那么在broker接收达到极限值后producer还在持续的发消息,这样就会产生问题的。

通过设置回执窗口大小,当producer端发送的消息达到这个设置值之后,会等待服务端的回执,这个时候在继续进行发送。设置方法如下:

connectionFactory.setProducerWindowSize(10240);

非持久化消息

通过设置消息的发送模式为非持久化当消息到达broker之后将不会对消息进行持久化操作,而是放到内存中。

message.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);

非持久化消息模式下,默认就是异步发送模式。所以对于非持久化消息,就需要设置回执窗口大小。

另外如果需要对非持久化消息的每次发送的消息都获得broker的回执的话,可以通过如下设置方法设置

connectionFactory.setAlwaysSyncSend(true);

consumer获取消息是pull还是broker的主动push

默认情况下,mq服务器broker采用异步方式向客户端主动推送消息(push)。也就是说broker在向某个消费者会话推送消息后,不会等待消费者响应消息,直到消费者处理完消息以后,主动向broker返回处理结果。

prefetchsize:预取消息数量

broker端一旦有消息,就主动按照默认设置的规则推送消息给当前活动的消费者。每次推送都有一定的数量限制,而这个数量就是prefetchsize

对于topicqueue两种模式下默认的prefetchsize是不同的。

topic模式下的prefetchsize

  • 持久化消息:1000
  • 非持久化消息:1000

queue模式下的prefetchsize

  • 持久化消息:100
  • 非持久化消息:32766

假如prefetchsize=0,此时对于consumer来说,就是一个pull模式

prefetchsize的设置

Destination destination = session.createQueue("first-queue?customer.prefetchSize=100");

在创建目的地的时候,通过参数可以设置预取消息数量。

非事务模式下的消息确认

在非事务模式下,消费端和服务端在交换确认指令的时候还需要告诉brokerACK_TYPEbroker根据不同的ACK_TYPE对消息做不同的处理。

ACK_TYPE表示确认指令的类型。

  • REDELIVERED_ACK_TYPE:当消费端消费消息发生异常的时候,会发送该指令。此时broker会重新发送该消息到消费端。
  • DELIVERED_ACK_TYPE:表示消息已经接收,但是尚未处理结束。
  • STANDARD_ACK_TYPE:表示消息处理成功。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值