You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by aa...@apache.org on 2022/07/15 03:27:45 UTC

[rocketmq-apis] 12/38: Apply IDL update

This is an automated email from the ASF dual-hosted git repository.

aaronai pushed a commit to branch java
in repository https://gitbox.apache.org/repos/asf/rocketmq-apis.git

commit 46b06a4d7e0761dc612c70c38812adb341ec3cf5
Author: 凌楚 <ya...@alibaba-inc.com>
AuthorDate: Sun Apr 24 13:41:04 2022 +0800

    Apply IDL update
---
 .../java/apache/rocketmq/v2/CustomizedBackoff.java | 885 +++++++++++++++++++++
 .../rocketmq/v2/CustomizedBackoffOrBuilder.java    |  58 ++
 .../{RetryPolicy.java => ExponentialBackoff.java}  | 295 ++-----
 ...ilder.java => ExponentialBackoffOrBuilder.java} |  22 +-
 src/main/java/apache/rocketmq/v2/MQDomain.java     | 257 +++---
 src/main/java/apache/rocketmq/v2/MQService.java    | 319 ++++----
 .../apache/rocketmq/v2/MessagingServiceGrpc.java   |   9 +
 .../apache/rocketmq/v2/ReceiveMessageResponse.java | 373 +++------
 .../v2/ReceiveMessageResponseOrBuilder.java        |  25 +-
 src/main/java/apache/rocketmq/v2/RetryPolicy.java  | 610 +++++++++-----
 .../apache/rocketmq/v2/RetryPolicyOrBuilder.java   |  36 +-
 .../apache/rocketmq/v2/SendMessageRequest.java     | 188 -----
 .../rocketmq/v2/SendMessageRequestOrBuilder.java   |  15 -
 src/main/java/apache/rocketmq/v2/Subscription.java | 119 +--
 .../apache/rocketmq/v2/SubscriptionOrBuilder.java  |   6 +-
 .../proto/apache/rocketmq/v2/definition.proto      |  20 +-
 .../proto/apache/rocketmq/v2/service.proto         |   9 +-
 17 files changed, 1985 insertions(+), 1261 deletions(-)

