发送消息类型:普通消息、顺序消息(实现有序消费)、事务消息(解决分布式事务实现最终一致)
RocketMq有两种消费模式:
DefalutMQPushConsumer:推送模式为consumer请求broker建立起长连接的关系,broker每5秒钟监测是否有消息,如果有就推送数据,使用DefalutMQPushConsumer实现消息消费,broker会主动记录消息消费的偏移量(推荐)
DefaultMQPullConsumer:拉取模式为consumer请求broker,一般本地在使用定时任务实现,获取消息状态方便、负载均衡性能可控,消息及时性变差,需要手动记录消息消费的偏移量信息,减少broker的压力
RocketMq消息中间件,ack机制常见应答状态如下:
LocalTransactionState:主要针对事务消息的应答状态
public enum LocalTransactionState{
COMMIT_MESSAGE, //消息提交
ROLLBACK_MESSAGE, //消息回滚
UNKNOW; //未知状态,一般用户处理超时等现象
}
ConsumeConcurrentlyStatus:主要针对消息消费的应答状态
public enum ConsumeConcurrentlyStatus{
CONSUME_SUCCESS, //消息消费成功
RECONSUME_LATER; //消息重试,一般消息消费失败后,RocketMq为保证数据的可靠性,具有重试机制
}
重发时间是(broker.log中)
messageDelayLevel = 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
消息发送步骤:
- 创建DefaultMQProducer
- 设置NameSrv地址
- 开启DefaultMQProducer
- 创建消息Message
- 发送消息
- 关闭DefaultMQProducer
消息生产者:
public class Producer{
public static void main(String[] args){
//1.创建DefaultMQProducer
DefaultMQProducer producer = new DefaultMQProducer("demo_producer_group");
//2.设置Namesrv地址
producer.setNamesrvAddr("192.168.211.144:9876");
//3.开启DefaultMQProducer
producer.start();
//4.创建消息Message //String topic 主题, String tags 主要用于消息过滤, String keys 消息唯一值, byte[] body 消息内容
Message message = new Message("topic_demo","tags","keys 1","heelo!".getBytes(RemotingHelper.DEFAULT_CHARSET);
//5.发送消息
SendResult result = producer.send(message);
System.out.println(result);
//6.关闭DefaultMQProducer
producer.shutdown();
}
}
消息消费者:
public class Consumer{
public static void main(String[] args){
//1.创建DefaultMQPushConsumer
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("demo_consumer_group");
//2.设置namesrv地址
consumer.setNamesrvAddr("192.168.211.141:9876");
//设置消息拉取最大数
consumer.setConsumeMessageBatchMaxSize(2);
//3.设置subscribe,这里是要读取的主题信息
consumer.subscribe("topic_demo", //指定消费的主题
"tags || tagsA || tagsB"); //过滤规则
consumer.setMessageListener(new MessageListenerConcurrently(){
@Override
public ConsumeConcurrentlyStatus consumerMessage(List<MessgeExt> msgs, ConsumeConcurrentlyContext context){
//4.接收消息
for(MessageExt msg : msgs){
//获取主题
String topic = msgs.getTopic();
//获取标签
String tags = msgs.getTags();
//获取信息
byte[] body = msg.getBody();
String result = new String(body,RemotingHelper.DEFAULT_CHARSET);
System.out.println(result);
}
//异常可以返回 ConsumeConcurrentlyStatus.RECONSUME_LATER 消息重试
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
//5.开启Consumer
consumer.start();
}
}
顺序消息指的是在指定发送到一个队列里,然后消费者会轮询所有的队列然后进行消费
事务队列:rocketMq不是强一致性,而是最终一致性。
具体流程如下图所示: