ActiveMQ提高:producer产出率: 产出率=发送数据总量/时间
ActiveMQ默认使用异步发送模式(有同步,异步两种消息发送模式)
保证消息队列高可用性:
1 事务
2 持久化
3 ack确认机制
4 集群
设置useAsyncSend=true,情况下可以最大化提高produer端的发送效率,但是需要容忍小部分消息丢失的可能。
同步发送等send不阻塞了就表示一定发送成功了
异步投递:
异步发送需要接受回执并由客户端再判断一次是否发送成功。
message = session.createTextMessage(“message–”+i);
message.setJMSMessageID(UUID.randomUUID().toString()+"—orderAtguigu");
String msgID=message.getJMSMessageID();
activeMQMessageProducer.send(message,new AsyncCallback(){
@Override
public void onSuccess(){
System.out.println(msgID+“has been ok send”); //消息发送成功回调此方法,每一条消息由唯一msgID标识。记录发送成功的消息
}
@Override
public void onException(JMSException exception)
{
System.out.println(msgID+“fail to send to mq”); //消息发送失败回调此方法,每一条消息由唯一msgID标识。记录发送失败的消息
}
});
延迟投递和定时投递
1 activemq.xml中配置schedulerSupport属性为true , 开启延时或定时投递
2 代码实现
TextMessage message=session.createTextMessage(“delay message–”+i);
message.setLongProperty(ScheduleMessage.AMQ_SCHEDULED_DELAY,delay); #延时delay秒投递消息
message.setLongProperty(ScheduleMessage.AMQ_SCHEDULED_PERIOD,period); #每隔period秒,重复投递消息
message.setLongProperty(ScheduleMessage.AMQ_SCHEDULED_REPEAT,repeat); #重复投递消息的次数 repeat 次
分发策略
ActiveMQ消费重试机制
具体哪些情况会引起消息重发?
1 Client用了transactions且在session中调用了rollback();
2 Client 用了transactions且在调用commit()之前关闭或者没有commit()
3 Client在CLIENT_ACKNOWLEDGE的传递模式下,在session中调用了recover()。#recover()消息重发命令
消息重发时间间隔和重发次数
间隔 1
次数 6
有毒消息Poison ACK的理解:
一个消息被redelivedred(重发)超过默认的最大重发次数(6)时,消费端会给MQ发送一个"poison ack"表示这个消息有毒,告诉broker不要再发了。这个
时候broker会把这个消息放到DLQ(死信队列)
死信队列:开发人员可以通过死信队列,人工处理异常消息。(默认:所有异常消息都存放到死信队列中,且非持久,过期时间的异常消息不会放入死信队列中)
如何保证消息不被重复消费?和幂等性问题?(幂等性问题,即解决重复问题)
给消息做一个唯一主键,如果出现主键重复情况,则不执行消费操作。