diff --git a/src/main/java/apache/rocketmq/v2/CustomizedBackoff.java b/src/main/java/apache/rocketmq/v2/CustomizedBackoff.java
new file mode 100644
index 0000000..c764d74
--- /dev/null
+++ b/src/main/java/apache/rocketmq/v2/CustomizedBackoff.java
@@ -0,0 +1,885 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: apache/rocketmq/v2/definition.proto
+
+package apache.rocketmq.v2;
+
+/**
+ * Protobuf type {@code apache.rocketmq.v2.CustomizedBackoff}
+ */
+public final class CustomizedBackoff extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:apache.rocketmq.v2.CustomizedBackoff)
+    CustomizedBackoffOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use CustomizedBackoff.newBuilder() to construct.
+  private CustomizedBackoff(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private CustomizedBackoff() {
+    next_ = java.util.Collections.emptyList();
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new CustomizedBackoff();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private CustomizedBackoff(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              next_ = new java.util.ArrayList<com.google.protobuf.Duration>();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            next_.add(
+                input.readMessage(com.google.protobuf.Duration.parser(), extensionRegistry));
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        next_ = java.util.Collections.unmodifiableList(next_);
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_CustomizedBackoff_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_CustomizedBackoff_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            apache.rocketmq.v2.CustomizedBackoff.class, apache.rocketmq.v2.CustomizedBackoff.Builder.class);
+  }
+
+  public static final int NEXT_FIELD_NUMBER = 1;
+  private java.util.List<com.google.protobuf.Duration> next_;
+  /**
+   * <pre>
+   * To support classic backoff strategy which is arbitary defined by end users.
+   * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+   * </pre>
+   *
+   * <code>repeated .google.protobuf.Duration next = 1;</code>
+   */
+  @java.lang.Override
+  public java.util.List<com.google.protobuf.Duration> getNextList() {
+    return next_;
+  }
+  /**
+   * <pre>
+   * To support classic backoff strategy which is arbitary defined by end users.
+   * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+   * </pre>
+   *
+   * <code>repeated .google.protobuf.Duration next = 1;</code>
+   */
+  @java.lang.Override
+  public java.util.List<? extends com.google.protobuf.DurationOrBuilder> 
+      getNextOrBuilderList() {
+    return next_;
+  }
+  /**
+   * <pre>
+   * To support classic backoff strategy which is arbitary defined by end users.
+   * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+   * </pre>
+   *
+   * <code>repeated .google.protobuf.Duration next = 1;</code>
+   */
+  @java.lang.Override
+  public int getNextCount() {
+    return next_.size();
+  }
+  /**
+   * <pre>
+   * To support classic backoff strategy which is arbitary defined by end users.
+   * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+   * </pre>
+   *
+   * <code>repeated .google.protobuf.Duration next = 1;</code>
+   */
+  @java.lang.Override
+  public com.google.protobuf.Duration getNext(int index) {
+    return next_.get(index);
+  }
+  /**
+   * <pre>
+   * To support classic backoff strategy which is arbitary defined by end users.
+   * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+   * </pre>
+   *
+   * <code>repeated .google.protobuf.Duration next = 1;</code>
+   */
+  @java.lang.Override
+  public com.google.protobuf.DurationOrBuilder getNextOrBuilder(
+      int index) {
+    return next_.get(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    for (int i = 0; i < next_.size(); i++) {
+      output.writeMessage(1, next_.get(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    for (int i = 0; i < next_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, next_.get(i));
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof apache.rocketmq.v2.CustomizedBackoff)) {
+      return super.equals(obj);
+    }
+    apache.rocketmq.v2.CustomizedBackoff other = (apache.rocketmq.v2.CustomizedBackoff) obj;
+
+    if (!getNextList()
+        .equals(other.getNextList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (getNextCount() > 0) {
+      hash = (37 * hash) + NEXT_FIELD_NUMBER;
+      hash = (53 * hash) + getNextList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static apache.rocketmq.v2.CustomizedBackoff parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static apache.rocketmq.v2.CustomizedBackoff parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static apache.rocketmq.v2.CustomizedBackoff parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static apache.rocketmq.v2.CustomizedBackoff parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static apache.rocketmq.v2.CustomizedBackoff parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static apache.rocketmq.v2.CustomizedBackoff parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static apache.rocketmq.v2.CustomizedBackoff parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static apache.rocketmq.v2.CustomizedBackoff parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static apache.rocketmq.v2.CustomizedBackoff parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static apache.rocketmq.v2.CustomizedBackoff parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static apache.rocketmq.v2.CustomizedBackoff parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static apache.rocketmq.v2.CustomizedBackoff parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(apache.rocketmq.v2.CustomizedBackoff prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code apache.rocketmq.v2.CustomizedBackoff}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:apache.rocketmq.v2.CustomizedBackoff)
+      apache.rocketmq.v2.CustomizedBackoffOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_CustomizedBackoff_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_CustomizedBackoff_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              apache.rocketmq.v2.CustomizedBackoff.class, apache.rocketmq.v2.CustomizedBackoff.Builder.class);
+    }
+
+    // Construct using apache.rocketmq.v2.CustomizedBackoff.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getNextFieldBuilder();
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (nextBuilder_ == null) {
+        next_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      } else {
+        nextBuilder_.clear();
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_CustomizedBackoff_descriptor;
+    }
+
+    @java.lang.Override
+    public apache.rocketmq.v2.CustomizedBackoff getDefaultInstanceForType() {
+      return apache.rocketmq.v2.CustomizedBackoff.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public apache.rocketmq.v2.CustomizedBackoff build() {
+      apache.rocketmq.v2.CustomizedBackoff result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public apache.rocketmq.v2.CustomizedBackoff buildPartial() {
+      apache.rocketmq.v2.CustomizedBackoff result = new apache.rocketmq.v2.CustomizedBackoff(this);
+      int from_bitField0_ = bitField0_;
+      if (nextBuilder_ == null) {
+        if (((bitField0_ & 0x00000001) != 0)) {
+          next_ = java.util.Collections.unmodifiableList(next_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.next_ = next_;
+      } else {
+        result.next_ = nextBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof apache.rocketmq.v2.CustomizedBackoff) {
+        return mergeFrom((apache.rocketmq.v2.CustomizedBackoff)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(apache.rocketmq.v2.CustomizedBackoff other) {
+      if (other == apache.rocketmq.v2.CustomizedBackoff.getDefaultInstance()) return this;
+      if (nextBuilder_ == null) {
+        if (!other.next_.isEmpty()) {
+          if (next_.isEmpty()) {
+            next_ = other.next_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureNextIsMutable();
+            next_.addAll(other.next_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.next_.isEmpty()) {
+          if (nextBuilder_.isEmpty()) {
+            nextBuilder_.dispose();
+            nextBuilder_ = null;
+            next_ = other.next_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+            nextBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getNextFieldBuilder() : null;
+          } else {
+            nextBuilder_.addAllMessages(other.next_);
+          }
+        }
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      apache.rocketmq.v2.CustomizedBackoff parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (apache.rocketmq.v2.CustomizedBackoff) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private java.util.List<com.google.protobuf.Duration> next_ =
+      java.util.Collections.emptyList();
+    private void ensureNextIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        next_ = new java.util.ArrayList<com.google.protobuf.Duration>(next_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder> nextBuilder_;
+
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public java.util.List<com.google.protobuf.Duration> getNextList() {
+      if (nextBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(next_);
+      } else {
+        return nextBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public int getNextCount() {
+      if (nextBuilder_ == null) {
+        return next_.size();
+      } else {
+        return nextBuilder_.getCount();
+      }
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public com.google.protobuf.Duration getNext(int index) {
+      if (nextBuilder_ == null) {
+        return next_.get(index);
+      } else {
+        return nextBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public Builder setNext(
+        int index, com.google.protobuf.Duration value) {
+      if (nextBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNextIsMutable();
+        next_.set(index, value);
+        onChanged();
+      } else {
+        nextBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public Builder setNext(
+        int index, com.google.protobuf.Duration.Builder builderForValue) {
+      if (nextBuilder_ == null) {
+        ensureNextIsMutable();
+        next_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        nextBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public Builder addNext(com.google.protobuf.Duration value) {
+      if (nextBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNextIsMutable();
+        next_.add(value);
+        onChanged();
+      } else {
+        nextBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public Builder addNext(
+        int index, com.google.protobuf.Duration value) {
+      if (nextBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNextIsMutable();
+        next_.add(index, value);
+        onChanged();
+      } else {
+        nextBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public Builder addNext(
+        com.google.protobuf.Duration.Builder builderForValue) {
+      if (nextBuilder_ == null) {
+        ensureNextIsMutable();
+        next_.add(builderForValue.build());
+        onChanged();
+      } else {
+        nextBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public Builder addNext(
+        int index, com.google.protobuf.Duration.Builder builderForValue) {
+      if (nextBuilder_ == null) {
+        ensureNextIsMutable();
+        next_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        nextBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public Builder addAllNext(
+        java.lang.Iterable<? extends com.google.protobuf.Duration> values) {
+      if (nextBuilder_ == null) {
+        ensureNextIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, next_);
+        onChanged();
+      } else {
+        nextBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public Builder clearNext() {
+      if (nextBuilder_ == null) {
+        next_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+      } else {
+        nextBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public Builder removeNext(int index) {
+      if (nextBuilder_ == null) {
+        ensureNextIsMutable();
+        next_.remove(index);
+        onChanged();
+      } else {
+        nextBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public com.google.protobuf.Duration.Builder getNextBuilder(
+        int index) {
+      return getNextFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public com.google.protobuf.DurationOrBuilder getNextOrBuilder(
+        int index) {
+      if (nextBuilder_ == null) {
+        return next_.get(index);  } else {
+        return nextBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public java.util.List<? extends com.google.protobuf.DurationOrBuilder> 
+         getNextOrBuilderList() {
+      if (nextBuilder_ != null) {
+        return nextBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(next_);
+      }
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public com.google.protobuf.Duration.Builder addNextBuilder() {
+      return getNextFieldBuilder().addBuilder(
+          com.google.protobuf.Duration.getDefaultInstance());
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public com.google.protobuf.Duration.Builder addNextBuilder(
+        int index) {
+      return getNextFieldBuilder().addBuilder(
+          index, com.google.protobuf.Duration.getDefaultInstance());
+    }
+    /**
+     * <pre>
+     * To support classic backoff strategy which is arbitary defined by end users.
+     * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.Duration next = 1;</code>
+     */
+    public java.util.List<com.google.protobuf.Duration.Builder> 
+         getNextBuilderList() {
+      return getNextFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder> 
+        getNextFieldBuilder() {
+      if (nextBuilder_ == null) {
+        nextBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder>(
+                next_,
+                ((bitField0_ & 0x00000001) != 0),
+                getParentForChildren(),
+                isClean());
+        next_ = null;
+      }
+      return nextBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:apache.rocketmq.v2.CustomizedBackoff)
+  }
+
+  // @@protoc_insertion_point(class_scope:apache.rocketmq.v2.CustomizedBackoff)
+  private static final apache.rocketmq.v2.CustomizedBackoff DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new apache.rocketmq.v2.CustomizedBackoff();
+  }
+
+  public static apache.rocketmq.v2.CustomizedBackoff getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<CustomizedBackoff>
+      PARSER = new com.google.protobuf.AbstractParser<CustomizedBackoff>() {
+    @java.lang.Override
+    public CustomizedBackoff parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new CustomizedBackoff(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<CustomizedBackoff> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<CustomizedBackoff> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public apache.rocketmq.v2.CustomizedBackoff getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/apache/rocketmq/v2/CustomizedBackoffOrBuilder.java b/src/main/java/apache/rocketmq/v2/CustomizedBackoffOrBuilder.java
new file mode 100644
index 0000000..eb65f62
--- /dev/null
+++ b/src/main/java/apache/rocketmq/v2/CustomizedBackoffOrBuilder.java
@@ -0,0 +1,58 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: apache/rocketmq/v2/definition.proto
+
+package apache.rocketmq.v2;
+
+public interface CustomizedBackoffOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:apache.rocketmq.v2.CustomizedBackoff)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * To support classic backoff strategy which is arbitary defined by end users.
+   * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+   * </pre>
+   *
+   * <code>repeated .google.protobuf.Duration next = 1;</code>
+   */
+  java.util.List<com.google.protobuf.Duration> 
+      getNextList();
+  /**
+   * <pre>
+   * To support classic backoff strategy which is arbitary defined by end users.
+   * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+   * </pre>
+   *
+   * <code>repeated .google.protobuf.Duration next = 1;</code>
+   */
+  com.google.protobuf.Duration getNext(int index);
+  /**
+   * <pre>
+   * To support classic backoff strategy which is arbitary defined by end users.
+   * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+   * </pre>
+   *
+   * <code>repeated .google.protobuf.Duration next = 1;</code>
+   */
+  int getNextCount();
+  /**
+   * <pre>
+   * To support classic backoff strategy which is arbitary defined by end users.
+   * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+   * </pre>
+   *
+   * <code>repeated .google.protobuf.Duration next = 1;</code>
+   */
+  java.util.List<? extends com.google.protobuf.DurationOrBuilder> 
+      getNextOrBuilderList();
+  /**
+   * <pre>
+   * To support classic backoff strategy which is arbitary defined by end users.
+   * Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+   * </pre>
+   *
+   * <code>repeated .google.protobuf.Duration next = 1;</code>
+   */
+  com.google.protobuf.DurationOrBuilder getNextOrBuilder(
+      int index);
+}
diff --git a/src/main/java/apache/rocketmq/v2/RetryPolicy.java b/src/main/java/apache/rocketmq/v2/ExponentialBackoff.java
similarity index 67%
copy from src/main/java/apache/rocketmq/v2/RetryPolicy.java
copy to src/main/java/apache/rocketmq/v2/ExponentialBackoff.java
index 75cf0be..d03bf1e 100644
--- a/src/main/java/apache/rocketmq/v2/RetryPolicy.java
+++ b/src/main/java/apache/rocketmq/v2/ExponentialBackoff.java
@@ -4,25 +4,25 @@
 package apache.rocketmq.v2;
 
 /**
- * Protobuf type {@code apache.rocketmq.v2.RetryPolicy}
+ * Protobuf type {@code apache.rocketmq.v2.ExponentialBackoff}
  */
-public final class RetryPolicy extends
+public final class ExponentialBackoff extends
     com.google.protobuf.GeneratedMessageV3 implements
-    // @@protoc_insertion_point(message_implements:apache.rocketmq.v2.RetryPolicy)
-    RetryPolicyOrBuilder {
+    // @@protoc_insertion_point(message_implements:apache.rocketmq.v2.ExponentialBackoff)
+    ExponentialBackoffOrBuilder {
 private static final long serialVersionUID = 0L;
-  // Use RetryPolicy.newBuilder() to construct.
-  private RetryPolicy(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+  // Use ExponentialBackoff.newBuilder() to construct.
+  private ExponentialBackoff(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
     super(builder);
   }
-  private RetryPolicy() {
+  private ExponentialBackoff() {
   }
 
   @java.lang.Override
   @SuppressWarnings({"unused"})
   protected java.lang.Object newInstance(
       UnusedPrivateParameter unused) {
-    return new RetryPolicy();
+    return new ExponentialBackoff();
   }
 
   @java.lang.Override
@@ -30,7 +30,7 @@ private static final long serialVersionUID = 0L;
   getUnknownFields() {
     return this.unknownFields;
   }
-  private RetryPolicy(
+  private ExponentialBackoff(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
@@ -48,31 +48,21 @@ private static final long serialVersionUID = 0L;
           case 0:
             done = true;
             break;
-          case 8: {
-
-            maxAttempts_ = input.readInt32();
-            break;
-          }
-          case 21: {
+          case 13: {
 
             initialBackoff_ = input.readFloat();
             break;
           }
-          case 29: {
+          case 21: {
 
             maxBackoff_ = input.readFloat();
             break;
           }
-          case 37: {
+          case 29: {
 
             backoffMultiplier_ = input.readFloat();
             break;
           }
-          case 40: {
-
-            random_ = input.readBool();
-            break;
-          }
           default: {
             if (!parseUnknownField(
                 input, unknownFields, extensionRegistry, tag)) {
@@ -94,32 +84,21 @@ private static final long serialVersionUID = 0L;
   }
   public static final com.google.protobuf.Descriptors.Descriptor
       getDescriptor() {
-    return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_RetryPolicy_descriptor;
+    return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_ExponentialBackoff_descriptor;
   }
 
   @java.lang.Override
   protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internalGetFieldAccessorTable() {
-    return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_RetryPolicy_fieldAccessorTable
+    return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_ExponentialBackoff_fieldAccessorTable
         .ensureFieldAccessorsInitialized(
-            apache.rocketmq.v2.RetryPolicy.class, apache.rocketmq.v2.RetryPolicy.Builder.class);
-  }
-
-  public static final int MAX_ATTEMPTS_FIELD_NUMBER = 1;
-  private int maxAttempts_;
-  /**
-   * <code>int32 max_attempts = 1;</code>
-   * @return The maxAttempts.
-   */
-  @java.lang.Override
-  public int getMaxAttempts() {
-    return maxAttempts_;
+            apache.rocketmq.v2.ExponentialBackoff.class, apache.rocketmq.v2.ExponentialBackoff.Builder.class);
   }
 
-  public static final int INITIAL_BACKOFF_FIELD_NUMBER = 2;
+  public static final int INITIAL_BACKOFF_FIELD_NUMBER = 1;
   private float initialBackoff_;
   /**
-   * <code>float initial_backoff = 2;</code>
+   * <code>float initial_backoff = 1;</code>
    * @return The initialBackoff.
    */
   @java.lang.Override
@@ -127,10 +106,10 @@ private static final long serialVersionUID = 0L;
     return initialBackoff_;
   }
 
-  public static final int MAX_BACKOFF_FIELD_NUMBER = 3;
+  public static final int MAX_BACKOFF_FIELD_NUMBER = 2;
   private float maxBackoff_;
   /**
-   * <code>float max_backoff = 3;</code>
+   * <code>float max_backoff = 2;</code>
    * @return The maxBackoff.
    */
   @java.lang.Override
@@ -138,10 +117,10 @@ private static final long serialVersionUID = 0L;
     return maxBackoff_;
   }
 
-  public static final int BACKOFF_MULTIPLIER_FIELD_NUMBER = 4;
+  public static final int BACKOFF_MULTIPLIER_FIELD_NUMBER = 3;
   private float backoffMultiplier_;
   /**
-   * <code>float backoff_multiplier = 4;</code>
+   * <code>float backoff_multiplier = 3;</code>
    * @return The backoffMultiplier.
    */
   @java.lang.Override
@@ -149,17 +128,6 @@ private static final long serialVersionUID = 0L;
     return backoffMultiplier_;
   }
 
-  public static final int RANDOM_FIELD_NUMBER = 5;
-  private boolean random_;
-  /**
-   * <code>bool random = 5;</code>
-   * @return The random.
-   */
-  @java.lang.Override
-  public boolean getRandom() {
-    return random_;
-  }
-
   private byte memoizedIsInitialized = -1;
   @java.lang.Override
   public final boolean isInitialized() {
@@ -174,20 +142,14 @@ private static final long serialVersionUID = 0L;
   @java.lang.Override
   public void writeTo(com.google.protobuf.CodedOutputStream output)
                       throws java.io.IOException {
-    if (maxAttempts_ != 0) {
-      output.writeInt32(1, maxAttempts_);
-    }
     if (java.lang.Float.floatToRawIntBits(initialBackoff_) != 0) {
-      output.writeFloat(2, initialBackoff_);
+      output.writeFloat(1, initialBackoff_);
     }
     if (java.lang.Float.floatToRawIntBits(maxBackoff_) != 0) {
-      output.writeFloat(3, maxBackoff_);
+      output.writeFloat(2, maxBackoff_);
     }
     if (java.lang.Float.floatToRawIntBits(backoffMultiplier_) != 0) {
-      output.writeFloat(4, backoffMultiplier_);
-    }
-    if (random_ != false) {
-      output.writeBool(5, random_);
+      output.writeFloat(3, backoffMultiplier_);
     }
     unknownFields.writeTo(output);
   }
@@ -198,25 +160,17 @@ private static final long serialVersionUID = 0L;
     if (size != -1) return size;
 
     size = 0;
-    if (maxAttempts_ != 0) {
-      size += com.google.protobuf.CodedOutputStream
-        .computeInt32Size(1, maxAttempts_);
-    }
     if (java.lang.Float.floatToRawIntBits(initialBackoff_) != 0) {
       size += com.google.protobuf.CodedOutputStream
-        .computeFloatSize(2, initialBackoff_);
+        .computeFloatSize(1, initialBackoff_);
     }
     if (java.lang.Float.floatToRawIntBits(maxBackoff_) != 0) {
       size += com.google.protobuf.CodedOutputStream
-        .computeFloatSize(3, maxBackoff_);
+        .computeFloatSize(2, maxBackoff_);
     }
     if (java.lang.Float.floatToRawIntBits(backoffMultiplier_) != 0) {
       size += com.google.protobuf.CodedOutputStream
-        .computeFloatSize(4, backoffMultiplier_);
-    }
-    if (random_ != false) {
-      size += com.google.protobuf.CodedOutputStream
-        .computeBoolSize(5, random_);
+        .computeFloatSize(3, backoffMultiplier_);
     }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
@@ -228,13 +182,11 @@ private static final long serialVersionUID = 0L;
     if (obj == this) {
      return true;
     }
-    if (!(obj instanceof apache.rocketmq.v2.RetryPolicy)) {
+    if (!(obj instanceof apache.rocketmq.v2.ExponentialBackoff)) {
       return super.equals(obj);
     }
-    apache.rocketmq.v2.RetryPolicy other = (apache.rocketmq.v2.RetryPolicy) obj;
+    apache.rocketmq.v2.ExponentialBackoff other = (apache.rocketmq.v2.ExponentialBackoff) obj;
 
-    if (getMaxAttempts()
-        != other.getMaxAttempts()) return false;
     if (java.lang.Float.floatToIntBits(getInitialBackoff())
         != java.lang.Float.floatToIntBits(
             other.getInitialBackoff())) return false;
@@ -244,8 +196,6 @@ private static final long serialVersionUID = 0L;
     if (java.lang.Float.floatToIntBits(getBackoffMultiplier())
         != java.lang.Float.floatToIntBits(
             other.getBackoffMultiplier())) return false;
-    if (getRandom()
-        != other.getRandom()) return false;
     if (!unknownFields.equals(other.unknownFields)) return false;
     return true;
   }
@@ -257,8 +207,6 @@ private static final long serialVersionUID = 0L;
     }
     int hash = 41;
     hash = (19 * hash) + getDescriptor().hashCode();
-    hash = (37 * hash) + MAX_ATTEMPTS_FIELD_NUMBER;
-    hash = (53 * hash) + getMaxAttempts();
     hash = (37 * hash) + INITIAL_BACKOFF_FIELD_NUMBER;
     hash = (53 * hash) + java.lang.Float.floatToIntBits(
         getInitialBackoff());
@@ -268,77 +216,74 @@ private static final long serialVersionUID = 0L;
     hash = (37 * hash) + BACKOFF_MULTIPLIER_FIELD_NUMBER;
     hash = (53 * hash) + java.lang.Float.floatToIntBits(
         getBackoffMultiplier());
-    hash = (37 * hash) + RANDOM_FIELD_NUMBER;
-    hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
-        getRandom());
     hash = (29 * hash) + unknownFields.hashCode();
     memoizedHashCode = hash;
     return hash;
   }
 
-  public static apache.rocketmq.v2.RetryPolicy parseFrom(
+  public static apache.rocketmq.v2.ExponentialBackoff parseFrom(
       java.nio.ByteBuffer data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static apache.rocketmq.v2.RetryPolicy parseFrom(
+  public static apache.rocketmq.v2.ExponentialBackoff parseFrom(
       java.nio.ByteBuffer data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static apache.rocketmq.v2.RetryPolicy parseFrom(
+  public static apache.rocketmq.v2.ExponentialBackoff parseFrom(
       com.google.protobuf.ByteString data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static apache.rocketmq.v2.RetryPolicy parseFrom(
+  public static apache.rocketmq.v2.ExponentialBackoff parseFrom(
       com.google.protobuf.ByteString data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static apache.rocketmq.v2.RetryPolicy parseFrom(byte[] data)
+  public static apache.rocketmq.v2.ExponentialBackoff parseFrom(byte[] data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static apache.rocketmq.v2.RetryPolicy parseFrom(
+  public static apache.rocketmq.v2.ExponentialBackoff parseFrom(
       byte[] data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static apache.rocketmq.v2.RetryPolicy parseFrom(java.io.InputStream input)
+  public static apache.rocketmq.v2.ExponentialBackoff parseFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static apache.rocketmq.v2.RetryPolicy parseFrom(
+  public static apache.rocketmq.v2.ExponentialBackoff parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input, extensionRegistry);
   }
-  public static apache.rocketmq.v2.RetryPolicy parseDelimitedFrom(java.io.InputStream input)
+  public static apache.rocketmq.v2.ExponentialBackoff parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input);
   }
-  public static apache.rocketmq.v2.RetryPolicy parseDelimitedFrom(
+  public static apache.rocketmq.v2.ExponentialBackoff parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
-  public static apache.rocketmq.v2.RetryPolicy parseFrom(
+  public static apache.rocketmq.v2.ExponentialBackoff parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static apache.rocketmq.v2.RetryPolicy parseFrom(
+  public static apache.rocketmq.v2.ExponentialBackoff parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
@@ -351,7 +296,7 @@ private static final long serialVersionUID = 0L;
   public static Builder newBuilder() {
     return DEFAULT_INSTANCE.toBuilder();
   }
-  public static Builder newBuilder(apache.rocketmq.v2.RetryPolicy prototype) {
+  public static Builder newBuilder(apache.rocketmq.v2.ExponentialBackoff prototype) {
     return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
   }
   @java.lang.Override
@@ -367,26 +312,26 @@ private static final long serialVersionUID = 0L;
     return builder;
   }
   /**
-   * Protobuf type {@code apache.rocketmq.v2.RetryPolicy}
+   * Protobuf type {@code apache.rocketmq.v2.ExponentialBackoff}
    */
   public static final class Builder extends
       com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-      // @@protoc_insertion_point(builder_implements:apache.rocketmq.v2.RetryPolicy)
-      apache.rocketmq.v2.RetryPolicyOrBuilder {
+      // @@protoc_insertion_point(builder_implements:apache.rocketmq.v2.ExponentialBackoff)
+      apache.rocketmq.v2.ExponentialBackoffOrBuilder {
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_RetryPolicy_descriptor;
+      return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_ExponentialBackoff_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_RetryPolicy_fieldAccessorTable
+      return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_ExponentialBackoff_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              apache.rocketmq.v2.RetryPolicy.class, apache.rocketmq.v2.RetryPolicy.Builder.class);
+              apache.rocketmq.v2.ExponentialBackoff.class, apache.rocketmq.v2.ExponentialBackoff.Builder.class);
     }
 
-    // Construct using apache.rocketmq.v2.RetryPolicy.newBuilder()
+    // Construct using apache.rocketmq.v2.ExponentialBackoff.newBuilder()
     private Builder() {
       maybeForceBuilderInitialization();
     }
@@ -404,33 +349,29 @@ private static final long serialVersionUID = 0L;
     @java.lang.Override
     public Builder clear() {
       super.clear();
-      maxAttempts_ = 0;
-
       initialBackoff_ = 0F;
 
       maxBackoff_ = 0F;
 
       backoffMultiplier_ = 0F;
 
-      random_ = false;
-
       return this;
     }
 
     @java.lang.Override
     public com.google.protobuf.Descriptors.Descriptor
         getDescriptorForType() {
-      return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_RetryPolicy_descriptor;
+      return apache.rocketmq.v2.MQDomain.internal_static_apache_rocketmq_v2_ExponentialBackoff_descriptor;
     }
 
     @java.lang.Override
-    public apache.rocketmq.v2.RetryPolicy getDefaultInstanceForType() {
-      return apache.rocketmq.v2.RetryPolicy.getDefaultInstance();
+    public apache.rocketmq.v2.ExponentialBackoff getDefaultInstanceForType() {
+      return apache.rocketmq.v2.ExponentialBackoff.getDefaultInstance();
     }
 
     @java.lang.Override
-    public apache.rocketmq.v2.RetryPolicy build() {
-      apache.rocketmq.v2.RetryPolicy result = buildPartial();
+    public apache.rocketmq.v2.ExponentialBackoff build() {
+      apache.rocketmq.v2.ExponentialBackoff result = buildPartial();
       if (!result.isInitialized()) {
         throw newUninitializedMessageException(result);
       }
@@ -438,13 +379,11 @@ private static final long serialVersionUID = 0L;
     }
 
     @java.lang.Override
-    public apache.rocketmq.v2.RetryPolicy buildPartial() {
-      apache.rocketmq.v2.RetryPolicy result = new apache.rocketmq.v2.RetryPolicy(this);
-      result.maxAttempts_ = maxAttempts_;
+    public apache.rocketmq.v2.ExponentialBackoff buildPartial() {
+      apache.rocketmq.v2.ExponentialBackoff result = new apache.rocketmq.v2.ExponentialBackoff(this);
       result.initialBackoff_ = initialBackoff_;
       result.maxBackoff_ = maxBackoff_;
       result.backoffMultiplier_ = backoffMultiplier_;
-      result.random_ = random_;
       onBuilt();
       return result;
     }
@@ -483,19 +422,16 @@ private static final long serialVersionUID = 0L;
     }
     @java.lang.Override
     public Builder mergeFrom(com.google.protobuf.Message other) {
-      if (other instanceof apache.rocketmq.v2.RetryPolicy) {
-        return mergeFrom((apache.rocketmq.v2.RetryPolicy)other);
+      if (other instanceof apache.rocketmq.v2.ExponentialBackoff) {
+        return mergeFrom((apache.rocketmq.v2.ExponentialBackoff)other);
       } else {
         super.mergeFrom(other);
         return this;
       }
     }
 
-    public Builder mergeFrom(apache.rocketmq.v2.RetryPolicy other) {
-      if (other == apache.rocketmq.v2.RetryPolicy.getDefaultInstance()) return this;
-      if (other.getMaxAttempts() != 0) {
-        setMaxAttempts(other.getMaxAttempts());
-      }
+    public Builder mergeFrom(apache.rocketmq.v2.ExponentialBackoff other) {
+      if (other == apache.rocketmq.v2.ExponentialBackoff.getDefaultInstance()) return this;
       if (other.getInitialBackoff() != 0F) {
         setInitialBackoff(other.getInitialBackoff());
       }
@@ -505,9 +441,6 @@ private static final long serialVersionUID = 0L;
       if (other.getBackoffMultiplier() != 0F) {
         setBackoffMultiplier(other.getBackoffMultiplier());
       }
-      if (other.getRandom() != false) {
-        setRandom(other.getRandom());
-      }
       this.mergeUnknownFields(other.unknownFields);
       onChanged();
       return this;
@@ -523,11 +456,11 @@ private static final long serialVersionUID = 0L;
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      apache.rocketmq.v2.RetryPolicy parsedMessage = null;
+      apache.rocketmq.v2.ExponentialBackoff parsedMessage = null;
       try {
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        parsedMessage = (apache.rocketmq.v2.RetryPolicy) e.getUnfinishedMessage();
+        parsedMessage = (apache.rocketmq.v2.ExponentialBackoff) e.getUnfinishedMessage();
         throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
@@ -537,40 +470,9 @@ private static final long serialVersionUID = 0L;
       return this;
     }
 
-    private int maxAttempts_ ;
-    /**
-     * <code>int32 max_attempts = 1;</code>
-     * @return The maxAttempts.
-     */
-    @java.lang.Override
-    public int getMaxAttempts() {
-      return maxAttempts_;
-    }
-    /**
-     * <code>int32 max_attempts = 1;</code>
-     * @param value The maxAttempts to set.
-     * @return This builder for chaining.
-     */
-    public Builder setMaxAttempts(int value) {
-      
-      maxAttempts_ = value;
-      onChanged();
-      return this;
-    }
-    /**
-     * <code>int32 max_attempts = 1;</code>
-     * @return This builder for chaining.
-     */
-    public Builder clearMaxAttempts() {
-      
-      maxAttempts_ = 0;
-      onChanged();
-      return this;
-    }
-
     private float initialBackoff_ ;
     /**
-     * <code>float initial_backoff = 2;</code>
+     * <code>float initial_backoff = 1;</code>
      * @return The initialBackoff.
      */
     @java.lang.Override
@@ -578,7 +480,7 @@ private static final long serialVersionUID = 0L;
       return initialBackoff_;
     }
     /**
-     * <code>float initial_backoff = 2;</code>
+     * <code>float initial_backoff = 1;</code>
      * @param value The initialBackoff to set.
      * @return This builder for chaining.
      */
@@ -589,7 +491,7 @@ private static final long serialVersionUID = 0L;
       return this;
     }
     /**
-     * <code>float initial_backoff = 2;</code>
+     * <code>float initial_backoff = 1;</code>
      * @return This builder for chaining.
      */
     public Builder clearInitialBackoff() {
@@ -601,7 +503,7 @@ private static final long serialVersionUID = 0L;
 
     private float maxBackoff_ ;
     /**
-     * <code>float max_backoff = 3;</code>
+     * <code>float max_backoff = 2;</code>
      * @return The maxBackoff.
      */
     @java.lang.Override
@@ -609,7 +511,7 @@ private static final long serialVersionUID = 0L;
       return maxBackoff_;
     }
     /**
-     * <code>float max_backoff = 3;</code>
+     * <code>float max_backoff = 2;</code>
      * @param value The maxBackoff to set.
      * @return This builder for chaining.
      */
@@ -620,7 +522,7 @@ private static final long serialVersionUID = 0L;
       return this;
     }
     /**
-     * <code>float max_backoff = 3;</code>
+     * <code>float max_backoff = 2;</code>
      * @return This builder for chaining.
      */
     public Builder clearMaxBackoff() {
@@ -632,7 +534,7 @@ private static final long serialVersionUID = 0L;
 
     private float backoffMultiplier_ ;
     /**
-     * <code>float backoff_multiplier = 4;</code>
+     * <code>float backoff_multiplier = 3;</code>
      * @return The backoffMultiplier.
      */
     @java.lang.Override
@@ -640,7 +542,7 @@ private static final long serialVersionUID = 0L;
       return backoffMultiplier_;
     }
     /**
-     * <code>float backoff_multiplier = 4;</code>
+     * <code>float backoff_multiplier = 3;</code>
      * @param value The backoffMultiplier to set.
      * @return This builder for chaining.
      */
@@ -651,7 +553,7 @@ private static final long serialVersionUID = 0L;
       return this;
     }
     /**
-     * <code>float backoff_multiplier = 4;</code>
+     * <code>float backoff_multiplier = 3;</code>
      * @return This builder for chaining.
      */
     public Builder clearBackoffMultiplier() {
@@ -660,37 +562,6 @@ private static final long serialVersionUID = 0L;
       onChanged();
       return this;
     }
-
-    private boolean random_ ;
-    /**
-     * <code>bool random = 5;</code>
-     * @return The random.
-     */
-    @java.lang.Override
-    public boolean getRandom() {
-      return random_;
-    }
-    /**
-     * <code>bool random = 5;</code>
-     * @param value The random to set.
-     * @return This builder for chaining.
-     */
-    public Builder setRandom(boolean value) {
-      
-      random_ = value;
-      onChanged();
-      return this;
-    }
-    /**
-     * <code>bool random = 5;</code>
-     * @return This builder for chaining.
-     */
-    public Builder clearRandom() {
-      
-      random_ = false;
-      onChanged();
-      return this;
-    }
     @java.lang.Override
     public final Builder setUnknownFields(
         final com.google.protobuf.UnknownFieldSet unknownFields) {
@@ -704,41 +575,41 @@ private static final long serialVersionUID = 0L;
     }
 
 
-    // @@protoc_insertion_point(builder_scope:apache.rocketmq.v2.RetryPolicy)
+    // @@protoc_insertion_point(builder_scope:apache.rocketmq.v2.ExponentialBackoff)
   }
 
-  // @@protoc_insertion_point(class_scope:apache.rocketmq.v2.RetryPolicy)
-  private static final apache.rocketmq.v2.RetryPolicy DEFAULT_INSTANCE;
+  // @@protoc_insertion_point(class_scope:apache.rocketmq.v2.ExponentialBackoff)
+  private static final apache.rocketmq.v2.ExponentialBackoff DEFAULT_INSTANCE;
   static {
-    DEFAULT_INSTANCE = new apache.rocketmq.v2.RetryPolicy();
+    DEFAULT_INSTANCE = new apache.rocketmq.v2.ExponentialBackoff();
   }
 
-  public static apache.rocketmq.v2.RetryPolicy getDefaultInstance() {
+  public static apache.rocketmq.v2.ExponentialBackoff getDefaultInstance() {
     return DEFAULT_INSTANCE;
   }
 
-  private static final com.google.protobuf.Parser<RetryPolicy>
-      PARSER = new com.google.protobuf.AbstractParser<RetryPolicy>() {
+  private static final com.google.protobuf.Parser<ExponentialBackoff>
+      PARSER = new com.google.protobuf.AbstractParser<ExponentialBackoff>() {
     @java.lang.Override
-    public RetryPolicy parsePartialFrom(
+    public ExponentialBackoff parsePartialFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      return new RetryPolicy(input, extensionRegistry);
+      return new ExponentialBackoff(input, extensionRegistry);
     }
   };
 
-  public static com.google.protobuf.Parser<RetryPolicy> parser() {
+  public static com.google.protobuf.Parser<ExponentialBackoff> parser() {
     return PARSER;
   }
 
   @java.lang.Override
-  public com.google.protobuf.Parser<RetryPolicy> getParserForType() {
+  public com.google.protobuf.Parser<ExponentialBackoff> getParserForType() {
     return PARSER;
   }
 
   @java.lang.Override
-  public apache.rocketmq.v2.RetryPolicy getDefaultInstanceForType() {
+  public apache.rocketmq.v2.ExponentialBackoff getDefaultInstanceForType() {
     return DEFAULT_INSTANCE;
   }
 
diff --git a/src/main/java/apache/rocketmq/v2/RetryPolicyOrBuilder.java b/src/main/java/apache/rocketmq/v2/ExponentialBackoffOrBuilder.java
similarity index 53%
copy from src/main/java/apache/rocketmq/v2/RetryPolicyOrBuilder.java
copy to src/main/java/apache/rocketmq/v2/ExponentialBackoffOrBuilder.java
index 742e8d6..a864d6d 100644
--- a/src/main/java/apache/rocketmq/v2/RetryPolicyOrBuilder.java
+++ b/src/main/java/apache/rocketmq/v2/ExponentialBackoffOrBuilder.java
@@ -3,37 +3,25 @@
 
 package apache.rocketmq.v2;
 
-public interface RetryPolicyOrBuilder extends
-    // @@protoc_insertion_point(interface_extends:apache.rocketmq.v2.RetryPolicy)
+public interface ExponentialBackoffOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:apache.rocketmq.v2.ExponentialBackoff)
     com.google.protobuf.MessageOrBuilder {
 
   /**
-   * <code>int32 max_attempts = 1;</code>
-   * @return The maxAttempts.
-   */
-  int getMaxAttempts();
-
-  /**
-   * <code>float initial_backoff = 2;</code>
+   * <code>float initial_backoff = 1;</code>
    * @return The initialBackoff.
    */
   float getInitialBackoff();
 
   /**
-   * <code>float max_backoff = 3;</code>
+   * <code>float max_backoff = 2;</code>
    * @return The maxBackoff.
    */
   float getMaxBackoff();
 
   /**
-   * <code>float backoff_multiplier = 4;</code>
+   * <code>float backoff_multiplier = 3;</code>
    * @return The backoffMultiplier.
    */
   float getBackoffMultiplier();
-
-  /**
-   * <code>bool random = 5;</code>
-   * @return The random.
-   */
-  boolean getRandom();
 }
diff --git a/src/main/java/apache/rocketmq/v2/MQDomain.java b/src/main/java/apache/rocketmq/v2/MQDomain.java
index 5774f45..ab2def2 100644
--- a/src/main/java/apache/rocketmq/v2/MQDomain.java
+++ b/src/main/java/apache/rocketmq/v2/MQDomain.java
@@ -24,6 +24,16 @@ public final class MQDomain {
   static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_apache_rocketmq_v2_RetryPolicy_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_apache_rocketmq_v2_ExponentialBackoff_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_apache_rocketmq_v2_ExponentialBackoff_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_apache_rocketmq_v2_CustomizedBackoff_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_apache_rocketmq_v2_CustomizedBackoff_fieldAccessorTable;
   static final com.google.protobuf.Descriptors.Descriptor
     internal_static_apache_rocketmq_v2_Resource_descriptor;
   static final 
@@ -103,108 +113,113 @@ public final class MQDomain {
       "tamp.proto\032\036google/protobuf/duration.pro" +
       "to\"T\n\020FilterExpression\022,\n\004type\030\001 \001(\0162\036.a" +
       "pache.rocketmq.v2.FilterType\022\022\n\nexpressi" +
-      "on\030\002 \001(\t\"}\n\013RetryPolicy\022\024\n\014max_attempts\030" +
-      "\001 \001(\005\022\027\n\017initial_backoff\030\002 \001(\002\022\023\n\013max_ba" +
-      "ckoff\030\003 \001(\002\022\032\n\022backoff_multiplier\030\004 \001(\002\022" +
-      "\016\n\006random\030\005 \001(\010\"4\n\010Resource\022\032\n\022resource_" +
-      "namespace\030\001 \001(\t\022\014\n\004name\030\002 \001(\t\"z\n\021Subscri" +
-      "ptionEntry\022+\n\005topic\030\001 \001(\0132\034.apache.rocke" +
-      "tmq.v2.Resource\0228\n\nexpression\030\002 \001(\0132$.ap" +
-      "ache.rocketmq.v2.FilterExpression\"%\n\007Add" +
-      "ress\022\014\n\004host\030\001 \001(\t\022\014\n\004port\030\002 \001(\005\"n\n\tEndp" +
-      "oints\0221\n\006scheme\030\001 \001(\0162!.apache.rocketmq." +
-      "v2.AddressScheme\022.\n\taddresses\030\002 \003(\0132\033.ap" +
-      "ache.rocketmq.v2.Address\"T\n\006Broker\022\014\n\004na" +
-      "me\030\001 \001(\t\022\n\n\002id\030\002 \001(\005\0220\n\tendpoints\030\003 \001(\0132" +
-      "\035.apache.rocketmq.v2.Endpoints\"\346\001\n\014Messa" +
-      "geQueue\022+\n\005topic\030\001 \001(\0132\034.apache.rocketmq" +
-      ".v2.Resource\022\n\n\002id\030\002 \001(\005\0222\n\npermission\030\003" +
-      " \001(\0162\036.apache.rocketmq.v2.Permission\022*\n\006" +
-      "broker\030\004 \001(\0132\032.apache.rocketmq.v2.Broker" +
-      "\022=\n\024accept_message_types\030\005 \003(\0162\037.apache." +
-      "rocketmq.v2.MessageType\"H\n\006Digest\022,\n\004typ" +
-      "e\030\001 \001(\0162\036.apache.rocketmq.v2.DigestType\022" +
-      "\020\n\010checksum\030\002 \001(\t\"\264\007\n\020SystemProperties\022\020" +
-      "\n\003tag\030\001 \001(\tH\000\210\001\001\022\014\n\004keys\030\002 \003(\t\022\022\n\nmessag" +
-      "e_id\030\003 \001(\t\022/\n\013body_digest\030\004 \001(\0132\032.apache" +
-      ".rocketmq.v2.Digest\0223\n\rbody_encoding\030\005 \001" +
-      "(\0162\034.apache.rocketmq.v2.Encoding\0225\n\014mess" +
-      "age_type\030\006 \001(\0162\037.apache.rocketmq.v2.Mess" +
-      "ageType\0222\n\016born_timestamp\030\007 \001(\0132\032.google" +
-      ".protobuf.Timestamp\022\021\n\tborn_host\030\010 \001(\t\0228" +
-      "\n\017store_timestamp\030\t \001(\0132\032.google.protobu" +
-      "f.TimestampH\001\210\001\001\022\022\n\nstore_host\030\n \001(\t\022;\n\022" +
-      "delivery_timestamp\030\013 \001(\0132\032.google.protob" +
-      "uf.TimestampH\002\210\001\001\022\033\n\016receipt_handle\030\014 \001(" +
-      "\tH\003\210\001\001\022\020\n\010queue_id\030\r \001(\005\022\031\n\014queue_offset" +
-      "\030\016 \001(\003H\004\210\001\001\022:\n\022invisible_duration\030\017 \001(\0132" +
-      "\031.google.protobuf.DurationH\005\210\001\001\022\035\n\020deliv" +
-      "ery_attempt\030\020 \001(\005H\006\210\001\001\022\032\n\rmessage_group\030" +
-      "\021 \001(\tH\007\210\001\001\022\032\n\rtrace_context\030\022 \001(\tH\010\210\001\001\022N" +
-      "\n&orphaned_transaction_recovery_duration" +
-      "\030\023 \001(\0132\031.google.protobuf.DurationH\t\210\001\001B\006" +
-      "\n\004_tagB\022\n\020_store_timestampB\025\n\023_delivery_" +
-      "timestampB\021\n\017_receipt_handleB\017\n\r_queue_o" +
-      "ffsetB\025\n\023_invisible_durationB\023\n\021_deliver" +
-      "y_attemptB\020\n\016_message_groupB\020\n\016_trace_co" +
-      "ntextB)\n\'_orphaned_transaction_recovery_" +
-      "duration\"\206\002\n\007Message\022+\n\005topic\030\001 \001(\0132\034.ap" +
-      "ache.rocketmq.v2.Resource\022H\n\017user_proper" +
-      "ties\030\002 \003(\0132/.apache.rocketmq.v2.Message." +
-      "UserPropertiesEntry\022?\n\021system_properties" +
-      "\030\003 \001(\0132$.apache.rocketmq.v2.SystemProper" +
-      "ties\022\014\n\004body\030\004 \001(\014\0325\n\023UserPropertiesEntr" +
-      "y\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"E\n\nAss" +
-      "ignment\0227\n\rmessage_queue\030\001 \001(\0132 .apache." +
-      "rocketmq.v2.MessageQueue\"I\n\013SendReceipt\022" +
-      "\022\n\nmessage_id\030\001 \001(\t\022\026\n\016transaction_id\030\002 " +
-      "\001(\t\022\016\n\006offset\030\003 \001(\003\"A\n\006Status\022&\n\004code\030\001 " +
-      "\001(\0162\030.apache.rocketmq.v2.Code\022\017\n\007message" +
-      "\030\002 \001(\t*Y\n\025TransactionResolution\022&\n\"TRANS" +
-      "ACTION_RESOLUTION_UNSPECIFIED\020\000\022\n\n\006COMMI" +
-      "T\020\001\022\014\n\010ROLLBACK\020\002*W\n\021TransactionSource\022\026" +
-      "\n\022SOURCE_UNSPECIFIED\020\000\022\021\n\rSOURCE_CLIENT\020" +
-      "\001\022\027\n\023SOURCE_SERVER_CHECK\020\002*W\n\nPermission" +
-      "\022\032\n\026PERMISSION_UNSPECIFIED\020\000\022\010\n\004NONE\020\001\022\010" +
-      "\n\004READ\020\002\022\t\n\005WRITE\020\003\022\016\n\nREAD_WRITE\020\004*;\n\nF" +
-      "ilterType\022\033\n\027FILTER_TYPE_UNSPECIFIED\020\000\022\007" +
-      "\n\003TAG\020\001\022\007\n\003SQL\020\002*T\n\rAddressScheme\022\036\n\032ADD" +
-      "RESS_SCHEME_UNSPECIFIED\020\000\022\010\n\004IPv4\020\001\022\010\n\004I" +
-      "Pv6\020\002\022\017\n\013DOMAIN_NAME\020\003*]\n\013MessageType\022\034\n" +
-      "\030MESSAGE_TYPE_UNSPECIFIED\020\000\022\n\n\006NORMAL\020\001\022" +
-      "\010\n\004FIFO\020\002\022\t\n\005DELAY\020\003\022\017\n\013TRANSACTION\020\004*G\n" +
-      "\nDigestType\022\033\n\027DIGEST_TYPE_UNSPECIFIED\020\000" +
-      "\022\t\n\005CRC32\020\001\022\007\n\003MD5\020\002\022\010\n\004SHA1\020\003*_\n\nClient" +
-      "Type\022\033\n\027CLIENT_TYPE_UNSPECIFIED\020\000\022\014\n\010PRO" +
-      "DUCER\020\001\022\021\n\rPUSH_CONSUMER\020\002\022\023\n\017SIMPLE_CON" +
-      "SUMER\020\003*<\n\010Encoding\022\030\n\024ENCODING_UNSPECIF" +
-      "IED\020\000\022\014\n\010IDENTITY\020\001\022\010\n\004GZIP\020\002*\272\007\n\004Code\022\006" +
-      "\n\002OK\020\000\022\030\n\024ILLEGAL_ACCESS_POINT\020\001\022\021\n\rILLE" +
-      "GAL_TOPIC\020\002\022\032\n\026ILLEGAL_CONSUMER_GROUP\020\003\022" +
-      "\027\n\023ILLEGAL_MESSAGE_TAG\020\004\022\027\n\023ILLEGAL_MESS" +
-      "AGE_KEY\020\005\022\032\n\026MESSAGE_KEYS_TOO_LARGE\020\006\022\031\n" +
-      "\025ILLEGAL_MESSAGE_GROUP\020\007\022 \n\034ILLEGAL_MESS" +
-      "AGE_PROPERTY_KEY\020\010\022 \n\034MESSAGE_PROPERTIES" +
-      "_TOO_LARGE\020\t\022\032\n\026MESSAGE_BODY_TOO_LARGE\020\n" +
-      "\022\016\n\tFORBIDDEN\020\223\003\022\021\n\014UNAUTHORIZED\020\221\003\022\023\n\017T" +
-      "OPIC_NOT_FOUND\020\r\022\034\n\030CONSUMER_GROUP_NOT_F" +
-      "OUND\020\016\022\034\n\030VERIFY_MESSAGE_FORBIDDEN\020\017\022\035\n\031" +
-      "FAILED_TO_CONSUME_MESSAGE\020\020\022\025\n\021MESSAGE_C" +
-      "ORRUPTED\020\021\022\025\n\021TOO_MANY_REQUESTS\020\022\022\032\n\026REC" +
-      "EIPT_HANDLE_EXPIRED\020\023\0220\n,MESSAGE_PROPERT" +
-      "Y_DOES_NOT_MATCH_MESSAGE_TYPE\020\024\022\026\n\022ILLEG" +
-      "AL_MESSAGE_ID\020\025\022\032\n\026INVALID_TRANSACTION_I" +
-      "D\020\026\022\035\n\031ILLEGAL_FILTER_EXPRESSION\020\027\022\032\n\026IN" +
-      "VALID_RECEIPT_HANDLE\020\030\022\036\n\032MASTER_PERSIST" +
-      "ENCE_TIMEOUT\020\031\022\035\n\031SLAVE_PERSISTENCE_TIME" +
-      "OUT\020\032\022\024\n\020HA_NOT_AVAILABLE\020\033\022\027\n\023VERSION_U" +
-      "NSUPPORTED\020\034\022\025\n\021MESSAGE_NOT_FOUND\020\035\022\032\n\026I" +
-      "LLEGAL_MESSAGE_OFFSET\020\036\022\023\n\017ILLEGAL_MESSA" +
-      "GE\020\037\022\034\n\030UNRECOGNIZED_CLIENT_TYPE\020 \022\032\n\025IN" +
-      "TERNAL_SERVER_ERROR\020\364\003\022\024\n\017NOT_IMPLEMENTE" +
-      "D\020\365\003\022\024\n\017GATEWAY_TIMEOUT\020\370\003B;\n\022apache.roc" +
-      "ketmq.v2B\010MQDomainP\001\240\001\001\330\001\001\252\002\022Apache.Rock" +
-      "etmq.V2b\006proto3"
+      "on\030\002 \001(\t\"\273\001\n\013RetryPolicy\022\024\n\014max_attempts" +
+      "\030\001 \001(\005\022E\n\023exponential_backoff\030\002 \001(\0132&.ap" +
+      "ache.rocketmq.v2.ExponentialBackoffH\000\022C\n" +
+      "\022customized_backoff\030\003 \001(\0132%.apache.rocke" +
+      "tmq.v2.CustomizedBackoffH\000B\n\n\010strategy\"^" +
+      "\n\022ExponentialBackoff\022\027\n\017initial_backoff\030" +
+      "\001 \001(\002\022\023\n\013max_backoff\030\002 \001(\002\022\032\n\022backoff_mu" +
+      "ltiplier\030\003 \001(\002\"<\n\021CustomizedBackoff\022\'\n\004n" +
+      "ext\030\001 \003(\0132\031.google.protobuf.Duration\"4\n\010" +
+      "Resource\022\032\n\022resource_namespace\030\001 \001(\t\022\014\n\004" +
+      "name\030\002 \001(\t\"z\n\021SubscriptionEntry\022+\n\005topic" +
+      "\030\001 \001(\0132\034.apache.rocketmq.v2.Resource\0228\n\n" +
+      "expression\030\002 \001(\0132$.apache.rocketmq.v2.Fi" +
+      "lterExpression\"%\n\007Address\022\014\n\004host\030\001 \001(\t\022" +
+      "\014\n\004port\030\002 \001(\005\"n\n\tEndpoints\0221\n\006scheme\030\001 \001" +
+      "(\0162!.apache.rocketmq.v2.AddressScheme\022.\n" +
+      "\taddresses\030\002 \003(\0132\033.apache.rocketmq.v2.Ad" +
+      "dress\"T\n\006Broker\022\014\n\004name\030\001 \001(\t\022\n\n\002id\030\002 \001(" +
+      "\005\0220\n\tendpoints\030\003 \001(\0132\035.apache.rocketmq.v" +
+      "2.Endpoints\"\346\001\n\014MessageQueue\022+\n\005topic\030\001 " +
+      "\001(\0132\034.apache.rocketmq.v2.Resource\022\n\n\002id\030" +
+      "\002 \001(\005\0222\n\npermission\030\003 \001(\0162\036.apache.rocke" +
+      "tmq.v2.Permission\022*\n\006broker\030\004 \001(\0132\032.apac" +
+      "he.rocketmq.v2.Broker\022=\n\024accept_message_" +
+      "types\030\005 \003(\0162\037.apache.rocketmq.v2.Message" +
+      "Type\"H\n\006Digest\022,\n\004type\030\001 \001(\0162\036.apache.ro" +
+      "cketmq.v2.DigestType\022\020\n\010checksum\030\002 \001(\t\"\264" +
+      "\007\n\020SystemProperties\022\020\n\003tag\030\001 \001(\tH\000\210\001\001\022\014\n" +
+      "\004keys\030\002 \003(\t\022\022\n\nmessage_id\030\003 \001(\t\022/\n\013body_" +
+      "digest\030\004 \001(\0132\032.apache.rocketmq.v2.Digest" +
+      "\0223\n\rbody_encoding\030\005 \001(\0162\034.apache.rocketm" +
+      "q.v2.Encoding\0225\n\014message_type\030\006 \001(\0162\037.ap" +
+      "ache.rocketmq.v2.MessageType\0222\n\016born_tim" +
+      "estamp\030\007 \001(\0132\032.google.protobuf.Timestamp" +
+      "\022\021\n\tborn_host\030\010 \001(\t\0228\n\017store_timestamp\030\t" +
+      " \001(\0132\032.google.protobuf.TimestampH\001\210\001\001\022\022\n" +
+      "\nstore_host\030\n \001(\t\022;\n\022delivery_timestamp\030" +
+      "\013 \001(\0132\032.google.protobuf.TimestampH\002\210\001\001\022\033" +
+      "\n\016receipt_handle\030\014 \001(\tH\003\210\001\001\022\020\n\010queue_id\030" +
+      "\r \001(\005\022\031\n\014queue_offset\030\016 \001(\003H\004\210\001\001\022:\n\022invi" +
+      "sible_duration\030\017 \001(\0132\031.google.protobuf.D" +
+      "urationH\005\210\001\001\022\035\n\020delivery_attempt\030\020 \001(\005H\006" +
+      "\210\001\001\022\032\n\rmessage_group\030\021 \001(\tH\007\210\001\001\022\032\n\rtrace" +
+      "_context\030\022 \001(\tH\010\210\001\001\022N\n&orphaned_transact" +
+      "ion_recovery_duration\030\023 \001(\0132\031.google.pro" +
+      "tobuf.DurationH\t\210\001\001B\006\n\004_tagB\022\n\020_store_ti" +
+      "mestampB\025\n\023_delivery_timestampB\021\n\017_recei" +
+      "pt_handleB\017\n\r_queue_offsetB\025\n\023_invisible" +
+      "_durationB\023\n\021_delivery_attemptB\020\n\016_messa" +
+      "ge_groupB\020\n\016_trace_contextB)\n\'_orphaned_" +
+      "transaction_recovery_duration\"\206\002\n\007Messag" +
+      "e\022+\n\005topic\030\001 \001(\0132\034.apache.rocketmq.v2.Re" +
+      "source\022H\n\017user_properties\030\002 \003(\0132/.apache" +
+      ".rocketmq.v2.Message.UserPropertiesEntry" +
+      "\022?\n\021system_properties\030\003 \001(\0132$.apache.roc" +
+      "ketmq.v2.SystemProperties\022\014\n\004body\030\004 \001(\014\032" +
+      "5\n\023UserPropertiesEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005v" +
+      "alue\030\002 \001(\t:\0028\001\"E\n\nAssignment\0227\n\rmessage_" +
+      "queue\030\001 \001(\0132 .apache.rocketmq.v2.Message" +
+      "Queue\"I\n\013SendReceipt\022\022\n\nmessage_id\030\001 \001(\t" +
+      "\022\026\n\016transaction_id\030\002 \001(\t\022\016\n\006offset\030\003 \001(\003" +
+      "\"A\n\006Status\022&\n\004code\030\001 \001(\0162\030.apache.rocket" +
+      "mq.v2.Code\022\017\n\007message\030\002 \001(\t*Y\n\025Transacti" +
+      "onResolution\022&\n\"TRANSACTION_RESOLUTION_U" +
+      "NSPECIFIED\020\000\022\n\n\006COMMIT\020\001\022\014\n\010ROLLBACK\020\002*W" +
+      "\n\021TransactionSource\022\026\n\022SOURCE_UNSPECIFIE" +
+      "D\020\000\022\021\n\rSOURCE_CLIENT\020\001\022\027\n\023SOURCE_SERVER_" +
+      "CHECK\020\002*W\n\nPermission\022\032\n\026PERMISSION_UNSP" +
+      "ECIFIED\020\000\022\010\n\004NONE\020\001\022\010\n\004READ\020\002\022\t\n\005WRITE\020\003" +
+      "\022\016\n\nREAD_WRITE\020\004*;\n\nFilterType\022\033\n\027FILTER" +
+      "_TYPE_UNSPECIFIED\020\000\022\007\n\003TAG\020\001\022\007\n\003SQL\020\002*T\n" +
+      "\rAddressScheme\022\036\n\032ADDRESS_SCHEME_UNSPECI" +
+      "FIED\020\000\022\010\n\004IPv4\020\001\022\010\n\004IPv6\020\002\022\017\n\013DOMAIN_NAM" +
+      "E\020\003*]\n\013MessageType\022\034\n\030MESSAGE_TYPE_UNSPE" +
+      "CIFIED\020\000\022\n\n\006NORMAL\020\001\022\010\n\004FIFO\020\002\022\t\n\005DELAY\020" +
+      "\003\022\017\n\013TRANSACTION\020\004*G\n\nDigestType\022\033\n\027DIGE" +
+      "ST_TYPE_UNSPECIFIED\020\000\022\t\n\005CRC32\020\001\022\007\n\003MD5\020" +
+      "\002\022\010\n\004SHA1\020\003*_\n\nClientType\022\033\n\027CLIENT_TYPE" +
+      "_UNSPECIFIED\020\000\022\014\n\010PRODUCER\020\001\022\021\n\rPUSH_CON" +
+      "SUMER\020\002\022\023\n\017SIMPLE_CONSUMER\020\003*<\n\010Encoding" +
+      "\022\030\n\024ENCODING_UNSPECIFIED\020\000\022\014\n\010IDENTITY\020\001" +
+      "\022\010\n\004GZIP\020\002*\272\007\n\004Code\022\006\n\002OK\020\000\022\030\n\024ILLEGAL_A" +
+      "CCESS_POINT\020\001\022\021\n\rILLEGAL_TOPIC\020\002\022\032\n\026ILLE" +
+      "GAL_CONSUMER_GROUP\020\003\022\027\n\023ILLEGAL_MESSAGE_" +
+      "TAG\020\004\022\027\n\023ILLEGAL_MESSAGE_KEY\020\005\022\032\n\026MESSAG" +
+      "E_KEYS_TOO_LARGE\020\006\022\031\n\025ILLEGAL_MESSAGE_GR" +
+      "OUP\020\007\022 \n\034ILLEGAL_MESSAGE_PROPERTY_KEY\020\010\022" +
+      " \n\034MESSAGE_PROPERTIES_TOO_LARGE\020\t\022\032\n\026MES" +
+      "SAGE_BODY_TOO_LARGE\020\n\022\016\n\tFORBIDDEN\020\223\003\022\021\n" +
+      "\014UNAUTHORIZED\020\221\003\022\023\n\017TOPIC_NOT_FOUND\020\r\022\034\n" +
+      "\030CONSUMER_GROUP_NOT_FOUND\020\016\022\034\n\030VERIFY_ME" +
+      "SSAGE_FORBIDDEN\020\017\022\035\n\031FAILED_TO_CONSUME_M" +
+      "ESSAGE\020\020\022\025\n\021MESSAGE_CORRUPTED\020\021\022\025\n\021TOO_M" +
+      "ANY_REQUESTS\020\022\022\032\n\026RECEIPT_HANDLE_EXPIRED" +
+      "\020\023\0220\n,MESSAGE_PROPERTY_DOES_NOT_MATCH_ME" +
+      "SSAGE_TYPE\020\024\022\026\n\022ILLEGAL_MESSAGE_ID\020\025\022\032\n\026" +
+      "INVALID_TRANSACTION_ID\020\026\022\035\n\031ILLEGAL_FILT" +
+      "ER_EXPRESSION\020\027\022\032\n\026INVALID_RECEIPT_HANDL" +
+      "E\020\030\022\036\n\032MASTER_PERSISTENCE_TIMEOUT\020\031\022\035\n\031S" +
+      "LAVE_PERSISTENCE_TIMEOUT\020\032\022\024\n\020HA_NOT_AVA" +
+      "ILABLE\020\033\022\027\n\023VERSION_UNSUPPORTED\020\034\022\025\n\021MES" +
+      "SAGE_NOT_FOUND\020\035\022\032\n\026ILLEGAL_MESSAGE_OFFS" +
+      "ET\020\036\022\023\n\017ILLEGAL_MESSAGE\020\037\022\034\n\030UNRECOGNIZE" +
+      "D_CLIENT_TYPE\020 \022\032\n\025INTERNAL_SERVER_ERROR" +
+      "\020\364\003\022\024\n\017NOT_IMPLEMENTED\020\365\003\022\024\n\017GATEWAY_TIM" +
+      "EOUT\020\370\003B;\n\022apache.rocketmq.v2B\010MQDomainP" +
+      "\001\240\001\001\330\001\001\252\002\022Apache.Rocketmq.V2b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -223,57 +238,69 @@ public final class MQDomain {
     internal_static_apache_rocketmq_v2_RetryPolicy_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_RetryPolicy_descriptor,
-        new java.lang.String[] { "MaxAttempts", "InitialBackoff", "MaxBackoff", "BackoffMultiplier", "Random", });
-    internal_static_apache_rocketmq_v2_Resource_descriptor =
+        new java.lang.String[] { "MaxAttempts", "ExponentialBackoff", "CustomizedBackoff", "Strategy", });
+    internal_static_apache_rocketmq_v2_ExponentialBackoff_descriptor =
       getDescriptor().getMessageTypes().get(2);
+    internal_static_apache_rocketmq_v2_ExponentialBackoff_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_apache_rocketmq_v2_ExponentialBackoff_descriptor,
+        new java.lang.String[] { "InitialBackoff", "MaxBackoff", "BackoffMultiplier", });
+    internal_static_apache_rocketmq_v2_CustomizedBackoff_descriptor =
+      getDescriptor().getMessageTypes().get(3);
+    internal_static_apache_rocketmq_v2_CustomizedBackoff_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_apache_rocketmq_v2_CustomizedBackoff_descriptor,
+        new java.lang.String[] { "Next", });
+    internal_static_apache_rocketmq_v2_Resource_descriptor =
+      getDescriptor().getMessageTypes().get(4);
     internal_static_apache_rocketmq_v2_Resource_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_Resource_descriptor,
         new java.lang.String[] { "ResourceNamespace", "Name", });
     internal_static_apache_rocketmq_v2_SubscriptionEntry_descriptor =
-      getDescriptor().getMessageTypes().get(3);
+      getDescriptor().getMessageTypes().get(5);
     internal_static_apache_rocketmq_v2_SubscriptionEntry_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_SubscriptionEntry_descriptor,
         new java.lang.String[] { "Topic", "Expression", });
     internal_static_apache_rocketmq_v2_Address_descriptor =
-      getDescriptor().getMessageTypes().get(4);
+      getDescriptor().getMessageTypes().get(6);
     internal_static_apache_rocketmq_v2_Address_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_Address_descriptor,
         new java.lang.String[] { "Host", "Port", });
     internal_static_apache_rocketmq_v2_Endpoints_descriptor =
-      getDescriptor().getMessageTypes().get(5);
+      getDescriptor().getMessageTypes().get(7);
     internal_static_apache_rocketmq_v2_Endpoints_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_Endpoints_descriptor,
         new java.lang.String[] { "Scheme", "Addresses", });
     internal_static_apache_rocketmq_v2_Broker_descriptor =
-      getDescriptor().getMessageTypes().get(6);
+      getDescriptor().getMessageTypes().get(8);
     internal_static_apache_rocketmq_v2_Broker_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_Broker_descriptor,
         new java.lang.String[] { "Name", "Id", "Endpoints", });
     internal_static_apache_rocketmq_v2_MessageQueue_descriptor =
-      getDescriptor().getMessageTypes().get(7);
+      getDescriptor().getMessageTypes().get(9);
     internal_static_apache_rocketmq_v2_MessageQueue_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_MessageQueue_descriptor,
         new java.lang.String[] { "Topic", "Id", "Permission", "Broker", "AcceptMessageTypes", });
     internal_static_apache_rocketmq_v2_Digest_descriptor =
-      getDescriptor().getMessageTypes().get(8);
+      getDescriptor().getMessageTypes().get(10);
     internal_static_apache_rocketmq_v2_Digest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_Digest_descriptor,
         new java.lang.String[] { "Type", "Checksum", });
     internal_static_apache_rocketmq_v2_SystemProperties_descriptor =
-      getDescriptor().getMessageTypes().get(9);
+      getDescriptor().getMessageTypes().get(11);
     internal_static_apache_rocketmq_v2_SystemProperties_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_SystemProperties_descriptor,
         new java.lang.String[] { "Tag", "Keys", "MessageId", "BodyDigest", "BodyEncoding", "MessageType", "BornTimestamp", "BornHost", "StoreTimestamp", "StoreHost", "DeliveryTimestamp", "ReceiptHandle", "QueueId", "QueueOffset", "InvisibleDuration", "DeliveryAttempt", "MessageGroup", "TraceContext", "OrphanedTransactionRecoveryDuration", "Tag", "StoreTimestamp", "DeliveryTimestamp", "ReceiptHandle", "QueueOffset", "InvisibleDuration", "DeliveryAttempt", "MessageGroup", "TraceContext", " [...]
     internal_static_apache_rocketmq_v2_Message_descriptor =
-      getDescriptor().getMessageTypes().get(10);
+      getDescriptor().getMessageTypes().get(12);
     internal_static_apache_rocketmq_v2_Message_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_Message_descriptor,
@@ -285,19 +312,19 @@ public final class MQDomain {
         internal_static_apache_rocketmq_v2_Message_UserPropertiesEntry_descriptor,
         new java.lang.String[] { "Key", "Value", });
     internal_static_apache_rocketmq_v2_Assignment_descriptor =
-      getDescriptor().getMessageTypes().get(11);
+      getDescriptor().getMessageTypes().get(13);
     internal_static_apache_rocketmq_v2_Assignment_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_Assignment_descriptor,
         new java.lang.String[] { "MessageQueue", });
     internal_static_apache_rocketmq_v2_SendReceipt_descriptor =
-      getDescriptor().getMessageTypes().get(12);
+      getDescriptor().getMessageTypes().get(14);
     internal_static_apache_rocketmq_v2_SendReceipt_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_SendReceipt_descriptor,
         new java.lang.String[] { "MessageId", "TransactionId", "Offset", });
     internal_static_apache_rocketmq_v2_Status_descriptor =
-      getDescriptor().getMessageTypes().get(13);
+      getDescriptor().getMessageTypes().get(15);
     internal_static_apache_rocketmq_v2_Status_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_Status_descriptor,
diff --git a/src/main/java/apache/rocketmq/v2/MQService.java b/src/main/java/apache/rocketmq/v2/MQService.java
index 0b262b2..a03daf4 100644
--- a/src/main/java/apache/rocketmq/v2/MQService.java
+++ b/src/main/java/apache/rocketmq/v2/MQService.java
@@ -196,165 +196,164 @@ public final class MQService {
       "e.rocketmq.v2.Resource\"z\n\022QueryRouteResp" +
       "onse\022*\n\006status\030\001 \001(\0132\032.apache.rocketmq.v" +
       "2.Status\0228\n\016message_queues\030\002 \003(\0132 .apach" +
-      "e.rocketmq.v2.MessageQueue\"|\n\022SendMessag" +
+      "e.rocketmq.v2.MessageQueue\"C\n\022SendMessag" +
       "eRequest\022-\n\010messages\030\001 \003(\0132\033.apache.rock" +
-      "etmq.v2.Message\0227\n\rmessage_queue\030\002 \001(\0132 " +
-      ".apache.rocketmq.v2.MessageQueue\"t\n\023Send" +
-      "MessageResponse\022*\n\006status\030\001 \001(\0132\032.apache" +
-      ".rocketmq.v2.Status\0221\n\010receipts\030\002 \003(\0132\037." +
-      "apache.rocketmq.v2.SendReceipt\"r\n\026QueryA" +
-      "ssignmentRequest\022+\n\005topic\030\001 \001(\0132\034.apache" +
-      ".rocketmq.v2.Resource\022+\n\005group\030\002 \001(\0132\034.a" +
-      "pache.rocketmq.v2.Resource\"z\n\027QueryAssig" +
-      "nmentResponse\022*\n\006status\030\001 \001(\0132\032.apache.r" +
-      "ocketmq.v2.Status\0223\n\013assignments\030\002 \003(\0132\036" +
-      ".apache.rocketmq.v2.Assignment\"\245\002\n\025Recei" +
-      "veMessageRequest\022+\n\005group\030\001 \001(\0132\034.apache" +
-      ".rocketmq.v2.Resource\0227\n\rmessage_queue\030\002" +
-      " \001(\0132 .apache.rocketmq.v2.MessageQueue\022?" +
-      "\n\021filter_expression\030\003 \001(\0132$.apache.rocke" +
-      "tmq.v2.FilterExpression\022\022\n\nbatch_size\030\004 " +
-      "\001(\005\022:\n\022invisible_duration\030\005 \001(\0132\031.google" +
-      ".protobuf.DurationH\000\210\001\001B\025\n\023_invisible_du" +
-      "ration\"\342\001\n\026ReceiveMessageResponse\022*\n\006sta" +
-      "tus\030\001 \001(\0132\032.apache.rocketmq.v2.Status\022-\n" +
-      "\010messages\030\002 \003(\0132\033.apache.rocketmq.v2.Mes" +
-      "sage\0226\n\022delivery_timestamp\030\003 \001(\0132\032.googl" +
-      "e.protobuf.Timestamp\0225\n\022invisible_durati" +
-      "on\030\004 \001(\0132\031.google.protobuf.Duration\"=\n\017A" +
-      "ckMessageEntry\022\022\n\nmessage_id\030\001 \001(\t\022\026\n\016re" +
-      "ceipt_handle\030\002 \001(\t\"\243\001\n\021AckMessageRequest" +
-      "\022+\n\005group\030\001 \001(\0132\034.apache.rocketmq.v2.Res" +
-      "ource\022+\n\005topic\030\002 \001(\0132\034.apache.rocketmq.v" +
-      "2.Resource\0224\n\007entries\030\003 \003(\0132#.apache.roc" +
-      "ketmq.v2.AckMessageEntry\"o\n\025AckMessageRe" +
-      "sultEntry\022\022\n\nmessage_id\030\001 \001(\t\022\026\n\016receipt" +
-      "_handle\030\002 \001(\t\022*\n\006status\030\003 \001(\0132\032.apache.r" +
-      "ocketmq.v2.Status\"|\n\022AckMessageResponse\022" +
-      "*\n\006status\030\001 \001(\0132\032.apache.rocketmq.v2.Sta" +
-      "tus\022:\n\007entries\030\002 \003(\0132).apache.rocketmq.v" +
-      "2.AckMessageResultEntry\"\264\001\n\022NackMessageR" +
-      "equest\022+\n\005group\030\001 \001(\0132\034.apache.rocketmq." +
-      "v2.Resource\022+\n\005topic\030\002 \001(\0132\034.apache.rock" +
-      "etmq.v2.Resource\022\026\n\016receipt_handle\030\003 \001(\t" +
-      "\022\022\n\nmessage_id\030\004 \001(\t\022\030\n\020delivery_attempt" +
-      "\030\005 \001(\005\"A\n\023NackMessageResponse\022*\n\006status\030" +
-      "\001 \001(\0132\032.apache.rocketmq.v2.Status\"\347\001\n&Fo" +
-      "rwardMessageToDeadLetterQueueRequest\022+\n\005" +
-      "group\030\001 \001(\0132\034.apache.rocketmq.v2.Resourc" +
-      "e\022+\n\005topic\030\002 \001(\0132\034.apache.rocketmq.v2.Re" +
-      "source\022\026\n\016receipt_handle\030\003 \001(\t\022\022\n\nmessag" +
-      "e_id\030\004 \001(\t\022\030\n\020delivery_attempt\030\005 \001(\005\022\035\n\025" +
-      "max_delivery_attempts\030\006 \001(\005\"U\n\'ForwardMe" +
-      "ssageToDeadLetterQueueResponse\022*\n\006status" +
-      "\030\001 \001(\0132\032.apache.rocketmq.v2.Status\"N\n\020He" +
-      "artbeatRequest\0220\n\005group\030\001 \001(\0132\034.apache.r" +
-      "ocketmq.v2.ResourceH\000\210\001\001B\010\n\006_group\"?\n\021He" +
-      "artbeatResponse\022*\n\006status\030\001 \001(\0132\032.apache" +
-      ".rocketmq.v2.Status\"\375\001\n\025EndTransactionRe" +
-      "quest\022+\n\005topic\030\001 \001(\0132\034.apache.rocketmq.v" +
-      "2.Resource\022\022\n\nmessage_id\030\002 \001(\t\022\026\n\016transa" +
-      "ction_id\030\003 \001(\t\022=\n\nresolution\030\004 \001(\0162).apa" +
-      "che.rocketmq.v2.TransactionResolution\0225\n" +
-      "\006source\030\005 \001(\0162%.apache.rocketmq.v2.Trans" +
-      "actionSource\022\025\n\rtrace_context\030\006 \001(\t\"D\n\026E" +
-      "ndTransactionResponse\022*\n\006status\030\001 \001(\0132\032." +
-      "apache.rocketmq.v2.Status\"-\n\034PrintThread" +
-      "StackTraceCommand\022\r\n\005nonce\030\001 \001(\t\"\205\001\n\020Thr" +
-      "eadStackTrace\022\r\n\005nonce\030\001 \001(\t\022*\n\006status\030\002" +
-      " \001(\0132\032.apache.rocketmq.v2.Status\022\037\n\022thre" +
-      "ad_stack_trace\030\003 \001(\tH\000\210\001\001B\025\n\023_thread_sta" +
-      "ck_trace\"S\n\024VerifyMessageCommand\022\r\n\005nonc" +
-      "e\030\001 \001(\t\022,\n\007message\030\002 \001(\0132\033.apache.rocket" +
-      "mq.v2.Message\"P\n\023VerifyMessageResult\022\r\n\005" +
-      "nonce\030\001 \001(\t\022*\n\006status\030\002 \001(\0132\032.apache.roc" +
-      "ketmq.v2.Status\"\200\001\n!RecoverOrphanedTrans" +
-      "actionCommand\022C\n\036orphaned_transactional_" +
-      "message\030\001 \001(\0132\033.apache.rocketmq.v2.Messa" +
-      "ge\022\026\n\016transaction_id\030\002 \001(\t\"\251\001\n\nPublishin" +
-      "g\022,\n\006topics\030\001 \003(\0132\034.apache.rocketmq.v2.R" +
-      "esource\0225\n\014retry_policy\030\002 \001(\0132\037.apache.r" +
-      "ocketmq.v2.RetryPolicy\022\037\n\027compress_body_" +
-      "threshold\030\003 \001(\005\022\025\n\rmax_body_size\030\004 \001(\005\"\354" +
-      "\002\n\014Subscription\0220\n\005group\030\001 \001(\0132\034.apache." +
-      "rocketmq.v2.ResourceH\000\210\001\001\022<\n\rsubscriptio" +
-      "ns\030\002 \003(\0132%.apache.rocketmq.v2.Subscripti" +
-      "onEntry\022\021\n\004fifo\030\003 \001(\010H\001\210\001\001\0227\n\016backoff_po" +
-      "licy\030\004 \001(\0132\037.apache.rocketmq.v2.RetryPol" +
-      "icy\022\037\n\022receive_batch_size\030\005 \001(\005H\002\210\001\001\022<\n\024" +
-      "long_polling_timeout\030\006 \001(\0132\031.google.prot" +
-      "obuf.DurationH\003\210\001\001B\010\n\006_groupB\007\n\005_fifoB\025\n" +
-      "\023_receive_batch_sizeB\027\n\025_long_polling_ti" +
-      "meout\"\347\002\n\010Settings\0228\n\013client_type\030\001 \001(\0162" +
-      "\036.apache.rocketmq.v2.ClientTypeH\001\210\001\001\0228\n\014" +
-      "access_point\030\002 \001(\0132\035.apache.rocketmq.v2." +
-      "EndpointsH\002\210\001\001\0227\n\017request_timeout\030\003 \001(\0132" +
-      "\031.google.protobuf.DurationH\003\210\001\001\0224\n\npubli" +
-      "shing\030\004 \001(\0132\036.apache.rocketmq.v2.Publish" +
-      "ingH\000\0228\n\014subscription\030\005 \001(\0132 .apache.roc" +
-      "ketmq.v2.SubscriptionH\000B\t\n\007pub_subB\016\n\014_c" +
-      "lient_typeB\017\n\r_access_pointB\022\n\020_request_" +
-      "timeout\"\356\003\n\020TelemetryCommand\0220\n\010settings" +
-      "\030\001 \001(\0132\034.apache.rocketmq.v2.SettingsH\000\022B" +
-      "\n\022thread_stack_trace\030\002 \001(\0132$.apache.rock" +
-      "etmq.v2.ThreadStackTraceH\000\022H\n\025verify_mes" +
-      "sage_result\030\003 \001(\0132\'.apache.rocketmq.v2.V" +
-      "erifyMessageResultH\000\022e\n$recover_orphaned" +
-      "_transaction_command\030\004 \001(\01325.apache.rock" +
-      "etmq.v2.RecoverOrphanedTransactionComman" +
-      "dH\000\022\\\n print_thread_stack_trace_command\030" +
-      "\005 \001(\01320.apache.rocketmq.v2.PrintThreadSt" +
-      "ackTraceCommandH\000\022J\n\026verify_message_comm" +
-      "and\030\006 \001(\0132(.apache.rocketmq.v2.VerifyMes" +
-      "sageCommandH\000B\t\n\007command\"\\\n\036NotifyClient" +
-      "TerminationRequest\0220\n\005group\030\001 \001(\0132\034.apac" +
-      "he.rocketmq.v2.ResourceH\000\210\001\001B\010\n\006_group\"M" +
-      "\n\037NotifyClientTerminationResponse\022*\n\006sta" +
-      "tus\030\001 \001(\0132\032.apache.rocketmq.v2.Status\"\311\001" +
-      "\n\036ChangeInvisibleDurationRequest\022+\n\005grou" +
-      "p\030\001 \001(\0132\034.apache.rocketmq.v2.Resource\022+\n" +
-      "\005topic\030\002 \001(\0132\034.apache.rocketmq.v2.Resour" +
-      "ce\022\026\n\016receipt_handle\030\003 \001(\t\0225\n\022invisible_" +
-      "duration\030\004 \001(\0132\031.google.protobuf.Duratio" +
-      "n\"e\n\037ChangeInvisibleDurationResponse\022*\n\006" +
+      "etmq.v2.Message\"t\n\023SendMessageResponse\022*" +
+      "\n\006status\030\001 \001(\0132\032.apache.rocketmq.v2.Stat" +
+      "us\0221\n\010receipts\030\002 \003(\0132\037.apache.rocketmq.v" +
+      "2.SendReceipt\"r\n\026QueryAssignmentRequest\022" +
+      "+\n\005topic\030\001 \001(\0132\034.apache.rocketmq.v2.Reso" +
+      "urce\022+\n\005group\030\002 \001(\0132\034.apache.rocketmq.v2" +
+      ".Resource\"z\n\027QueryAssignmentResponse\022*\n\006" +
       "status\030\001 \001(\0132\032.apache.rocketmq.v2.Status" +
-      "\022\026\n\016receipt_handle\030\002 \001(\t2\302\n\n\020MessagingSe" +
-      "rvice\022]\n\nQueryRoute\022%.apache.rocketmq.v2" +
-      ".QueryRouteRequest\032&.apache.rocketmq.v2." +
-      "QueryRouteResponse\"\000\022Z\n\tHeartbeat\022$.apac" +
-      "he.rocketmq.v2.HeartbeatRequest\032%.apache" +
-      ".rocketmq.v2.HeartbeatResponse\"\000\022`\n\013Send" +
-      "Message\022&.apache.rocketmq.v2.SendMessage" +
-      "Request\032\'.apache.rocketmq.v2.SendMessage" +
-      "Response\"\000\022l\n\017QueryAssignment\022*.apache.r" +
-      "ocketmq.v2.QueryAssignmentRequest\032+.apac" +
-      "he.rocketmq.v2.QueryAssignmentResponse\"\000" +
-      "\022k\n\016ReceiveMessage\022).apache.rocketmq.v2." +
-      "ReceiveMessageRequest\032*.apache.rocketmq." +
-      "v2.ReceiveMessageResponse\"\0000\001\022]\n\nAckMess" +
-      "age\022%.apache.rocketmq.v2.AckMessageReque" +
-      "st\032&.apache.rocketmq.v2.AckMessageRespon" +
-      "se\"\000\022`\n\013NackMessage\022&.apache.rocketmq.v2" +
-      ".NackMessageRequest\032\'.apache.rocketmq.v2" +
-      ".NackMessageResponse\"\000\022\234\001\n\037ForwardMessag" +
-      "eToDeadLetterQueue\022:.apache.rocketmq.v2." +
-      "ForwardMessageToDeadLetterQueueRequest\032;" +
-      ".apache.rocketmq.v2.ForwardMessageToDead" +
-      "LetterQueueResponse\"\000\022i\n\016EndTransaction\022" +
-      ").apache.rocketmq.v2.EndTransactionReque" +
-      "st\032*.apache.rocketmq.v2.EndTransactionRe" +
-      "sponse\"\000\022]\n\tTelemetry\022$.apache.rocketmq." +
-      "v2.TelemetryCommand\032$.apache.rocketmq.v2" +
-      ".TelemetryCommand\"\000(\0010\001\022\204\001\n\027NotifyClient" +
-      "Termination\0222.apache.rocketmq.v2.NotifyC" +
-      "lientTerminationRequest\0323.apache.rocketm" +
-      "q.v2.NotifyClientTerminationResponse\"\000\022\204" +
-      "\001\n\027ChangeInvisibleDuration\0222.apache.rock" +
-      "etmq.v2.ChangeInvisibleDurationRequest\0323" +
-      ".apache.rocketmq.v2.ChangeInvisibleDurat" +
-      "ionResponse\"\000B<\n\022apache.rocketmq.v2B\tMQS" +
-      "erviceP\001\240\001\001\330\001\001\252\002\022Apache.Rocketmq.V2b\006pro" +
-      "to3"
+      "\0223\n\013assignments\030\002 \003(\0132\036.apache.rocketmq." +
+      "v2.Assignment\"\245\002\n\025ReceiveMessageRequest\022" +
+      "+\n\005group\030\001 \001(\0132\034.apache.rocketmq.v2.Reso" +
+      "urce\0227\n\rmessage_queue\030\002 \001(\0132 .apache.roc" +
+      "ketmq.v2.MessageQueue\022?\n\021filter_expressi" +
+      "on\030\003 \001(\0132$.apache.rocketmq.v2.FilterExpr" +
+      "ession\022\022\n\nbatch_size\030\004 \001(\005\022:\n\022invisible_" +
+      "duration\030\005 \001(\0132\031.google.protobuf.Duratio" +
+      "nH\000\210\001\001B\025\n\023_invisible_duration\"\341\001\n\026Receiv" +
+      "eMessageResponse\022*\n\006status\030\001 \001(\0132\032.apach" +
+      "e.rocketmq.v2.Status\022,\n\007message\030\002 \001(\0132\033." +
+      "apache.rocketmq.v2.Message\0226\n\022delivery_t" +
+      "imestamp\030\003 \001(\0132\032.google.protobuf.Timesta" +
+      "mp\0225\n\022invisible_duration\030\004 \001(\0132\031.google." +
+      "protobuf.Duration\"=\n\017AckMessageEntry\022\022\n\n" +
+      "message_id\030\001 \001(\t\022\026\n\016receipt_handle\030\002 \001(\t" +
+      "\"\243\001\n\021AckMessageRequest\022+\n\005group\030\001 \001(\0132\034." +
+      "apache.rocketmq.v2.Resource\022+\n\005topic\030\002 \001" +
+      "(\0132\034.apache.rocketmq.v2.Resource\0224\n\007entr" +
+      "ies\030\003 \003(\0132#.apache.rocketmq.v2.AckMessag" +
+      "eEntry\"o\n\025AckMessageResultEntry\022\022\n\nmessa" +
+      "ge_id\030\001 \001(\t\022\026\n\016receipt_handle\030\002 \001(\t\022*\n\006s" +
+      "tatus\030\003 \001(\0132\032.apache.rocketmq.v2.Status\"" +
+      "|\n\022AckMessageResponse\022*\n\006status\030\001 \001(\0132\032." +
+      "apache.rocketmq.v2.Status\022:\n\007entries\030\002 \003" +
+      "(\0132).apache.rocketmq.v2.AckMessageResult" +
+      "Entry\"\264\001\n\022NackMessageRequest\022+\n\005group\030\001 " +
+      "\001(\0132\034.apache.rocketmq.v2.Resource\022+\n\005top" +
+      "ic\030\002 \001(\0132\034.apache.rocketmq.v2.Resource\022\026" +
+      "\n\016receipt_handle\030\003 \001(\t\022\022\n\nmessage_id\030\004 \001" +
+      "(\t\022\030\n\020delivery_attempt\030\005 \001(\005\"A\n\023NackMess" +
+      "ageResponse\022*\n\006status\030\001 \001(\0132\032.apache.roc" +
+      "ketmq.v2.Status\"\347\001\n&ForwardMessageToDead" +
+      "LetterQueueRequest\022+\n\005group\030\001 \001(\0132\034.apac" +
+      "he.rocketmq.v2.Resource\022+\n\005topic\030\002 \001(\0132\034" +
+      ".apache.rocketmq.v2.Resource\022\026\n\016receipt_" +
+      "handle\030\003 \001(\t\022\022\n\nmessage_id\030\004 \001(\t\022\030\n\020deli" +
+      "very_attempt\030\005 \001(\005\022\035\n\025max_delivery_attem" +
+      "pts\030\006 \001(\005\"U\n\'ForwardMessageToDeadLetterQ" +
+      "ueueResponse\022*\n\006status\030\001 \001(\0132\032.apache.ro" +
+      "cketmq.v2.Status\"N\n\020HeartbeatRequest\0220\n\005" +
+      "group\030\001 \001(\0132\034.apache.rocketmq.v2.Resourc" +
+      "eH\000\210\001\001B\010\n\006_group\"?\n\021HeartbeatResponse\022*\n" +
+      "\006status\030\001 \001(\0132\032.apache.rocketmq.v2.Statu" +
+      "s\"\375\001\n\025EndTransactionRequest\022+\n\005topic\030\001 \001" +
+      "(\0132\034.apache.rocketmq.v2.Resource\022\022\n\nmess" +
+      "age_id\030\002 \001(\t\022\026\n\016transaction_id\030\003 \001(\t\022=\n\n" +
+      "resolution\030\004 \001(\0162).apache.rocketmq.v2.Tr" +
+      "ansactionResolution\0225\n\006source\030\005 \001(\0162%.ap" +
+      "ache.rocketmq.v2.TransactionSource\022\025\n\rtr" +
+      "ace_context\030\006 \001(\t\"D\n\026EndTransactionRespo" +
+      "nse\022*\n\006status\030\001 \001(\0132\032.apache.rocketmq.v2" +
+      ".Status\"-\n\034PrintThreadStackTraceCommand\022" +
+      "\r\n\005nonce\030\001 \001(\t\"\205\001\n\020ThreadStackTrace\022\r\n\005n" +
+      "once\030\001 \001(\t\022*\n\006status\030\002 \001(\0132\032.apache.rock" +
+      "etmq.v2.Status\022\037\n\022thread_stack_trace\030\003 \001" +
+      "(\tH\000\210\001\001B\025\n\023_thread_stack_trace\"S\n\024Verify" +
+      "MessageCommand\022\r\n\005nonce\030\001 \001(\t\022,\n\007message" +
+      "\030\002 \001(\0132\033.apache.rocketmq.v2.Message\"P\n\023V" +
+      "erifyMessageResult\022\r\n\005nonce\030\001 \001(\t\022*\n\006sta" +
+      "tus\030\002 \001(\0132\032.apache.rocketmq.v2.Status\"\200\001" +
+      "\n!RecoverOrphanedTransactionCommand\022C\n\036o" +
+      "rphaned_transactional_message\030\001 \001(\0132\033.ap" +
+      "ache.rocketmq.v2.Message\022\026\n\016transaction_" +
+      "id\030\002 \001(\t\"\251\001\n\nPublishing\022,\n\006topics\030\001 \003(\0132" +
+      "\034.apache.rocketmq.v2.Resource\0225\n\014retry_p" +
+      "olicy\030\002 \001(\0132\037.apache.rocketmq.v2.RetryPo" +
+      "licy\022\037\n\027compress_body_threshold\030\003 \001(\005\022\025\n" +
+      "\rmax_body_size\030\004 \001(\005\"\204\003\n\014Subscription\0220\n" +
+      "\005group\030\001 \001(\0132\034.apache.rocketmq.v2.Resour" +
+      "ceH\000\210\001\001\022<\n\rsubscriptions\030\002 \003(\0132%.apache." +
+      "rocketmq.v2.SubscriptionEntry\022\021\n\004fifo\030\003 " +
+      "\001(\010H\001\210\001\001\022<\n\016backoff_policy\030\004 \001(\0132\037.apach" +
+      "e.rocketmq.v2.RetryPolicyH\002\210\001\001\022\037\n\022receiv" +
+      "e_batch_size\030\005 \001(\005H\003\210\001\001\022<\n\024long_polling_" +
+      "timeout\030\006 \001(\0132\031.google.protobuf.Duration" +
+      "H\004\210\001\001B\010\n\006_groupB\007\n\005_fifoB\021\n\017_backoff_pol" +
+      "icyB\025\n\023_receive_batch_sizeB\027\n\025_long_poll" +
+      "ing_timeout\"\347\002\n\010Settings\0228\n\013client_type\030" +
+      "\001 \001(\0162\036.apache.rocketmq.v2.ClientTypeH\001\210" +
+      "\001\001\0228\n\014access_point\030\002 \001(\0132\035.apache.rocket" +
+      "mq.v2.EndpointsH\002\210\001\001\0227\n\017request_timeout\030" +
+      "\003 \001(\0132\031.google.protobuf.DurationH\003\210\001\001\0224\n" +
+      "\npublishing\030\004 \001(\0132\036.apache.rocketmq.v2.P" +
+      "ublishingH\000\0228\n\014subscription\030\005 \001(\0132 .apac" +
+      "he.rocketmq.v2.SubscriptionH\000B\t\n\007pub_sub" +
+      "B\016\n\014_client_typeB\017\n\r_access_pointB\022\n\020_re" +
+      "quest_timeout\"\356\003\n\020TelemetryCommand\0220\n\010se" +
+      "ttings\030\001 \001(\0132\034.apache.rocketmq.v2.Settin" +
+      "gsH\000\022B\n\022thread_stack_trace\030\002 \001(\0132$.apach" +
+      "e.rocketmq.v2.ThreadStackTraceH\000\022H\n\025veri" +
+      "fy_message_result\030\003 \001(\0132\'.apache.rocketm" +
+      "q.v2.VerifyMessageResultH\000\022e\n$recover_or" +
+      "phaned_transaction_command\030\004 \001(\01325.apach" +
+      "e.rocketmq.v2.RecoverOrphanedTransaction" +
+      "CommandH\000\022\\\n print_thread_stack_trace_co" +
+      "mmand\030\005 \001(\01320.apache.rocketmq.v2.PrintTh" +
+      "readStackTraceCommandH\000\022J\n\026verify_messag" +
+      "e_command\030\006 \001(\0132(.apache.rocketmq.v2.Ver" +
+      "ifyMessageCommandH\000B\t\n\007command\"\\\n\036Notify" +
+      "ClientTerminationRequest\0220\n\005group\030\001 \001(\0132" +
+      "\034.apache.rocketmq.v2.ResourceH\000\210\001\001B\010\n\006_g" +
+      "roup\"M\n\037NotifyClientTerminationResponse\022" +
+      "*\n\006status\030\001 \001(\0132\032.apache.rocketmq.v2.Sta" +
+      "tus\"\311\001\n\036ChangeInvisibleDurationRequest\022+" +
+      "\n\005group\030\001 \001(\0132\034.apache.rocketmq.v2.Resou" +
+      "rce\022+\n\005topic\030\002 \001(\0132\034.apache.rocketmq.v2." +
+      "Resource\022\026\n\016receipt_handle\030\003 \001(\t\0225\n\022invi" +
+      "sible_duration\030\004 \001(\0132\031.google.protobuf.D" +
+      "uration\"e\n\037ChangeInvisibleDurationRespon" +
+      "se\022*\n\006status\030\001 \001(\0132\032.apache.rocketmq.v2." +
+      "Status\022\026\n\016receipt_handle\030\002 \001(\t2\302\n\n\020Messa" +
+      "gingService\022]\n\nQueryRoute\022%.apache.rocke" +
+      "tmq.v2.QueryRouteRequest\032&.apache.rocket" +
+      "mq.v2.QueryRouteResponse\"\000\022Z\n\tHeartbeat\022" +
+      "$.apache.rocketmq.v2.HeartbeatRequest\032%." +
+      "apache.rocketmq.v2.HeartbeatResponse\"\000\022`" +
+      "\n\013SendMessage\022&.apache.rocketmq.v2.SendM" +
+      "essageRequest\032\'.apache.rocketmq.v2.SendM" +
+      "essageResponse\"\000\022l\n\017QueryAssignment\022*.ap" +
+      "ache.rocketmq.v2.QueryAssignmentRequest\032" +
+      "+.apache.rocketmq.v2.QueryAssignmentResp" +
+      "onse\"\000\022k\n\016ReceiveMessage\022).apache.rocket" +
+      "mq.v2.ReceiveMessageRequest\032*.apache.roc" +
+      "ketmq.v2.ReceiveMessageResponse\"\0000\001\022]\n\nA" +
+      "ckMessage\022%.apache.rocketmq.v2.AckMessag" +
+      "eRequest\032&.apache.rocketmq.v2.AckMessage" +
+      "Response\"\000\022`\n\013NackMessage\022&.apache.rocke" +
+      "tmq.v2.NackMessageRequest\032\'.apache.rocke" +
+      "tmq.v2.NackMessageResponse\"\000\022\234\001\n\037Forward" +
+      "MessageToDeadLetterQueue\022:.apache.rocket" +
+      "mq.v2.ForwardMessageToDeadLetterQueueReq" +
+      "uest\032;.apache.rocketmq.v2.ForwardMessage" +
+      "ToDeadLetterQueueResponse\"\000\022i\n\016EndTransa" +
+      "ction\022).apache.rocketmq.v2.EndTransactio" +
+      "nRequest\032*.apache.rocketmq.v2.EndTransac" +
+      "tionResponse\"\000\022]\n\tTelemetry\022$.apache.roc" +
+      "ketmq.v2.TelemetryCommand\032$.apache.rocke" +
+      "tmq.v2.TelemetryCommand\"\000(\0010\001\022\204\001\n\027Notify" +
+      "ClientTermination\0222.apache.rocketmq.v2.N" +
+      "otifyClientTerminationRequest\0323.apache.r" +
+      "ocketmq.v2.NotifyClientTerminationRespon" +
+      "se\"\000\022\204\001\n\027ChangeInvisibleDuration\0222.apach" +
+      "e.rocketmq.v2.ChangeInvisibleDurationReq" +
+      "uest\0323.apache.rocketmq.v2.ChangeInvisibl" +
+      "eDurationResponse\"\000B<\n\022apache.rocketmq.v" +
+      "2B\tMQServiceP\001\240\001\001\330\001\001\252\002\022Apache.Rocketmq.V" +
+      "2b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -380,7 +379,7 @@ public final class MQService {
     internal_static_apache_rocketmq_v2_SendMessageRequest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_SendMessageRequest_descriptor,
-        new java.lang.String[] { "Messages", "MessageQueue", });
+        new java.lang.String[] { "Messages", });
     internal_static_apache_rocketmq_v2_SendMessageResponse_descriptor =
       getDescriptor().getMessageTypes().get(3);
     internal_static_apache_rocketmq_v2_SendMessageResponse_fieldAccessorTable = new
@@ -410,7 +409,7 @@ public final class MQService {
     internal_static_apache_rocketmq_v2_ReceiveMessageResponse_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_ReceiveMessageResponse_descriptor,
-        new java.lang.String[] { "Status", "Messages", "DeliveryTimestamp", "InvisibleDuration", });
+        new java.lang.String[] { "Status", "Message", "DeliveryTimestamp", "InvisibleDuration", });
     internal_static_apache_rocketmq_v2_AckMessageEntry_descriptor =
       getDescriptor().getMessageTypes().get(8);
     internal_static_apache_rocketmq_v2_AckMessageEntry_fieldAccessorTable = new
@@ -524,7 +523,7 @@ public final class MQService {
     internal_static_apache_rocketmq_v2_Subscription_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_apache_rocketmq_v2_Subscription_descriptor,
-        new java.lang.String[] { "Group", "Subscriptions", "Fifo", "BackoffPolicy", "ReceiveBatchSize", "LongPollingTimeout", "Group", "Fifo", "ReceiveBatchSize", "LongPollingTimeout", });
+        new java.lang.String[] { "Group", "Subscriptions", "Fifo", "BackoffPolicy", "ReceiveBatchSize", "LongPollingTimeout", "Group", "Fifo", "BackoffPolicy", "ReceiveBatchSize", "LongPollingTimeout", });
     internal_static_apache_rocketmq_v2_Settings_descriptor =
       getDescriptor().getMessageTypes().get(27);
     internal_static_apache_rocketmq_v2_Settings_fieldAccessorTable = new
diff --git a/src/main/java/apache/rocketmq/v2/MessagingServiceGrpc.java b/src/main/java/apache/rocketmq/v2/MessagingServiceGrpc.java
index 5d4e2fc..1a6048b 100644
--- a/src/main/java/apache/rocketmq/v2/MessagingServiceGrpc.java
+++ b/src/main/java/apache/rocketmq/v2/MessagingServiceGrpc.java
@@ -531,6 +531,9 @@ public final class MessagingServiceGrpc {
      * or consumer group doesn't exist, returns `NOT_FOUND`. If there is no new
      * message in the specific topic, returns `OK` with an empty message set.
      * Please note that client may suffer from false empty responses.
+     * If failed to receive message from remote, server must return only one
+     * `ReceiveMessageResponse` as the reply to the request, whose `Status` indicates
+     * the specific reason of failure, otherwise, the reply is considered successful.
      * </pre>
      */
     public void receiveMessage(apache.rocketmq.v2.ReceiveMessageRequest request,
@@ -820,6 +823,9 @@ public final class MessagingServiceGrpc {
      * or consumer group doesn't exist, returns `NOT_FOUND`. If there is no new
      * message in the specific topic, returns `OK` with an empty message set.
      * Please note that client may suffer from false empty responses.
+     * If failed to receive message from remote, server must return only one
+     * `ReceiveMessageResponse` as the reply to the request, whose `Status` indicates
+     * the specific reason of failure, otherwise, the reply is considered successful.
      * </pre>
      */
     public void receiveMessage(apache.rocketmq.v2.ReceiveMessageRequest request,
@@ -1024,6 +1030,9 @@ public final class MessagingServiceGrpc {
      * or consumer group doesn't exist, returns `NOT_FOUND`. If there is no new
      * message in the specific topic, returns `OK` with an empty message set.
      * Please note that client may suffer from false empty responses.
+     * If failed to receive message from remote, server must return only one
+     * `ReceiveMessageResponse` as the reply to the request, whose `Status` indicates
+     * the specific reason of failure, otherwise, the reply is considered successful.
      * </pre>
      */
     public java.util.Iterator<apache.rocketmq.v2.ReceiveMessageResponse> receiveMessage(
diff --git a/src/main/java/apache/rocketmq/v2/ReceiveMessageResponse.java b/src/main/java/apache/rocketmq/v2/ReceiveMessageResponse.java
index 2c2a19d..43f553a 100644
--- a/src/main/java/apache/rocketmq/v2/ReceiveMessageResponse.java
+++ b/src/main/java/apache/rocketmq/v2/ReceiveMessageResponse.java
@@ -16,7 +16,6 @@ private static final long serialVersionUID = 0L;
     super(builder);
   }
   private ReceiveMessageResponse() {
-    messages_ = java.util.Collections.emptyList();
   }
 
   @java.lang.Override
@@ -39,7 +38,6 @@ private static final long serialVersionUID = 0L;
     if (extensionRegistry == null) {
       throw new java.lang.NullPointerException();
     }
-    int mutable_bitField0_ = 0;
     com.google.protobuf.UnknownFieldSet.Builder unknownFields =
         com.google.protobuf.UnknownFieldSet.newBuilder();
     try {
@@ -64,12 +62,16 @@ private static final long serialVersionUID = 0L;
             break;
           }
           case 18: {
-            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-              messages_ = new java.util.ArrayList<apache.rocketmq.v2.Message>();
-              mutable_bitField0_ |= 0x00000001;
+            apache.rocketmq.v2.Message.Builder subBuilder = null;
+            if (message_ != null) {
+              subBuilder = message_.toBuilder();
             }
-            messages_.add(
-                input.readMessage(apache.rocketmq.v2.Message.parser(), extensionRegistry));
+            message_ = input.readMessage(apache.rocketmq.v2.Message.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(message_);
+              message_ = subBuilder.buildPartial();
+            }
+
             break;
           }
           case 26: {
@@ -113,9 +115,6 @@ private static final long serialVersionUID = 0L;
       throw new com.google.protobuf.InvalidProtocolBufferException(
           e).setUnfinishedMessage(this);
     } finally {
-      if (((mutable_bitField0_ & 0x00000001) != 0)) {
-        messages_ = java.util.Collections.unmodifiableList(messages_);
-      }
       this.unknownFields = unknownFields.build();
       makeExtensionsImmutable();
     }
@@ -159,44 +158,30 @@ private static final long serialVersionUID = 0L;
     return getStatus();
   }
 
-  public static final int MESSAGES_FIELD_NUMBER = 2;
-  private java.util.List<apache.rocketmq.v2.Message> messages_;
-  /**
-   * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
-   */
-  @java.lang.Override
-  public java.util.List<apache.rocketmq.v2.Message> getMessagesList() {
-    return messages_;
-  }
-  /**
-   * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
-   */
-  @java.lang.Override
-  public java.util.List<? extends apache.rocketmq.v2.MessageOrBuilder> 
-      getMessagesOrBuilderList() {
-    return messages_;
-  }
+  public static final int MESSAGE_FIELD_NUMBER = 2;
+  private apache.rocketmq.v2.Message message_;
   /**
-   * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+   * <code>.apache.rocketmq.v2.Message message = 2;</code>
+   * @return Whether the message field is set.
    */
   @java.lang.Override
-  public int getMessagesCount() {
-    return messages_.size();
+  public boolean hasMessage() {
+    return message_ != null;
   }
   /**
-   * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+   * <code>.apache.rocketmq.v2.Message message = 2;</code>
+   * @return The message.
    */
   @java.lang.Override
-  public apache.rocketmq.v2.Message getMessages(int index) {
-    return messages_.get(index);
+  public apache.rocketmq.v2.Message getMessage() {
+    return message_ == null ? apache.rocketmq.v2.Message.getDefaultInstance() : message_;
   }
   /**
-   * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+   * <code>.apache.rocketmq.v2.Message message = 2;</code>
    */
   @java.lang.Override
-  public apache.rocketmq.v2.MessageOrBuilder getMessagesOrBuilder(
-      int index) {
-    return messages_.get(index);
+  public apache.rocketmq.v2.MessageOrBuilder getMessageOrBuilder() {
+    return getMessage();
   }
 
   public static final int DELIVERY_TIMESTAMP_FIELD_NUMBER = 3;
@@ -268,8 +253,8 @@ private static final long serialVersionUID = 0L;
     if (status_ != null) {
       output.writeMessage(1, getStatus());
     }
-    for (int i = 0; i < messages_.size(); i++) {
-      output.writeMessage(2, messages_.get(i));
+    if (message_ != null) {
+      output.writeMessage(2, getMessage());
     }
     if (deliveryTimestamp_ != null) {
       output.writeMessage(3, getDeliveryTimestamp());
@@ -290,9 +275,9 @@ private static final long serialVersionUID = 0L;
       size += com.google.protobuf.CodedOutputStream
         .computeMessageSize(1, getStatus());
     }
-    for (int i = 0; i < messages_.size(); i++) {
+    if (message_ != null) {
       size += com.google.protobuf.CodedOutputStream
-        .computeMessageSize(2, messages_.get(i));
+        .computeMessageSize(2, getMessage());
     }
     if (deliveryTimestamp_ != null) {
       size += com.google.protobuf.CodedOutputStream
@@ -322,8 +307,11 @@ private static final long serialVersionUID = 0L;
       if (!getStatus()
           .equals(other.getStatus())) return false;
     }
-    if (!getMessagesList()
-        .equals(other.getMessagesList())) return false;
+    if (hasMessage() != other.hasMessage()) return false;
+    if (hasMessage()) {
+      if (!getMessage()
+          .equals(other.getMessage())) return false;
+    }
     if (hasDeliveryTimestamp() != other.hasDeliveryTimestamp()) return false;
     if (hasDeliveryTimestamp()) {
       if (!getDeliveryTimestamp()
@@ -349,9 +337,9 @@ private static final long serialVersionUID = 0L;
       hash = (37 * hash) + STATUS_FIELD_NUMBER;
       hash = (53 * hash) + getStatus().hashCode();
     }
-    if (getMessagesCount() > 0) {
-      hash = (37 * hash) + MESSAGES_FIELD_NUMBER;
-      hash = (53 * hash) + getMessagesList().hashCode();
+    if (hasMessage()) {
+      hash = (37 * hash) + MESSAGE_FIELD_NUMBER;
+      hash = (53 * hash) + getMessage().hashCode();
     }
     if (hasDeliveryTimestamp()) {
       hash = (37 * hash) + DELIVERY_TIMESTAMP_FIELD_NUMBER;
@@ -489,7 +477,6 @@ private static final long serialVersionUID = 0L;
     private void maybeForceBuilderInitialization() {
       if (com.google.protobuf.GeneratedMessageV3
               .alwaysUseFieldBuilders) {
-        getMessagesFieldBuilder();
       }
     }
     @java.lang.Override
@@ -501,11 +488,11 @@ private static final long serialVersionUID = 0L;
         status_ = null;
         statusBuilder_ = null;
       }
-      if (messagesBuilder_ == null) {
-        messages_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000001);
+      if (messageBuilder_ == null) {
+        message_ = null;
       } else {
-        messagesBuilder_.clear();
+        message_ = null;
+        messageBuilder_ = null;
       }
       if (deliveryTimestampBuilder_ == null) {
         deliveryTimestamp_ = null;
@@ -545,20 +532,15 @@ private static final long serialVersionUID = 0L;
     @java.lang.Override
     public apache.rocketmq.v2.ReceiveMessageResponse buildPartial() {
       apache.rocketmq.v2.ReceiveMessageResponse result = new apache.rocketmq.v2.ReceiveMessageResponse(this);
-      int from_bitField0_ = bitField0_;
       if (statusBuilder_ == null) {
         result.status_ = status_;
       } else {
         result.status_ = statusBuilder_.build();
       }
-      if (messagesBuilder_ == null) {
-        if (((bitField0_ & 0x00000001) != 0)) {
-          messages_ = java.util.Collections.unmodifiableList(messages_);
-          bitField0_ = (bitField0_ & ~0x00000001);
-        }
-        result.messages_ = messages_;
+      if (messageBuilder_ == null) {
+        result.message_ = message_;
       } else {
-        result.messages_ = messagesBuilder_.build();
+        result.message_ = messageBuilder_.build();
       }
       if (deliveryTimestampBuilder_ == null) {
         result.deliveryTimestamp_ = deliveryTimestamp_;
@@ -621,31 +603,8 @@ private static final long serialVersionUID = 0L;
       if (other.hasStatus()) {
         mergeStatus(other.getStatus());
       }
-      if (messagesBuilder_ == null) {
-        if (!other.messages_.isEmpty()) {
-          if (messages_.isEmpty()) {
-            messages_ = other.messages_;
-            bitField0_ = (bitField0_ & ~0x00000001);
-          } else {
-            ensureMessagesIsMutable();
-            messages_.addAll(other.messages_);
-          }
-          onChanged();
-        }
-      } else {
-        if (!other.messages_.isEmpty()) {
-          if (messagesBuilder_.isEmpty()) {
-            messagesBuilder_.dispose();
-            messagesBuilder_ = null;
-            messages_ = other.messages_;
-            bitField0_ = (bitField0_ & ~0x00000001);
-            messagesBuilder_ = 
-              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                 getMessagesFieldBuilder() : null;
-          } else {
-            messagesBuilder_.addAllMessages(other.messages_);
-          }
-        }
+      if (other.hasMessage()) {
+        mergeMessage(other.getMessage());
       }
       if (other.hasDeliveryTimestamp()) {
         mergeDeliveryTimestamp(other.getDeliveryTimestamp());
@@ -681,7 +640,6 @@ private static final long serialVersionUID = 0L;
       }
       return this;
     }
-    private int bitField0_;
 
     private apache.rocketmq.v2.Status status_;
     private com.google.protobuf.SingleFieldBuilderV3<
@@ -802,244 +760,123 @@ private static final long serialVersionUID = 0L;
       return statusBuilder_;
     }
 
-    private java.util.List<apache.rocketmq.v2.Message> messages_ =
-      java.util.Collections.emptyList();
-    private void ensureMessagesIsMutable() {
-      if (!((bitField0_ & 0x00000001) != 0)) {
-        messages_ = new java.util.ArrayList<apache.rocketmq.v2.Message>(messages_);
-        bitField0_ |= 0x00000001;
-       }
-    }
-
-    private com.google.protobuf.RepeatedFieldBuilderV3<
-        apache.rocketmq.v2.Message, apache.rocketmq.v2.Message.Builder, apache.rocketmq.v2.MessageOrBuilder> messagesBuilder_;
-
-    /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
-     */
-    public java.util.List<apache.rocketmq.v2.Message> getMessagesList() {
-      if (messagesBuilder_ == null) {
-        return java.util.Collections.unmodifiableList(messages_);
-      } else {
-        return messagesBuilder_.getMessageList();
-      }
-    }
-    /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
-     */
-    public int getMessagesCount() {
-      if (messagesBuilder_ == null) {
-        return messages_.size();
-      } else {
-        return messagesBuilder_.getCount();
-      }
-    }
-    /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
-     */
-    public apache.rocketmq.v2.Message getMessages(int index) {
-      if (messagesBuilder_ == null) {
-        return messages_.get(index);
-      } else {
-        return messagesBuilder_.getMessage(index);
-      }
-    }
-    /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
-     */
-    public Builder setMessages(
-        int index, apache.rocketmq.v2.Message value) {
-      if (messagesBuilder_ == null) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        ensureMessagesIsMutable();
-        messages_.set(index, value);
-        onChanged();
-      } else {
-        messagesBuilder_.setMessage(index, value);
-      }
-      return this;
-    }
+    private apache.rocketmq.v2.Message message_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        apache.rocketmq.v2.Message, apache.rocketmq.v2.Message.Builder, apache.rocketmq.v2.MessageOrBuilder> messageBuilder_;
     /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+     * <code>.apache.rocketmq.v2.Message message = 2;</code>
+     * @return Whether the message field is set.
      */
-    public Builder setMessages(
-        int index, apache.rocketmq.v2.Message.Builder builderForValue) {
-      if (messagesBuilder_ == null) {
-        ensureMessagesIsMutable();
-        messages_.set(index, builderForValue.build());
-        onChanged();
-      } else {
-        messagesBuilder_.setMessage(index, builderForValue.build());
-      }
-      return this;
+    public boolean hasMessage() {
+      return messageBuilder_ != null || message_ != null;
     }
     /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+     * <code>.apache.rocketmq.v2.Message message = 2;</code>
+     * @return The message.
      */
-    public Builder addMessages(apache.rocketmq.v2.Message value) {
-      if (messagesBuilder_ == null) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        ensureMessagesIsMutable();
-        messages_.add(value);
-        onChanged();
+    public apache.rocketmq.v2.Message getMessage() {
+      if (messageBuilder_ == null) {
+        return message_ == null ? apache.rocketmq.v2.Message.getDefaultInstance() : message_;
       } else {
-        messagesBuilder_.addMessage(value);
+        return messageBuilder_.getMessage();
       }
-      return this;
     }
     /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+     * <code>.apache.rocketmq.v2.Message message = 2;</code>
      */
-    public Builder addMessages(
-        int index, apache.rocketmq.v2.Message value) {
-      if (messagesBuilder_ == null) {
+    public Builder setMessage(apache.rocketmq.v2.Message value) {
+      if (messageBuilder_ == null) {
         if (value == null) {
           throw new NullPointerException();
         }
-        ensureMessagesIsMutable();
-        messages_.add(index, value);
+        message_ = value;
         onChanged();
       } else {
-        messagesBuilder_.addMessage(index, value);
+        messageBuilder_.setMessage(value);
       }
+
       return this;
     }
     /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+     * <code>.apache.rocketmq.v2.Message message = 2;</code>
      */
-    public Builder addMessages(
+    public Builder setMessage(
         apache.rocketmq.v2.Message.Builder builderForValue) {
-      if (messagesBuilder_ == null) {
-        ensureMessagesIsMutable();
-        messages_.add(builderForValue.build());
+      if (messageBuilder_ == null) {
+        message_ = builderForValue.build();
         onChanged();
       } else {
-        messagesBuilder_.addMessage(builderForValue.build());
-      }
-      return this;
-    }
-    /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
-     */
-    public Builder addMessages(
-        int index, apache.rocketmq.v2.Message.Builder builderForValue) {
-      if (messagesBuilder_ == null) {
-        ensureMessagesIsMutable();
-        messages_.add(index, builderForValue.build());
-        onChanged();
-      } else {
-        messagesBuilder_.addMessage(index, builderForValue.build());
-      }
-      return this;
-    }
-    /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
-     */
-    public Builder addAllMessages(
-        java.lang.Iterable<? extends apache.rocketmq.v2.Message> values) {
-      if (messagesBuilder_ == null) {
-        ensureMessagesIsMutable();
-        com.google.protobuf.AbstractMessageLite.Builder.addAll(
-            values, messages_);
-        onChanged();
-      } else {
-        messagesBuilder_.addAllMessages(values);
+        messageBuilder_.setMessage(builderForValue.build());
       }
+
       return this;
     }
     /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+     * <code>.apache.rocketmq.v2.Message message = 2;</code>
      */
-    public Builder clearMessages() {
-      if (messagesBuilder_ == null) {
-        messages_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000001);
+    public Builder mergeMessage(apache.rocketmq.v2.Message value) {
+      if (messageBuilder_ == null) {
+        if (message_ != null) {
+          message_ =
+            apache.rocketmq.v2.Message.newBuilder(message_).mergeFrom(value).buildPartial();
+        } else {
+          message_ = value;
+        }
         onChanged();
       } else {
-        messagesBuilder_.clear();
+        messageBuilder_.mergeFrom(value);
       }
+
       return this;
     }
     /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+     * <code>.apache.rocketmq.v2.Message message = 2;</code>
      */
-    public Builder removeMessages(int index) {
-      if (messagesBuilder_ == null) {
-        ensureMessagesIsMutable();
-        messages_.remove(index);
+    public Builder clearMessage() {
+      if (messageBuilder_ == null) {
+        message_ = null;
         onChanged();
       } else {
-        messagesBuilder_.remove(index);
+        message_ = null;
+        messageBuilder_ = null;
       }
+
       return this;
     }
     /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
-     */
-    public apache.rocketmq.v2.Message.Builder getMessagesBuilder(
-        int index) {
-      return getMessagesFieldBuilder().getBuilder(index);
-    }
-    /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+     * <code>.apache.rocketmq.v2.Message message = 2;</code>
      */
-    public apache.rocketmq.v2.MessageOrBuilder getMessagesOrBuilder(
-        int index) {
-      if (messagesBuilder_ == null) {
-        return messages_.get(index);  } else {
-        return messagesBuilder_.getMessageOrBuilder(index);
-      }
+    public apache.rocketmq.v2.Message.Builder getMessageBuilder() {
+      
+      onChanged();
+      return getMessageFieldBuilder().getBuilder();
     }
     /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+     * <code>.apache.rocketmq.v2.Message message = 2;</code>
      */
-    public java.util.List<? extends apache.rocketmq.v2.MessageOrBuilder> 
-         getMessagesOrBuilderList() {
-      if (messagesBuilder_ != null) {
-        return messagesBuilder_.getMessageOrBuilderList();
+    public apache.rocketmq.v2.MessageOrBuilder getMessageOrBuilder() {
+      if (messageBuilder_ != null) {
+        return messageBuilder_.getMessageOrBuilder();
       } else {
-        return java.util.Collections.unmodifiableList(messages_);
+        return message_ == null ?
+            apache.rocketmq.v2.Message.getDefaultInstance() : message_;
       }
     }
     /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
-     */
-    public apache.rocketmq.v2.Message.Builder addMessagesBuilder() {
-      return getMessagesFieldBuilder().addBuilder(
-          apache.rocketmq.v2.Message.getDefaultInstance());
-    }
-    /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+     * <code>.apache.rocketmq.v2.Message message = 2;</code>
      */
-    public apache.rocketmq.v2.Message.Builder addMessagesBuilder(
-        int index) {
-      return getMessagesFieldBuilder().addBuilder(
-          index, apache.rocketmq.v2.Message.getDefaultInstance());
-    }
-    /**
-     * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
-     */
-    public java.util.List<apache.rocketmq.v2.Message.Builder> 
-         getMessagesBuilderList() {
-      return getMessagesFieldBuilder().getBuilderList();
-    }
-    private com.google.protobuf.RepeatedFieldBuilderV3<
+    private com.google.protobuf.SingleFieldBuilderV3<
         apache.rocketmq.v2.Message, apache.rocketmq.v2.Message.Builder, apache.rocketmq.v2.MessageOrBuilder> 
-        getMessagesFieldBuilder() {
-      if (messagesBuilder_ == null) {
-        messagesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+        getMessageFieldBuilder() {
+      if (messageBuilder_ == null) {
+        messageBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
             apache.rocketmq.v2.Message, apache.rocketmq.v2.Message.Builder, apache.rocketmq.v2.MessageOrBuilder>(
-                messages_,
-                ((bitField0_ & 0x00000001) != 0),
+                getMessage(),
                 getParentForChildren(),
                 isClean());
-        messages_ = null;
+        message_ = null;
       }
-      return messagesBuilder_;
+      return messageBuilder_;
     }
 
     private com.google.protobuf.Timestamp deliveryTimestamp_;
diff --git a/src/main/java/apache/rocketmq/v2/ReceiveMessageResponseOrBuilder.java b/src/main/java/apache/rocketmq/v2/ReceiveMessageResponseOrBuilder.java
index 4502816..59a3f7e 100644
--- a/src/main/java/apache/rocketmq/v2/ReceiveMessageResponseOrBuilder.java
+++ b/src/main/java/apache/rocketmq/v2/ReceiveMessageResponseOrBuilder.java
@@ -23,28 +23,19 @@ public interface ReceiveMessageResponseOrBuilder extends
   apache.rocketmq.v2.StatusOrBuilder getStatusOrBuilder();
 
   /**
-   * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+   * <code>.apache.rocketmq.v2.Message message = 2;</code>
+   * @return Whether the message field is set.
    */
-  java.util.List<apache.rocketmq.v2.Message> 
-      getMessagesList();
+  boolean hasMessage();
   /**
-   * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+   * <code>.apache.rocketmq.v2.Message message = 2;</code>
+   * @return The message.
    */
-  apache.rocketmq.v2.Message getMessages(int index);
+  apache.rocketmq.v2.Message getMessage();
   /**
-   * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
+   * <code>.apache.rocketmq.v2.Message message = 2;</code>
    */
-  int getMessagesCount();
-  /**
-   * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
-   */
-  java.util.List<? extends apache.rocketmq.v2.MessageOrBuilder> 
-      getMessagesOrBuilderList();
-  /**
-   * <code>repeated .apache.rocketmq.v2.Message messages = 2;</code>
-   */
-  apache.rocketmq.v2.MessageOrBuilder getMessagesOrBuilder(
-      int index);
+  apache.rocketmq.v2.MessageOrBuilder getMessageOrBuilder();
 
   /**
    * <code>.google.protobuf.Timestamp delivery_timestamp = 3;</code>
diff --git a/src/main/java/apache/rocketmq/v2/RetryPolicy.java b/src/main/java/apache/rocketmq/v2/RetryPolicy.java
index 75cf0be..dbc39b8 100644
--- a/src/main/java/apache/rocketmq/v2/RetryPolicy.java
+++ b/src/main/java/apache/rocketmq/v2/RetryPolicy.java
@@ -53,24 +53,32 @@ private static final long serialVersionUID = 0L;
             maxAttempts_ = input.readInt32();
             break;
           }
-          case 21: {
-
-            initialBackoff_ = input.readFloat();
-            break;
-          }
-          case 29: {
-
-            maxBackoff_ = input.readFloat();
-            break;
-          }
-          case 37: {
-
-            backoffMultiplier_ = input.readFloat();
+          case 18: {
+            apache.rocketmq.v2.ExponentialBackoff.Builder subBuilder = null;
+            if (strategyCase_ == 2) {
+              subBuilder = ((apache.rocketmq.v2.ExponentialBackoff) strategy_).toBuilder();
+            }
+            strategy_ =
+                input.readMessage(apache.rocketmq.v2.ExponentialBackoff.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom((apache.rocketmq.v2.ExponentialBackoff) strategy_);
+              strategy_ = subBuilder.buildPartial();
+            }
+            strategyCase_ = 2;
             break;
           }
-          case 40: {
-
-            random_ = input.readBool();
+          case 26: {
+            apache.rocketmq.v2.CustomizedBackoff.Builder subBuilder = null;
+            if (strategyCase_ == 3) {
+              subBuilder = ((apache.rocketmq.v2.CustomizedBackoff) strategy_).toBuilder();
+            }
+            strategy_ =
+                input.readMessage(apache.rocketmq.v2.CustomizedBackoff.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom((apache.rocketmq.v2.CustomizedBackoff) strategy_);
+              strategy_ = subBuilder.buildPartial();
+            }
+            strategyCase_ = 3;
             break;
           }
           default: {
@@ -105,6 +113,47 @@ private static final long serialVersionUID = 0L;
             apache.rocketmq.v2.RetryPolicy.class, apache.rocketmq.v2.RetryPolicy.Builder.class);
   }
 
+  private int strategyCase_ = 0;
+  private java.lang.Object strategy_;
+  public enum StrategyCase
+      implements com.google.protobuf.Internal.EnumLite,
+          com.google.protobuf.AbstractMessage.InternalOneOfEnum {
+    EXPONENTIAL_BACKOFF(2),
+    CUSTOMIZED_BACKOFF(3),
+    STRATEGY_NOT_SET(0);
+    private final int value;
+    private StrategyCase(int value) {
+      this.value = value;
+    }
+    /**
+     * @param value The number of the enum to look for.
+     * @return The enum associated with the given number.
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
+    public static StrategyCase valueOf(int value) {
+      return forNumber(value);
+    }
+
+    public static StrategyCase forNumber(int value) {
+      switch (value) {
+        case 2: return EXPONENTIAL_BACKOFF;
+        case 3: return CUSTOMIZED_BACKOFF;
+        case 0: return STRATEGY_NOT_SET;
+        default: return null;
+      }
+    }
+    public int getNumber() {
+      return this.value;
+    }
+  };
+
+  public StrategyCase
+  getStrategyCase() {
+    return StrategyCase.forNumber(
+        strategyCase_);
+  }
+
   public static final int MAX_ATTEMPTS_FIELD_NUMBER = 1;
   private int maxAttempts_;
   /**
@@ -116,48 +165,66 @@ private static final long serialVersionUID = 0L;
     return maxAttempts_;
   }
 
-  public static final int INITIAL_BACKOFF_FIELD_NUMBER = 2;
-  private float initialBackoff_;
+  public static final int EXPONENTIAL_BACKOFF_FIELD_NUMBER = 2;
   /**
-   * <code>float initial_backoff = 2;</code>
-   * @return The initialBackoff.
+   * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
+   * @return Whether the exponentialBackoff field is set.
    */
   @java.lang.Override
-  public float getInitialBackoff() {
-    return initialBackoff_;
+  public boolean hasExponentialBackoff() {
+    return strategyCase_ == 2;
   }
-
-  public static final int MAX_BACKOFF_FIELD_NUMBER = 3;
-  private float maxBackoff_;
   /**
-   * <code>float max_backoff = 3;</code>
-   * @return The maxBackoff.
+   * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
+   * @return The exponentialBackoff.
    */
   @java.lang.Override
-  public float getMaxBackoff() {
-    return maxBackoff_;
+  public apache.rocketmq.v2.ExponentialBackoff getExponentialBackoff() {
+    if (strategyCase_ == 2) {
+       return (apache.rocketmq.v2.ExponentialBackoff) strategy_;
+    }
+    return apache.rocketmq.v2.ExponentialBackoff.getDefaultInstance();
   }
-
-  public static final int BACKOFF_MULTIPLIER_FIELD_NUMBER = 4;
-  private float backoffMultiplier_;
   /**
-   * <code>float backoff_multiplier = 4;</code>
-   * @return The backoffMultiplier.
+   * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
    */
   @java.lang.Override
-  public float getBackoffMultiplier() {
-    return backoffMultiplier_;
+  public apache.rocketmq.v2.ExponentialBackoffOrBuilder getExponentialBackoffOrBuilder() {
+    if (strategyCase_ == 2) {
+       return (apache.rocketmq.v2.ExponentialBackoff) strategy_;
+    }
+    return apache.rocketmq.v2.ExponentialBackoff.getDefaultInstance();
   }
 
-  public static final int RANDOM_FIELD_NUMBER = 5;
-  private boolean random_;
+  public static final int CUSTOMIZED_BACKOFF_FIELD_NUMBER = 3;
+  /**
+   * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
+   * @return Whether the customizedBackoff field is set.
+   */
+  @java.lang.Override
+  public boolean hasCustomizedBackoff() {
+    return strategyCase_ == 3;
+  }
+  /**
+   * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
+   * @return The customizedBackoff.
+   */
+  @java.lang.Override
+  public apache.rocketmq.v2.CustomizedBackoff getCustomizedBackoff() {
+    if (strategyCase_ == 3) {
+       return (apache.rocketmq.v2.CustomizedBackoff) strategy_;
+    }
+    return apache.rocketmq.v2.CustomizedBackoff.getDefaultInstance();
+  }
   /**
-   * <code>bool random = 5;</code>
-   * @return The random.
+   * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
    */
   @java.lang.Override
-  public boolean getRandom() {
-    return random_;
+  public apache.rocketmq.v2.CustomizedBackoffOrBuilder getCustomizedBackoffOrBuilder() {
+    if (strategyCase_ == 3) {
+       return (apache.rocketmq.v2.CustomizedBackoff) strategy_;
+    }
+    return apache.rocketmq.v2.CustomizedBackoff.getDefaultInstance();
   }
 
   private byte memoizedIsInitialized = -1;
@@ -177,17 +244,11 @@ private static final long serialVersionUID = 0L;
     if (maxAttempts_ != 0) {
       output.writeInt32(1, maxAttempts_);
     }
-    if (java.lang.Float.floatToRawIntBits(initialBackoff_) != 0) {
-      output.writeFloat(2, initialBackoff_);
-    }
-    if (java.lang.Float.floatToRawIntBits(maxBackoff_) != 0) {
-      output.writeFloat(3, maxBackoff_);
+    if (strategyCase_ == 2) {
+      output.writeMessage(2, (apache.rocketmq.v2.ExponentialBackoff) strategy_);
     }
-    if (java.lang.Float.floatToRawIntBits(backoffMultiplier_) != 0) {
-      output.writeFloat(4, backoffMultiplier_);
-    }
-    if (random_ != false) {
-      output.writeBool(5, random_);
+    if (strategyCase_ == 3) {
+      output.writeMessage(3, (apache.rocketmq.v2.CustomizedBackoff) strategy_);
     }
     unknownFields.writeTo(output);
   }
@@ -202,21 +263,13 @@ private static final long serialVersionUID = 0L;
       size += com.google.protobuf.CodedOutputStream
         .computeInt32Size(1, maxAttempts_);
     }
-    if (java.lang.Float.floatToRawIntBits(initialBackoff_) != 0) {
-      size += com.google.protobuf.CodedOutputStream
-        .computeFloatSize(2, initialBackoff_);
-    }
-    if (java.lang.Float.floatToRawIntBits(maxBackoff_) != 0) {
-      size += com.google.protobuf.CodedOutputStream
-        .computeFloatSize(3, maxBackoff_);
-    }
-    if (java.lang.Float.floatToRawIntBits(backoffMultiplier_) != 0) {
+    if (strategyCase_ == 2) {
       size += com.google.protobuf.CodedOutputStream
-        .computeFloatSize(4, backoffMultiplier_);
+        .computeMessageSize(2, (apache.rocketmq.v2.ExponentialBackoff) strategy_);
     }
-    if (random_ != false) {
+    if (strategyCase_ == 3) {
       size += com.google.protobuf.CodedOutputStream
-        .computeBoolSize(5, random_);
+        .computeMessageSize(3, (apache.rocketmq.v2.CustomizedBackoff) strategy_);
     }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
@@ -235,17 +288,19 @@ private static final long serialVersionUID = 0L;
 
     if (getMaxAttempts()
         != other.getMaxAttempts()) return false;
-    if (java.lang.Float.floatToIntBits(getInitialBackoff())
-        != java.lang.Float.floatToIntBits(
-            other.getInitialBackoff())) return false;
-    if (java.lang.Float.floatToIntBits(getMaxBackoff())
-        != java.lang.Float.floatToIntBits(
-            other.getMaxBackoff())) return false;
-    if (java.lang.Float.floatToIntBits(getBackoffMultiplier())
-        != java.lang.Float.floatToIntBits(
-            other.getBackoffMultiplier())) return false;
-    if (getRandom()
-        != other.getRandom()) return false;
+    if (!getStrategyCase().equals(other.getStrategyCase())) return false;
+    switch (strategyCase_) {
+      case 2:
+        if (!getExponentialBackoff()
+            .equals(other.getExponentialBackoff())) return false;
+        break;
+      case 3:
+        if (!getCustomizedBackoff()
+            .equals(other.getCustomizedBackoff())) return false;
+        break;
+      case 0:
+      default:
+    }
     if (!unknownFields.equals(other.unknownFields)) return false;
     return true;
   }
@@ -259,18 +314,18 @@ private static final long serialVersionUID = 0L;
     hash = (19 * hash) + getDescriptor().hashCode();
     hash = (37 * hash) + MAX_ATTEMPTS_FIELD_NUMBER;
     hash = (53 * hash) + getMaxAttempts();
-    hash = (37 * hash) + INITIAL_BACKOFF_FIELD_NUMBER;
-    hash = (53 * hash) + java.lang.Float.floatToIntBits(
-        getInitialBackoff());
-    hash = (37 * hash) + MAX_BACKOFF_FIELD_NUMBER;
-    hash = (53 * hash) + java.lang.Float.floatToIntBits(
-        getMaxBackoff());
-    hash = (37 * hash) + BACKOFF_MULTIPLIER_FIELD_NUMBER;
-    hash = (53 * hash) + java.lang.Float.floatToIntBits(
-        getBackoffMultiplier());
-    hash = (37 * hash) + RANDOM_FIELD_NUMBER;
-    hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
-        getRandom());
+    switch (strategyCase_) {
+      case 2:
+        hash = (37 * hash) + EXPONENTIAL_BACKOFF_FIELD_NUMBER;
+        hash = (53 * hash) + getExponentialBackoff().hashCode();
+        break;
+      case 3:
+        hash = (37 * hash) + CUSTOMIZED_BACKOFF_FIELD_NUMBER;
+        hash = (53 * hash) + getCustomizedBackoff().hashCode();
+        break;
+      case 0:
+      default:
+    }
     hash = (29 * hash) + unknownFields.hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -406,14 +461,8 @@ private static final long serialVersionUID = 0L;
       super.clear();
       maxAttempts_ = 0;
 
-      initialBackoff_ = 0F;
-
-      maxBackoff_ = 0F;
-
-      backoffMultiplier_ = 0F;
-
-      random_ = false;
-
+      strategyCase_ = 0;
+      strategy_ = null;
       return this;
     }
 
@@ -441,10 +490,21 @@ private static final long serialVersionUID = 0L;
     public apache.rocketmq.v2.RetryPolicy buildPartial() {
       apache.rocketmq.v2.RetryPolicy result = new apache.rocketmq.v2.RetryPolicy(this);
       result.maxAttempts_ = maxAttempts_;
-      result.initialBackoff_ = initialBackoff_;
-      result.maxBackoff_ = maxBackoff_;
-      result.backoffMultiplier_ = backoffMultiplier_;
-      result.random_ = random_;
+      if (strategyCase_ == 2) {
+        if (exponentialBackoffBuilder_ == null) {
+          result.strategy_ = strategy_;
+        } else {
+          result.strategy_ = exponentialBackoffBuilder_.build();
+        }
+      }
+      if (strategyCase_ == 3) {
+        if (customizedBackoffBuilder_ == null) {
+          result.strategy_ = strategy_;
+        } else {
+          result.strategy_ = customizedBackoffBuilder_.build();
+        }
+      }
+      result.strategyCase_ = strategyCase_;
       onBuilt();
       return result;
     }
@@ -496,17 +556,18 @@ private static final long serialVersionUID = 0L;
       if (other.getMaxAttempts() != 0) {
         setMaxAttempts(other.getMaxAttempts());
       }
-      if (other.getInitialBackoff() != 0F) {
-        setInitialBackoff(other.getInitialBackoff());
-      }
-      if (other.getMaxBackoff() != 0F) {
-        setMaxBackoff(other.getMaxBackoff());
-      }
-      if (other.getBackoffMultiplier() != 0F) {
-        setBackoffMultiplier(other.getBackoffMultiplier());
-      }
-      if (other.getRandom() != false) {
-        setRandom(other.getRandom());
+      switch (other.getStrategyCase()) {
+        case EXPONENTIAL_BACKOFF: {
+          mergeExponentialBackoff(other.getExponentialBackoff());
+          break;
+        }
+        case CUSTOMIZED_BACKOFF: {
+          mergeCustomizedBackoff(other.getCustomizedBackoff());
+          break;
+        }
+        case STRATEGY_NOT_SET: {
+          break;
+        }
       }
       this.mergeUnknownFields(other.unknownFields);
       onChanged();
@@ -536,6 +597,21 @@ private static final long serialVersionUID = 0L;
       }
       return this;
     }
+    private int strategyCase_ = 0;
+    private java.lang.Object strategy_;
+    public StrategyCase
+        getStrategyCase() {
+      return StrategyCase.forNumber(
+          strategyCase_);
+    }
+
+    public Builder clearStrategy() {
+      strategyCase_ = 0;
+      strategy_ = null;
+      onChanged();
+      return this;
+    }
+
 
     private int maxAttempts_ ;
     /**
@@ -568,129 +644,287 @@ private static final long serialVersionUID = 0L;
       return this;
     }
 
-    private float initialBackoff_ ;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        apache.rocketmq.v2.ExponentialBackoff, apache.rocketmq.v2.ExponentialBackoff.Builder, apache.rocketmq.v2.ExponentialBackoffOrBuilder> exponentialBackoffBuilder_;
     /**
-     * <code>float initial_backoff = 2;</code>
-     * @return The initialBackoff.
+     * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
+     * @return Whether the exponentialBackoff field is set.
      */
     @java.lang.Override
-    public float getInitialBackoff() {
-      return initialBackoff_;
+    public boolean hasExponentialBackoff() {
+      return strategyCase_ == 2;
     }
     /**
-     * <code>float initial_backoff = 2;</code>
-     * @param value The initialBackoff to set.
-     * @return This builder for chaining.
+     * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
+     * @return The exponentialBackoff.
      */
-    public Builder setInitialBackoff(float value) {
-      
-      initialBackoff_ = value;
-      onChanged();
-      return this;
+    @java.lang.Override
+    public apache.rocketmq.v2.ExponentialBackoff getExponentialBackoff() {
+      if (exponentialBackoffBuilder_ == null) {
+        if (strategyCase_ == 2) {
+          return (apache.rocketmq.v2.ExponentialBackoff) strategy_;
+        }
+        return apache.rocketmq.v2.ExponentialBackoff.getDefaultInstance();
+      } else {
+        if (strategyCase_ == 2) {
+          return exponentialBackoffBuilder_.getMessage();
+        }
+        return apache.rocketmq.v2.ExponentialBackoff.getDefaultInstance();
+      }
     }
     /**
-     * <code>float initial_backoff = 2;</code>
-     * @return This builder for chaining.
+     * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
      */
-    public Builder clearInitialBackoff() {
-      
-      initialBackoff_ = 0F;
-      onChanged();
+    public Builder setExponentialBackoff(apache.rocketmq.v2.ExponentialBackoff value) {
+      if (exponentialBackoffBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        strategy_ = value;
+        onChanged();
+      } else {
+        exponentialBackoffBuilder_.setMessage(value);
+      }
+      strategyCase_ = 2;
       return this;
     }
-
-    private float maxBackoff_ ;
     /**
-     * <code>float max_backoff = 3;</code>
-     * @return The maxBackoff.
+     * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
      */
-    @java.lang.Override
-    public float getMaxBackoff() {
-      return maxBackoff_;
+    public Builder setExponentialBackoff(
+        apache.rocketmq.v2.ExponentialBackoff.Builder builderForValue) {
+      if (exponentialBackoffBuilder_ == null) {
+        strategy_ = builderForValue.build();
+        onChanged();
+      } else {
+        exponentialBackoffBuilder_.setMessage(builderForValue.build());
+      }
+      strategyCase_ = 2;
+      return this;
     }
     /**
-     * <code>float max_backoff = 3;</code>
-     * @param value The maxBackoff to set.
-     * @return This builder for chaining.
+     * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
      */
-    public Builder setMaxBackoff(float value) {
-      
-      maxBackoff_ = value;
-      onChanged();
+    public Builder mergeExponentialBackoff(apache.rocketmq.v2.ExponentialBackoff value) {
+      if (exponentialBackoffBuilder_ == null) {
+        if (strategyCase_ == 2 &&
+            strategy_ != apache.rocketmq.v2.ExponentialBackoff.getDefaultInstance()) {
+          strategy_ = apache.rocketmq.v2.ExponentialBackoff.newBuilder((apache.rocketmq.v2.ExponentialBackoff) strategy_)
+              .mergeFrom(value).buildPartial();
+        } else {
+          strategy_ = value;
+        }
+        onChanged();
+      } else {
+        if (strategyCase_ == 2) {
+          exponentialBackoffBuilder_.mergeFrom(value);
+        }
+        exponentialBackoffBuilder_.setMessage(value);
+      }
+      strategyCase_ = 2;
       return this;
     }
     /**
-     * <code>float max_backoff = 3;</code>
-     * @return This builder for chaining.
+     * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
      */
-    public Builder clearMaxBackoff() {
-      
-      maxBackoff_ = 0F;
-      onChanged();
+    public Builder clearExponentialBackoff() {
+      if (exponentialBackoffBuilder_ == null) {
+        if (strategyCase_ == 2) {
+          strategyCase_ = 0;
+          strategy_ = null;
+          onChanged();
+        }
+      } else {
+        if (strategyCase_ == 2) {
+          strategyCase_ = 0;
+          strategy_ = null;
+        }
+        exponentialBackoffBuilder_.clear();
+      }
       return this;
     }
+    /**
+     * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
+     */
+    public apache.rocketmq.v2.ExponentialBackoff.Builder getExponentialBackoffBuilder() {
+      return getExponentialBackoffFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
+     */
+    @java.lang.Override
+    public apache.rocketmq.v2.ExponentialBackoffOrBuilder getExponentialBackoffOrBuilder() {
+      if ((strategyCase_ == 2) && (exponentialBackoffBuilder_ != null)) {
+        return exponentialBackoffBuilder_.getMessageOrBuilder();
+      } else {
+        if (strategyCase_ == 2) {
+          return (apache.rocketmq.v2.ExponentialBackoff) strategy_;
+        }
+        return apache.rocketmq.v2.ExponentialBackoff.getDefaultInstance();
+      }
+    }
+    /**
+     * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        apache.rocketmq.v2.ExponentialBackoff, apache.rocketmq.v2.ExponentialBackoff.Builder, apache.rocketmq.v2.ExponentialBackoffOrBuilder> 
+        getExponentialBackoffFieldBuilder() {
+      if (exponentialBackoffBuilder_ == null) {
+        if (!(strategyCase_ == 2)) {
+          strategy_ = apache.rocketmq.v2.ExponentialBackoff.getDefaultInstance();
+        }
+        exponentialBackoffBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            apache.rocketmq.v2.ExponentialBackoff, apache.rocketmq.v2.ExponentialBackoff.Builder, apache.rocketmq.v2.ExponentialBackoffOrBuilder>(
+                (apache.rocketmq.v2.ExponentialBackoff) strategy_,
+                getParentForChildren(),
+                isClean());
+        strategy_ = null;
+      }
+      strategyCase_ = 2;
+      onChanged();;
+      return exponentialBackoffBuilder_;
+    }
 
-    private float backoffMultiplier_ ;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        apache.rocketmq.v2.CustomizedBackoff, apache.rocketmq.v2.CustomizedBackoff.Builder, apache.rocketmq.v2.CustomizedBackoffOrBuilder> customizedBackoffBuilder_;
     /**
-     * <code>float backoff_multiplier = 4;</code>
-     * @return The backoffMultiplier.
+     * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
+     * @return Whether the customizedBackoff field is set.
      */
     @java.lang.Override
-    public float getBackoffMultiplier() {
-      return backoffMultiplier_;
+    public boolean hasCustomizedBackoff() {
+      return strategyCase_ == 3;
     }
     /**
-     * <code>float backoff_multiplier = 4;</code>
-     * @param value The backoffMultiplier to set.
-     * @return This builder for chaining.
+     * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
+     * @return The customizedBackoff.
      */
-    public Builder setBackoffMultiplier(float value) {
-      
-      backoffMultiplier_ = value;
-      onChanged();
-      return this;
+    @java.lang.Override
+    public apache.rocketmq.v2.CustomizedBackoff getCustomizedBackoff() {
+      if (customizedBackoffBuilder_ == null) {
+        if (strategyCase_ == 3) {
+          return (apache.rocketmq.v2.CustomizedBackoff) strategy_;
+        }
+        return apache.rocketmq.v2.CustomizedBackoff.getDefaultInstance();
+      } else {
+        if (strategyCase_ == 3) {
+          return customizedBackoffBuilder_.getMessage();
+        }
+        return apache.rocketmq.v2.CustomizedBackoff.getDefaultInstance();
+      }
     }
     /**
-     * <code>float backoff_multiplier = 4;</code>
-     * @return This builder for chaining.
+     * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
      */
-    public Builder clearBackoffMultiplier() {
-      
-      backoffMultiplier_ = 0F;
-      onChanged();
+    public Builder setCustomizedBackoff(apache.rocketmq.v2.CustomizedBackoff value) {
+      if (customizedBackoffBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        strategy_ = value;
+        onChanged();
+      } else {
+        customizedBackoffBuilder_.setMessage(value);
+      }
+      strategyCase_ = 3;
       return this;
     }
-
-    private boolean random_ ;
     /**
-     * <code>bool random = 5;</code>
-     * @return The random.
+     * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
      */
-    @java.lang.Override
-    public boolean getRandom() {
-      return random_;
+    public Builder setCustomizedBackoff(
+        apache.rocketmq.v2.CustomizedBackoff.Builder builderForValue) {
+      if (customizedBackoffBuilder_ == null) {
+        strategy_ = builderForValue.build();
+        onChanged();
+      } else {
+        customizedBackoffBuilder_.setMessage(builderForValue.build());
+      }
+      strategyCase_ = 3;
+      return this;
     }
     /**
-     * <code>bool random = 5;</code>
-     * @param value The random to set.
-     * @return This builder for chaining.
+     * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
      */
-    public Builder setRandom(boolean value) {
-      
-      random_ = value;
-      onChanged();
+    public Builder mergeCustomizedBackoff(apache.rocketmq.v2.CustomizedBackoff value) {
+      if (customizedBackoffBuilder_ == null) {
+        if (strategyCase_ == 3 &&
+            strategy_ != apache.rocketmq.v2.CustomizedBackoff.getDefaultInstance()) {
+          strategy_ = apache.rocketmq.v2.CustomizedBackoff.newBuilder((apache.rocketmq.v2.CustomizedBackoff) strategy_)
+              .mergeFrom(value).buildPartial();
+        } else {
+          strategy_ = value;
+        }
+        onChanged();
+      } else {
+        if (strategyCase_ == 3) {
+          customizedBackoffBuilder_.mergeFrom(value);
+        }
+        customizedBackoffBuilder_.setMessage(value);
+      }
+      strategyCase_ = 3;
       return this;
     }
     /**
-     * <code>bool random = 5;</code>
-     * @return This builder for chaining.
+     * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
      */
-    public Builder clearRandom() {
-      
-      random_ = false;
-      onChanged();
+    public Builder clearCustomizedBackoff() {
+      if (customizedBackoffBuilder_ == null) {
+        if (strategyCase_ == 3) {
+          strategyCase_ = 0;
+          strategy_ = null;
+          onChanged();
+        }
+      } else {
+        if (strategyCase_ == 3) {
+          strategyCase_ = 0;
+          strategy_ = null;
+        }
+        customizedBackoffBuilder_.clear();
+      }
       return this;
     }
+    /**
+     * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
+     */
+    public apache.rocketmq.v2.CustomizedBackoff.Builder getCustomizedBackoffBuilder() {
+      return getCustomizedBackoffFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
+     */
+    @java.lang.Override
+    public apache.rocketmq.v2.CustomizedBackoffOrBuilder getCustomizedBackoffOrBuilder() {
+      if ((strategyCase_ == 3) && (customizedBackoffBuilder_ != null)) {
+        return customizedBackoffBuilder_.getMessageOrBuilder();
+      } else {
+        if (strategyCase_ == 3) {
+          return (apache.rocketmq.v2.CustomizedBackoff) strategy_;
+        }
+        return apache.rocketmq.v2.CustomizedBackoff.getDefaultInstance();
+      }
+    }
+    /**
+     * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        apache.rocketmq.v2.CustomizedBackoff, apache.rocketmq.v2.CustomizedBackoff.Builder, apache.rocketmq.v2.CustomizedBackoffOrBuilder> 
+        getCustomizedBackoffFieldBuilder() {
+      if (customizedBackoffBuilder_ == null) {
+        if (!(strategyCase_ == 3)) {
+          strategy_ = apache.rocketmq.v2.CustomizedBackoff.getDefaultInstance();
+        }
+        customizedBackoffBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            apache.rocketmq.v2.CustomizedBackoff, apache.rocketmq.v2.CustomizedBackoff.Builder, apache.rocketmq.v2.CustomizedBackoffOrBuilder>(
+                (apache.rocketmq.v2.CustomizedBackoff) strategy_,
+                getParentForChildren(),
+                isClean());
+        strategy_ = null;
+      }
+      strategyCase_ = 3;
+      onChanged();;
+      return customizedBackoffBuilder_;
+    }
     @java.lang.Override
     public final Builder setUnknownFields(
         final com.google.protobuf.UnknownFieldSet unknownFields) {
diff --git a/src/main/java/apache/rocketmq/v2/RetryPolicyOrBuilder.java b/src/main/java/apache/rocketmq/v2/RetryPolicyOrBuilder.java
index 742e8d6..7ba87ce 100644
--- a/src/main/java/apache/rocketmq/v2/RetryPolicyOrBuilder.java
+++ b/src/main/java/apache/rocketmq/v2/RetryPolicyOrBuilder.java
@@ -14,26 +14,34 @@ public interface RetryPolicyOrBuilder extends
   int getMaxAttempts();
 
   /**
-   * <code>float initial_backoff = 2;</code>
-   * @return The initialBackoff.
+   * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
+   * @return Whether the exponentialBackoff field is set.
    */
-  float getInitialBackoff();
-
+  boolean hasExponentialBackoff();
   /**
-   * <code>float max_backoff = 3;</code>
-   * @return The maxBackoff.
+   * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
+   * @return The exponentialBackoff.
    */
-  float getMaxBackoff();
-
+  apache.rocketmq.v2.ExponentialBackoff getExponentialBackoff();
   /**
-   * <code>float backoff_multiplier = 4;</code>
-   * @return The backoffMultiplier.
+   * <code>.apache.rocketmq.v2.ExponentialBackoff exponential_backoff = 2;</code>
    */
-  float getBackoffMultiplier();
+  apache.rocketmq.v2.ExponentialBackoffOrBuilder getExponentialBackoffOrBuilder();
 
   /**
-   * <code>bool random = 5;</code>
-   * @return The random.
+   * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
+   * @return Whether the customizedBackoff field is set.
+   */
+  boolean hasCustomizedBackoff();
+  /**
+   * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
+   * @return The customizedBackoff.
    */
-  boolean getRandom();
+  apache.rocketmq.v2.CustomizedBackoff getCustomizedBackoff();
+  /**
+   * <code>.apache.rocketmq.v2.CustomizedBackoff customized_backoff = 3;</code>
+   */
+  apache.rocketmq.v2.CustomizedBackoffOrBuilder getCustomizedBackoffOrBuilder();
+
+  public apache.rocketmq.v2.RetryPolicy.StrategyCase getStrategyCase();
 }
diff --git a/src/main/java/apache/rocketmq/v2/SendMessageRequest.java b/src/main/java/apache/rocketmq/v2/SendMessageRequest.java
index f9c06ee..6bfacb3 100644
--- a/src/main/java/apache/rocketmq/v2/SendMessageRequest.java
+++ b/src/main/java/apache/rocketmq/v2/SendMessageRequest.java
@@ -59,19 +59,6 @@ private static final long serialVersionUID = 0L;
                 input.readMessage(apache.rocketmq.v2.Message.parser(), extensionRegistry));
             break;
           }
-          case 18: {
-            apache.rocketmq.v2.MessageQueue.Builder subBuilder = null;
-            if (messageQueue_ != null) {
-              subBuilder = messageQueue_.toBuilder();
-            }
-            messageQueue_ = input.readMessage(apache.rocketmq.v2.MessageQueue.parser(), extensionRegistry);
-            if (subBuilder != null) {
-              subBuilder.mergeFrom(messageQueue_);
-              messageQueue_ = subBuilder.buildPartial();
-            }
-
-            break;
-          }
           default: {
             if (!parseUnknownField(
                 input, unknownFields, extensionRegistry, tag)) {
@@ -147,32 +134,6 @@ private static final long serialVersionUID = 0L;
     return messages_.get(index);
   }
 
-  public static final int MESSAGE_QUEUE_FIELD_NUMBER = 2;
-  private apache.rocketmq.v2.MessageQueue messageQueue_;
-  /**
-   * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-   * @return Whether the messageQueue field is set.
-   */
-  @java.lang.Override
-  public boolean hasMessageQueue() {
-    return messageQueue_ != null;
-  }
-  /**
-   * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-   * @return The messageQueue.
-   */
-  @java.lang.Override
-  public apache.rocketmq.v2.MessageQueue getMessageQueue() {
-    return messageQueue_ == null ? apache.rocketmq.v2.MessageQueue.getDefaultInstance() : messageQueue_;
-  }
-  /**
-   * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-   */
-  @java.lang.Override
-  public apache.rocketmq.v2.MessageQueueOrBuilder getMessageQueueOrBuilder() {
-    return getMessageQueue();
-  }
-
   private byte memoizedIsInitialized = -1;
   @java.lang.Override
   public final boolean isInitialized() {
@@ -190,9 +151,6 @@ private static final long serialVersionUID = 0L;
     for (int i = 0; i < messages_.size(); i++) {
       output.writeMessage(1, messages_.get(i));
     }
-    if (messageQueue_ != null) {
-      output.writeMessage(2, getMessageQueue());
-    }
     unknownFields.writeTo(output);
   }
 
@@ -206,10 +164,6 @@ private static final long serialVersionUID = 0L;
       size += com.google.protobuf.CodedOutputStream
         .computeMessageSize(1, messages_.get(i));
     }
-    if (messageQueue_ != null) {
-      size += com.google.protobuf.CodedOutputStream
-        .computeMessageSize(2, getMessageQueue());
-    }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
     return size;
@@ -227,11 +181,6 @@ private static final long serialVersionUID = 0L;
 
     if (!getMessagesList()
         .equals(other.getMessagesList())) return false;
-    if (hasMessageQueue() != other.hasMessageQueue()) return false;
-    if (hasMessageQueue()) {
-      if (!getMessageQueue()
-          .equals(other.getMessageQueue())) return false;
-    }
     if (!unknownFields.equals(other.unknownFields)) return false;
     return true;
   }
@@ -247,10 +196,6 @@ private static final long serialVersionUID = 0L;
       hash = (37 * hash) + MESSAGES_FIELD_NUMBER;
       hash = (53 * hash) + getMessagesList().hashCode();
     }
-    if (hasMessageQueue()) {
-      hash = (37 * hash) + MESSAGE_QUEUE_FIELD_NUMBER;
-      hash = (53 * hash) + getMessageQueue().hashCode();
-    }
     hash = (29 * hash) + unknownFields.hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -391,12 +336,6 @@ private static final long serialVersionUID = 0L;
       } else {
         messagesBuilder_.clear();
       }
-      if (messageQueueBuilder_ == null) {
-        messageQueue_ = null;
-      } else {
-        messageQueue_ = null;
-        messageQueueBuilder_ = null;
-      }
       return this;
     }
 
@@ -433,11 +372,6 @@ private static final long serialVersionUID = 0L;
       } else {
         result.messages_ = messagesBuilder_.build();
       }
-      if (messageQueueBuilder_ == null) {
-        result.messageQueue_ = messageQueue_;
-      } else {
-        result.messageQueue_ = messageQueueBuilder_.build();
-      }
       onBuilt();
       return result;
     }
@@ -512,9 +446,6 @@ private static final long serialVersionUID = 0L;
           }
         }
       }
-      if (other.hasMessageQueue()) {
-        mergeMessageQueue(other.getMessageQueue());
-      }
       this.mergeUnknownFields(other.unknownFields);
       onChanged();
       return this;
@@ -784,125 +715,6 @@ private static final long serialVersionUID = 0L;
       }
       return messagesBuilder_;
     }
-
-    private apache.rocketmq.v2.MessageQueue messageQueue_;
-    private com.google.protobuf.SingleFieldBuilderV3<
-        apache.rocketmq.v2.MessageQueue, apache.rocketmq.v2.MessageQueue.Builder, apache.rocketmq.v2.MessageQueueOrBuilder> messageQueueBuilder_;
-    /**
-     * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-     * @return Whether the messageQueue field is set.
-     */
-    public boolean hasMessageQueue() {
-      return messageQueueBuilder_ != null || messageQueue_ != null;
-    }
-    /**
-     * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-     * @return The messageQueue.
-     */
-    public apache.rocketmq.v2.MessageQueue getMessageQueue() {
-      if (messageQueueBuilder_ == null) {
-        return messageQueue_ == null ? apache.rocketmq.v2.MessageQueue.getDefaultInstance() : messageQueue_;
-      } else {
-        return messageQueueBuilder_.getMessage();
-      }
-    }
-    /**
-     * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-     */
-    public Builder setMessageQueue(apache.rocketmq.v2.MessageQueue value) {
-      if (messageQueueBuilder_ == null) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        messageQueue_ = value;
-        onChanged();
-      } else {
-        messageQueueBuilder_.setMessage(value);
-      }
-
-      return this;
-    }
-    /**
-     * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-     */
-    public Builder setMessageQueue(
-        apache.rocketmq.v2.MessageQueue.Builder builderForValue) {
-      if (messageQueueBuilder_ == null) {
-        messageQueue_ = builderForValue.build();
-        onChanged();
-      } else {
-        messageQueueBuilder_.setMessage(builderForValue.build());
-      }
-
-      return this;
-    }
-    /**
-     * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-     */
-    public Builder mergeMessageQueue(apache.rocketmq.v2.MessageQueue value) {
-      if (messageQueueBuilder_ == null) {
-        if (messageQueue_ != null) {
-          messageQueue_ =
-            apache.rocketmq.v2.MessageQueue.newBuilder(messageQueue_).mergeFrom(value).buildPartial();
-        } else {
-          messageQueue_ = value;
-        }
-        onChanged();
-      } else {
-        messageQueueBuilder_.mergeFrom(value);
-      }
-
-      return this;
-    }
-    /**
-     * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-     */
-    public Builder clearMessageQueue() {
-      if (messageQueueBuilder_ == null) {
-        messageQueue_ = null;
-        onChanged();
-      } else {
-        messageQueue_ = null;
-        messageQueueBuilder_ = null;
-      }
-
-      return this;
-    }
-    /**
-     * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-     */
-    public apache.rocketmq.v2.MessageQueue.Builder getMessageQueueBuilder() {
-      
-      onChanged();
-      return getMessageQueueFieldBuilder().getBuilder();
-    }
-    /**
-     * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-     */
-    public apache.rocketmq.v2.MessageQueueOrBuilder getMessageQueueOrBuilder() {
-      if (messageQueueBuilder_ != null) {
-        return messageQueueBuilder_.getMessageOrBuilder();
-      } else {
-        return messageQueue_ == null ?
-            apache.rocketmq.v2.MessageQueue.getDefaultInstance() : messageQueue_;
-      }
-    }
-    /**
-     * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-     */
-    private com.google.protobuf.SingleFieldBuilderV3<
-        apache.rocketmq.v2.MessageQueue, apache.rocketmq.v2.MessageQueue.Builder, apache.rocketmq.v2.MessageQueueOrBuilder> 
-        getMessageQueueFieldBuilder() {
-      if (messageQueueBuilder_ == null) {
-        messageQueueBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-            apache.rocketmq.v2.MessageQueue, apache.rocketmq.v2.MessageQueue.Builder, apache.rocketmq.v2.MessageQueueOrBuilder>(
-                getMessageQueue(),
-                getParentForChildren(),
-                isClean());
-        messageQueue_ = null;
-      }
-      return messageQueueBuilder_;
-    }
     @java.lang.Override
     public final Builder setUnknownFields(
         final com.google.protobuf.UnknownFieldSet unknownFields) {
diff --git a/src/main/java/apache/rocketmq/v2/SendMessageRequestOrBuilder.java b/src/main/java/apache/rocketmq/v2/SendMessageRequestOrBuilder.java
index eda414b..c1f2461 100644
--- a/src/main/java/apache/rocketmq/v2/SendMessageRequestOrBuilder.java
+++ b/src/main/java/apache/rocketmq/v2/SendMessageRequestOrBuilder.java
@@ -30,19 +30,4 @@ public interface SendMessageRequestOrBuilder extends
    */
   apache.rocketmq.v2.MessageOrBuilder getMessagesOrBuilder(
       int index);
-
-  /**
-   * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-   * @return Whether the messageQueue field is set.
-   */
-  boolean hasMessageQueue();
-  /**
-   * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-   * @return The messageQueue.
-   */
-  apache.rocketmq.v2.MessageQueue getMessageQueue();
-  /**
-   * <code>.apache.rocketmq.v2.MessageQueue message_queue = 2;</code>
-   */
-  apache.rocketmq.v2.MessageQueueOrBuilder getMessageQueueOrBuilder();
 }
diff --git a/src/main/java/apache/rocketmq/v2/Subscription.java b/src/main/java/apache/rocketmq/v2/Subscription.java
index 13f3782..b350122 100644
--- a/src/main/java/apache/rocketmq/v2/Subscription.java
+++ b/src/main/java/apache/rocketmq/v2/Subscription.java
@@ -79,7 +79,7 @@ private static final long serialVersionUID = 0L;
           }
           case 34: {
             apache.rocketmq.v2.RetryPolicy.Builder subBuilder = null;
-            if (backoffPolicy_ != null) {
+            if (((bitField0_ & 0x00000004) != 0)) {
               subBuilder = backoffPolicy_.toBuilder();
             }
             backoffPolicy_ = input.readMessage(apache.rocketmq.v2.RetryPolicy.parser(), extensionRegistry);
@@ -87,17 +87,17 @@ private static final long serialVersionUID = 0L;
               subBuilder.mergeFrom(backoffPolicy_);
               backoffPolicy_ = subBuilder.buildPartial();
             }
-
+            bitField0_ |= 0x00000004;
             break;
           }
           case 40: {
-            bitField0_ |= 0x00000004;
+            bitField0_ |= 0x00000008;
             receiveBatchSize_ = input.readInt32();
             break;
           }
           case 50: {
             com.google.protobuf.Duration.Builder subBuilder = null;
-            if (((bitField0_ & 0x00000008) != 0)) {
+            if (((bitField0_ & 0x00000010) != 0)) {
               subBuilder = longPollingTimeout_.toBuilder();
             }
             longPollingTimeout_ = input.readMessage(com.google.protobuf.Duration.parser(), extensionRegistry);
@@ -105,7 +105,7 @@ private static final long serialVersionUID = 0L;
               subBuilder.mergeFrom(longPollingTimeout_);
               longPollingTimeout_ = subBuilder.buildPartial();
             }
-            bitField0_ |= 0x00000008;
+            bitField0_ |= 0x00000010;
             break;
           }
           default: {
@@ -296,12 +296,12 @@ private static final long serialVersionUID = 0L;
    * the prior one depletes its lifecycle.
    * </pre>
    *
-   * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+   * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
    * @return Whether the backoffPolicy field is set.
    */
   @java.lang.Override
   public boolean hasBackoffPolicy() {
-    return backoffPolicy_ != null;
+    return ((bitField0_ & 0x00000004) != 0);
   }
   /**
    * <pre>
@@ -312,7 +312,7 @@ private static final long serialVersionUID = 0L;
    * the prior one depletes its lifecycle.
    * </pre>
    *
-   * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+   * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
    * @return The backoffPolicy.
    */
   @java.lang.Override
@@ -328,11 +328,11 @@ private static final long serialVersionUID = 0L;
    * the prior one depletes its lifecycle.
    * </pre>
    *
-   * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+   * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
    */
   @java.lang.Override
   public apache.rocketmq.v2.RetryPolicyOrBuilder getBackoffPolicyOrBuilder() {
-    return getBackoffPolicy();
+    return backoffPolicy_ == null ? apache.rocketmq.v2.RetryPolicy.getDefaultInstance() : backoffPolicy_;
   }
 
   public static final int RECEIVE_BATCH_SIZE_FIELD_NUMBER = 5;
@@ -347,7 +347,7 @@ private static final long serialVersionUID = 0L;
    */
   @java.lang.Override
   public boolean hasReceiveBatchSize() {
-    return ((bitField0_ & 0x00000004) != 0);
+    return ((bitField0_ & 0x00000008) != 0);
   }
   /**
    * <pre>
@@ -375,7 +375,7 @@ private static final long serialVersionUID = 0L;
    */
   @java.lang.Override
   public boolean hasLongPollingTimeout() {
-    return ((bitField0_ & 0x00000008) != 0);
+    return ((bitField0_ & 0x00000010) != 0);
   }
   /**
    * <pre>
@@ -426,13 +426,13 @@ private static final long serialVersionUID = 0L;
     if (((bitField0_ & 0x00000002) != 0)) {
       output.writeBool(3, fifo_);
     }
-    if (backoffPolicy_ != null) {
+    if (((bitField0_ & 0x00000004) != 0)) {
       output.writeMessage(4, getBackoffPolicy());
     }
-    if (((bitField0_ & 0x00000004) != 0)) {
+    if (((bitField0_ & 0x00000008) != 0)) {
       output.writeInt32(5, receiveBatchSize_);
     }
-    if (((bitField0_ & 0x00000008) != 0)) {
+    if (((bitField0_ & 0x00000010) != 0)) {
       output.writeMessage(6, getLongPollingTimeout());
     }
     unknownFields.writeTo(output);
@@ -456,15 +456,15 @@ private static final long serialVersionUID = 0L;
       size += com.google.protobuf.CodedOutputStream
         .computeBoolSize(3, fifo_);
     }
-    if (backoffPolicy_ != null) {
+    if (((bitField0_ & 0x00000004) != 0)) {
       size += com.google.protobuf.CodedOutputStream
         .computeMessageSize(4, getBackoffPolicy());
     }
-    if (((bitField0_ & 0x00000004) != 0)) {
+    if (((bitField0_ & 0x00000008) != 0)) {
       size += com.google.protobuf.CodedOutputStream
         .computeInt32Size(5, receiveBatchSize_);
     }
-    if (((bitField0_ & 0x00000008) != 0)) {
+    if (((bitField0_ & 0x00000010) != 0)) {
       size += com.google.protobuf.CodedOutputStream
         .computeMessageSize(6, getLongPollingTimeout());
     }
@@ -676,6 +676,7 @@ private static final long serialVersionUID = 0L;
               .alwaysUseFieldBuilders) {
         getGroupFieldBuilder();
         getSubscriptionsFieldBuilder();
+        getBackoffPolicyFieldBuilder();
         getLongPollingTimeoutFieldBuilder();
       }
     }
@@ -699,17 +700,17 @@ private static final long serialVersionUID = 0L;
       if (backoffPolicyBuilder_ == null) {
         backoffPolicy_ = null;
       } else {
-        backoffPolicy_ = null;
-        backoffPolicyBuilder_ = null;
+        backoffPolicyBuilder_.clear();
       }
-      receiveBatchSize_ = 0;
       bitField0_ = (bitField0_ & ~0x00000008);
+      receiveBatchSize_ = 0;
+      bitField0_ = (bitField0_ & ~0x00000010);
       if (longPollingTimeoutBuilder_ == null) {
         longPollingTimeout_ = null;
       } else {
         longPollingTimeoutBuilder_.clear();
       }
-      bitField0_ = (bitField0_ & ~0x00000010);
+      bitField0_ = (bitField0_ & ~0x00000020);
       return this;
     }
 
@@ -759,22 +760,25 @@ private static final long serialVersionUID = 0L;
         result.fifo_ = fifo_;
         to_bitField0_ |= 0x00000002;
       }
-      if (backoffPolicyBuilder_ == null) {
-        result.backoffPolicy_ = backoffPolicy_;
-      } else {
-        result.backoffPolicy_ = backoffPolicyBuilder_.build();
-      }
       if (((from_bitField0_ & 0x00000008) != 0)) {
-        result.receiveBatchSize_ = receiveBatchSize_;
+        if (backoffPolicyBuilder_ == null) {
+          result.backoffPolicy_ = backoffPolicy_;
+        } else {
+          result.backoffPolicy_ = backoffPolicyBuilder_.build();
+        }
         to_bitField0_ |= 0x00000004;
       }
       if (((from_bitField0_ & 0x00000010) != 0)) {
+        result.receiveBatchSize_ = receiveBatchSize_;
+        to_bitField0_ |= 0x00000008;
+      }
+      if (((from_bitField0_ & 0x00000020) != 0)) {
         if (longPollingTimeoutBuilder_ == null) {
           result.longPollingTimeout_ = longPollingTimeout_;
         } else {
           result.longPollingTimeout_ = longPollingTimeoutBuilder_.build();
         }
-        to_bitField0_ |= 0x00000008;
+        to_bitField0_ |= 0x00000010;
       }
       result.bitField0_ = to_bitField0_;
       onBuilt();
@@ -1469,11 +1473,11 @@ private static final long serialVersionUID = 0L;
      * the prior one depletes its lifecycle.
      * </pre>
      *
-     * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+     * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
      * @return Whether the backoffPolicy field is set.
      */
     public boolean hasBackoffPolicy() {
-      return backoffPolicyBuilder_ != null || backoffPolicy_ != null;
+      return ((bitField0_ & 0x00000008) != 0);
     }
     /**
      * <pre>
@@ -1484,7 +1488,7 @@ private static final long serialVersionUID = 0L;
      * the prior one depletes its lifecycle.
      * </pre>
      *
-     * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+     * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
      * @return The backoffPolicy.
      */
     public apache.rocketmq.v2.RetryPolicy getBackoffPolicy() {
@@ -1503,7 +1507,7 @@ private static final long serialVersionUID = 0L;
      * the prior one depletes its lifecycle.
      * </pre>
      *
-     * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+     * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
      */
     public Builder setBackoffPolicy(apache.rocketmq.v2.RetryPolicy value) {
       if (backoffPolicyBuilder_ == null) {
@@ -1515,7 +1519,7 @@ private static final long serialVersionUID = 0L;
       } else {
         backoffPolicyBuilder_.setMessage(value);
       }
-
+      bitField0_ |= 0x00000008;
       return this;
     }
     /**
@@ -1527,7 +1531,7 @@ private static final long serialVersionUID = 0L;
      * the prior one depletes its lifecycle.
      * </pre>
      *
-     * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+     * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
      */
     public Builder setBackoffPolicy(
         apache.rocketmq.v2.RetryPolicy.Builder builderForValue) {
@@ -1537,7 +1541,7 @@ private static final long serialVersionUID = 0L;
       } else {
         backoffPolicyBuilder_.setMessage(builderForValue.build());
       }
-
+      bitField0_ |= 0x00000008;
       return this;
     }
     /**
@@ -1549,11 +1553,13 @@ private static final long serialVersionUID = 0L;
      * the prior one depletes its lifecycle.
      * </pre>
      *
-     * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+     * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
      */
     public Builder mergeBackoffPolicy(apache.rocketmq.v2.RetryPolicy value) {
       if (backoffPolicyBuilder_ == null) {
-        if (backoffPolicy_ != null) {
+        if (((bitField0_ & 0x00000008) != 0) &&
+            backoffPolicy_ != null &&
+            backoffPolicy_ != apache.rocketmq.v2.RetryPolicy.getDefaultInstance()) {
           backoffPolicy_ =
             apache.rocketmq.v2.RetryPolicy.newBuilder(backoffPolicy_).mergeFrom(value).buildPartial();
         } else {
@@ -1563,7 +1569,7 @@ private static final long serialVersionUID = 0L;
       } else {
         backoffPolicyBuilder_.mergeFrom(value);
       }
-
+      bitField0_ |= 0x00000008;
       return this;
     }
     /**
@@ -1575,17 +1581,16 @@ private static final long serialVersionUID = 0L;
      * the prior one depletes its lifecycle.
      * </pre>
      *
-     * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+     * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
      */
     public Builder clearBackoffPolicy() {
       if (backoffPolicyBuilder_ == null) {
         backoffPolicy_ = null;
         onChanged();
       } else {
-        backoffPolicy_ = null;
-        backoffPolicyBuilder_ = null;
+        backoffPolicyBuilder_.clear();
       }
-
+      bitField0_ = (bitField0_ & ~0x00000008);
       return this;
     }
     /**
@@ -1597,10 +1602,10 @@ private static final long serialVersionUID = 0L;
      * the prior one depletes its lifecycle.
      * </pre>
      *
-     * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+     * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
      */
     public apache.rocketmq.v2.RetryPolicy.Builder getBackoffPolicyBuilder() {
-      
+      bitField0_ |= 0x00000008;
       onChanged();
       return getBackoffPolicyFieldBuilder().getBuilder();
     }
@@ -1613,7 +1618,7 @@ private static final long serialVersionUID = 0L;
      * the prior one depletes its lifecycle.
      * </pre>
      *
-     * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+     * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
      */
     public apache.rocketmq.v2.RetryPolicyOrBuilder getBackoffPolicyOrBuilder() {
       if (backoffPolicyBuilder_ != null) {
@@ -1632,7 +1637,7 @@ private static final long serialVersionUID = 0L;
      * the prior one depletes its lifecycle.
      * </pre>
      *
-     * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+     * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
      */
     private com.google.protobuf.SingleFieldBuilderV3<
         apache.rocketmq.v2.RetryPolicy, apache.rocketmq.v2.RetryPolicy.Builder, apache.rocketmq.v2.RetryPolicyOrBuilder> 
@@ -1659,7 +1664,7 @@ private static final long serialVersionUID = 0L;
      */
     @java.lang.Override
     public boolean hasReceiveBatchSize() {
-      return ((bitField0_ & 0x00000008) != 0);
+      return ((bitField0_ & 0x00000010) != 0);
     }
     /**
      * <pre>
@@ -1683,7 +1688,7 @@ private static final long serialVersionUID = 0L;
      * @return This builder for chaining.
      */
     public Builder setReceiveBatchSize(int value) {
-      bitField0_ |= 0x00000008;
+      bitField0_ |= 0x00000010;
       receiveBatchSize_ = value;
       onChanged();
       return this;
@@ -1697,7 +1702,7 @@ private static final long serialVersionUID = 0L;
      * @return This builder for chaining.
      */
     public Builder clearReceiveBatchSize() {
-      bitField0_ = (bitField0_ & ~0x00000008);
+      bitField0_ = (bitField0_ & ~0x00000010);
       receiveBatchSize_ = 0;
       onChanged();
       return this;
@@ -1716,7 +1721,7 @@ private static final long serialVersionUID = 0L;
      * @return Whether the longPollingTimeout field is set.
      */
     public boolean hasLongPollingTimeout() {
-      return ((bitField0_ & 0x00000010) != 0);
+      return ((bitField0_ & 0x00000020) != 0);
     }
     /**
      * <pre>
@@ -1752,7 +1757,7 @@ private static final long serialVersionUID = 0L;
       } else {
         longPollingTimeoutBuilder_.setMessage(value);
       }
-      bitField0_ |= 0x00000010;
+      bitField0_ |= 0x00000020;
       return this;
     }
     /**
@@ -1771,7 +1776,7 @@ private static final long serialVersionUID = 0L;
       } else {
         longPollingTimeoutBuilder_.setMessage(builderForValue.build());
       }
-      bitField0_ |= 0x00000010;
+      bitField0_ |= 0x00000020;
       return this;
     }
     /**
@@ -1784,7 +1789,7 @@ private static final long serialVersionUID = 0L;
      */
     public Builder mergeLongPollingTimeout(com.google.protobuf.Duration value) {
       if (longPollingTimeoutBuilder_ == null) {
-        if (((bitField0_ & 0x00000010) != 0) &&
+        if (((bitField0_ & 0x00000020) != 0) &&
             longPollingTimeout_ != null &&
             longPollingTimeout_ != com.google.protobuf.Duration.getDefaultInstance()) {
           longPollingTimeout_ =
@@ -1796,7 +1801,7 @@ private static final long serialVersionUID = 0L;
       } else {
         longPollingTimeoutBuilder_.mergeFrom(value);
       }
-      bitField0_ |= 0x00000010;
+      bitField0_ |= 0x00000020;
       return this;
     }
     /**
@@ -1814,7 +1819,7 @@ private static final long serialVersionUID = 0L;
       } else {
         longPollingTimeoutBuilder_.clear();
       }
-      bitField0_ = (bitField0_ & ~0x00000010);
+      bitField0_ = (bitField0_ & ~0x00000020);
       return this;
     }
     /**
@@ -1826,7 +1831,7 @@ private static final long serialVersionUID = 0L;
      * <code>optional .google.protobuf.Duration long_polling_timeout = 6;</code>
      */
     public com.google.protobuf.Duration.Builder getLongPollingTimeoutBuilder() {
-      bitField0_ |= 0x00000010;
+      bitField0_ |= 0x00000020;
       onChanged();
       return getLongPollingTimeoutFieldBuilder().getBuilder();
     }
diff --git a/src/main/java/apache/rocketmq/v2/SubscriptionOrBuilder.java b/src/main/java/apache/rocketmq/v2/SubscriptionOrBuilder.java
index 5ddbeb2..e260d27 100644
--- a/src/main/java/apache/rocketmq/v2/SubscriptionOrBuilder.java
+++ b/src/main/java/apache/rocketmq/v2/SubscriptionOrBuilder.java
@@ -122,7 +122,7 @@ public interface SubscriptionOrBuilder extends
    * the prior one depletes its lifecycle.
    * </pre>
    *
-   * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+   * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
    * @return Whether the backoffPolicy field is set.
    */
   boolean hasBackoffPolicy();
@@ -135,7 +135,7 @@ public interface SubscriptionOrBuilder extends
    * the prior one depletes its lifecycle.
    * </pre>
    *
-   * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+   * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
    * @return The backoffPolicy.
    */
   apache.rocketmq.v2.RetryPolicy getBackoffPolicy();
@@ -148,7 +148,7 @@ public interface SubscriptionOrBuilder extends
    * the prior one depletes its lifecycle.
    * </pre>
    *
-   * <code>.apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
+   * <code>optional .apache.rocketmq.v2.RetryPolicy backoff_policy = 4;</code>
    */
   apache.rocketmq.v2.RetryPolicyOrBuilder getBackoffPolicyOrBuilder();
 
diff --git a/src/main/resources/proto/apache/rocketmq/v2/definition.proto b/src/main/resources/proto/apache/rocketmq/v2/definition.proto
index aa12be1..5775028 100644
--- a/src/main/resources/proto/apache/rocketmq/v2/definition.proto
+++ b/src/main/resources/proto/apache/rocketmq/v2/definition.proto
@@ -60,10 +60,22 @@ message FilterExpression {
 
 message RetryPolicy {
   int32 max_attempts = 1;
-  float initial_backoff = 2;
-  float max_backoff = 3;
-  float backoff_multiplier = 4;
-  bool random = 5;
+  oneof strategy {
+    ExponentialBackoff exponential_backoff = 2;
+    CustomizedBackoff customized_backoff = 3;
+  }
+}
+
+message ExponentialBackoff {
+  float initial_backoff = 1;
+  float max_backoff = 2;
+  float backoff_multiplier = 3;
+}
+
+message CustomizedBackoff {
+  // To support classic backoff strategy which is arbitary defined by end users.
+  // Typical values are: `1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h`
+  repeated google.protobuf.Duration next = 1;
 }
 
 message Resource {
diff --git a/src/main/resources/proto/apache/rocketmq/v2/service.proto b/src/main/resources/proto/apache/rocketmq/v2/service.proto
index 3a73f0f..bd5f55f 100644
--- a/src/main/resources/proto/apache/rocketmq/v2/service.proto
+++ b/src/main/resources/proto/apache/rocketmq/v2/service.proto
@@ -56,7 +56,6 @@ message QueryRouteResponse {
 
 message SendMessageRequest {
   repeated Message messages = 1;
-  MessageQueue message_queue = 2;
 }
 
 message SendMessageResponse {
@@ -85,7 +84,7 @@ message ReceiveMessageRequest {
 
 message ReceiveMessageResponse {
   Status status = 1;
-  repeated Message messages = 2;
+  Message message = 2;
   google.protobuf.Timestamp delivery_timestamp = 3;
   google.protobuf.Duration invisible_duration = 4;
 }
@@ -229,7 +228,7 @@ message Subscription {
   // For FIFO messages, the interval should be relatively small because
   // messages of the same message group would not be readily available utill
   // the prior one depletes its lifecycle.
-  RetryPolicy backoff_policy = 4;
+  optional RetryPolicy backoff_policy = 4;
 
   // Message receive batch size here is essential for push consumer.
   optional int32 receive_batch_size = 5;
@@ -362,6 +361,10 @@ service MessagingService {
   // or consumer group doesn't exist, returns `NOT_FOUND`. If there is no new
   // message in the specific topic, returns `OK` with an empty message set.
   // Please note that client may suffer from false empty responses.
+  //
+  // If failed to receive message from remote, server must return only one
+  // `ReceiveMessageResponse` as the reply to the request, whose `Status` indicates
+  // the specific reason of failure, otherwise, the reply is considered successful.
   rpc ReceiveMessage(ReceiveMessageRequest) returns (stream ReceiveMessageResponse) {
   }