RocketMQ中状态模式:消息在不同状态下有不同行为

在RocketMQ中使用状态模式实现消息在不同状态下有不同的行为。

具体来说:

消息的生命周期

一个消息从产生到消费会经历如下多个状态:

  1. 新创建:刚产生的消息,还未发送。
  2. 已发送:消息已经发送给消息broker。
  3. 已接收:消费者已经接收到消息,但还未ack。
  4. 已ACK:消费者已ack该消息,消息broker已接收ack。
  5. Requeue:消息需要重新入队,比如消费失败。
  6. Expired:消息已经过期。

消息状态

RocketMQ定义了消息的状态类:

public abstract class MessageState {

  public abstract void send();

  public abstract void ack();

  public abstract void requeue();

  public abstract void expire();  
}

具体状态

提供不同的状态实现:

public class NewMessageState extends MessageState {

    public void send() {
      // 转移到 Sent 状态   
      this.setState(new SentMessageState()); 
    }
}

public class SentMessageState extends MessageState{

    public void ack() {
       // 转移到 Acked 状态
       this.setState(new AckedMessageState());
    } 
}

状态转换

MessageState state = new NewMessageState();

state.send(); // 发送消息,状态转换

state.ack();  // 消息已ack,再转换一次状态

消息的状态随着生命周期发生转换。

作用

RocketMQ通过状态模式实现消息状态变化:

  • 每个状态拥有不同的行为
  • 状态可以在运行期间改变
  • 当状态转换时,对象的行为也会改变

符合状态模式的定义:

  • 定义多个具体状态类
  • 状态类实现共同接口
  • 允许状态转换
  • 状态转换时对象行为也会变化

总之 RocketMQ利用状态模式,实现了消息在不同生命周期具有不同的行为。