| // Licensed to the Apache Software Foundation (ASF) under one or more |
| // contributor license agreements. See the NOTICE file distributed with |
| // this work for additional information regarding copyright ownership. |
| // The ASF licenses this file to You under the Apache License, Version 2.0 |
| // (the "License"); you may not use this file except in compliance with |
| // the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| syntax = "proto3"; |
| |
| import "google/protobuf/timestamp.proto"; |
| import "google/protobuf/duration.proto"; |
| |
| package apache.rocketmq.v2; |
| |
| option csharp_namespace = "Apache.Rocketmq.V2"; |
| option java_multiple_files = true; |
| option java_package = "apache.rocketmq.v2"; |
| option java_generate_equals_and_hash = true; |
| option java_string_check_utf8 = true; |
| option java_outer_classname = "MQDomain"; |
| |
| enum TransactionResolution { |
| TRANSACTION_RESOLUTION_UNSPECIFIED = 0; |
| COMMIT = 1; |
| ROLLBACK = 2; |
| } |
| |
| enum TransactionSource { |
| SOURCE_UNSPECIFIED = 0; |
| SOURCE_CLIENT = 1; |
| SOURCE_SERVER_CHECK = 2; |
| } |
| |
| enum Permission { |
| PERMISSION_UNSPECIFIED = 0; |
| NONE = 1; |
| READ = 2; |
| WRITE = 3; |
| READ_WRITE = 4; |
| } |
| |
| enum FilterType { |
| FILTER_TYPE_UNSPECIFIED = 0; |
| TAG = 1; |
| SQL = 2; |
| } |
| |
| message FilterExpression { |
| FilterType type = 1; |
| string expression = 2; |
| } |
| |
| // Dead lettering is done on a best effort basis. The same message might be |
| // dead lettered multiple times. |
| // |
| // If validation on any of the fields fails at subscription creation/update, |
| // the create/update subscription request will fail. |
| message DeadLetterPolicy { |
| // The maximum number of delivery attempts for any message. |
| // |
| // This field will be honored on a best effort basis. |
| // |
| // If this parameter is 0, a default value of 16 is used. |
| int32 max_delivery_attempts = 1; |
| } |
| |
| message RetryPolicy { |
| int32 max_attempts = 1; |
| float initial_backoff = 2; |
| float max_backoff = 3; |
| float backoff_multiplier = 4; |
| } |
| |
| message Resource { |
| string resource_namespace = 1; |
| |
| // Resource name identifier, which remains unique within the abstract resource |
| // namespace. |
| string name = 2; |
| } |
| |
| enum ConsumeMessageType { |
| CONSUME_MESSAGE_TYPE_UNSPECIFIED = 0; |
| ACTIVE = 1; |
| PASSIVE = 2; |
| } |
| |
| message Trace { |
| bool on = 1; |
| Endpoints service_access_point = 2; |
| } |
| |
| enum AuthenticationMethod { |
| AUTHENTICATION_METHOD_UNSPECIFIED = 0; |
| SASL = 1; |
| MUTUAL_TLS = 2; |
| HTTP_BASIC_AUTH = 3; |
| } |
| |
| message Authentication { |
| AuthenticationMethod method = 1; |
| string identity = 2; |
| } |
| |
| // Transport |
| message Timeout { |
| google.protobuf.Duration connect = 1; |
| |
| google.protobuf.Duration request = 2; |
| |
| // Long polling duration |
| google.protobuf.Duration polling = 3; |
| } |
| |
| message Publish { |
| // Publisher normally registers topics in interest, such that |
| // pre-conditions may be examined and validated. |
| repeated Resource topics = 1; |
| |
| // If a transactional message stay unresolved for more than |
| // `transaction_orphan_threshold`, it would be regarded as an |
| // orphan. Servers that manages orphan messages would pick up |
| // a capable publisher to resolve |
| google.protobuf.Duration transaction_orphan_threshold = 2; |
| |
| // If publishing message experiences RPC failure, `retry_policy` describes |
| // backoff policy before retries are made. |
| RetryPolicy retry_policy = 3; |
| |
| // If message body size exceeds `compress_threshold`, it would be desirable to |
| // compress it to relieve network overhead. |
| int32 compress_threshold = 4; |
| |
| // Max message size in bytes permitted by server. |
| int32 max_message_bytes = 5; |
| } |
| |
| message CacheLimits { |
| int32 count = 1; |
| int64 bytes = 2; |
| } |
| |
| message Subscription { |
| Resource group = 1; |
| |
| repeated SubscriptionEntry subscriptions = 2; |
| |
| DeadLetterPolicy dead_letter_policy = 3; |
| |
| ConsumeMessageType consume_type = 4; |
| |
| bool fifo = 5; |
| |
| // For RPC |
| RetryPolicy retry_policy = 6; |
| |
| // For PushConsumer |
| RetryPolicy consume_backoff_policy = 7; |
| |
| int32 max_receive_batch_size = 8; |
| |
| // After messages are received from servers, consumers normally split them |
| // into multiple mini-batches. Each mini-batch is assigned to a dedicated |
| // task, which will be submitted to thread-pool to run concurrently. |
| int32 messages_per_task = 9; |
| |
| CacheLimits cache_limits = 10; |
| |
| int32 consume_thread_count = 11; |
| |
| // Up to server |
| google.protobuf.Duration max_invisible_duration = 12; |
| } |
| |
| message SubscriptionEntry { |
| Resource topic = 1; |
| FilterExpression expression = 2; |
| } |
| |
| enum AddressScheme { |
| ADDRESS_SCHEME_UNSPECIFIED = 0; |
| IPv4 = 1; |
| IPv6 = 2; |
| DOMAIN_NAME = 3; |
| } |
| |
| message Address { |
| string host = 1; |
| int32 port = 2; |
| } |
| |
| message Endpoints { |
| AddressScheme scheme = 1; |
| repeated Address addresses = 2; |
| } |
| |
| message Broker { |
| // Name of the broker |
| string name = 1; |
| |
| // Broker index. Canonically, index = 0 implies that the broker is playing |
| // leader role while brokers with index > 0 play follower role. |
| int32 id = 2; |
| |
| // Address of the broker, complying with the following scheme |
| // 1. dns:[//authority/]host[:port] |
| // 2. ipv4:address[:port][,address[:port],...] – IPv4 addresses |
| // 3. ipv6:address[:port][,address[:port],...] – IPv6 addresses |
| Endpoints endpoints = 3; |
| } |
| |
| message MessageQueue { |
| Resource topic = 1; |
| int32 id = 2; |
| Permission permission = 3; |
| Broker broker = 4; |
| repeated MessageType accept_message_types = 5; |
| } |
| |
| enum MessageType { |
| MESSAGE_TYPE_UNSPECIFIED = 0; |
| |
| NORMAL = 1; |
| |
| // Sequenced message |
| FIFO = 2; |
| |
| // Messages that are delivered after the specified duration. |
| DELAY = 3; |
| |
| // Messages that are transactional. Only committed messages are delivered to |
| // subscribers. |
| TRANSACTION = 4; |
| } |
| |
| enum DigestType { |
| DIGEST_TYPE_UNSPECIFIED = 0; |
| |
| // CRC algorithm achieves goal of detecting random data error with lowest |
| // computation overhead. |
| CRC32 = 1; |
| |
| // MD5 algorithm achieves good balance between collision rate and computation |
| // overhead. |
| MD5 = 2; |
| |
| // SHA-family has substantially fewer collision with fair amount of |
| // computation. |
| SHA1 = 3; |
| } |
| |
| // When publishing messages to or subscribing messages from brokers, clients |
| // shall include or validate digests of message body to ensure data integrity. |
| // |
| // For message publishment, when an invalid digest were detected, brokers need |
| // respond client with BAD_REQUEST. |
| // |
| // For messags subscription, when an invalid digest were detected, consumers |
| // need to handle this case according to message type: |
| // 1) Standard messages should be negatively acknowledged instantly, causing |
| // immediate re-delivery; 2) FIFO messages require special RPC, to re-fetch |
| // previously acquired messages batch; |
| // |
| // Message consumption model also affects how invalid digest are handled. When |
| // messages are consumed in broadcasting way, |
| // TODO: define semantics of invalid-digest-when-broadcasting. |
| message Digest { |
| DigestType type = 1; |
| string checksum = 2; |
| } |
| |
| enum Encoding { |
| ENCODING_UNSPECIFIED = 0; |
| |
| IDENTITY = 1; |
| |
| GZIP = 2; |
| } |
| |
| message SystemProperties { |
| // Tag |
| string tag = 1; |
| |
| // Message keys |
| repeated string keys = 2; |
| |
| // Message identifier, client-side generated, remains unique. |
| // if message_id is empty, the send message request will be aborted with |
| // status `INVALID_ARGUMENT` |
| string message_id = 3; |
| |
| // Message body digest |
| Digest body_digest = 4; |
| |
| // Message body encoding. Candidate options are identity, gzip, snappy etc. |
| Encoding body_encoding = 5; |
| |
| // Message type, normal, FIFO or transactional. |
| MessageType message_type = 6; |
| |
| // Message born time-point. |
| google.protobuf.Timestamp born_timestamp = 7; |
| |
| // Message born host. Valid options are IPv4, IPv6 or client host domain name. |
| string born_host = 8; |
| |
| // Time-point at which the message is stored in the broker. |
| google.protobuf.Timestamp store_timestamp = 9; |
| |
| // The broker that stores this message. It may be broker name, IP or arbitrary |
| // identifier that uniquely identify the server. |
| string store_host = 10; |
| |
| // Time-point at which broker delivers to clients. |
| google.protobuf.Timestamp delivery_timestamp = 11; |
| |
| // If a message is acquired by way of POP, this field holds the receipt. |
| // Clients use the receipt to acknowledge or negatively acknowledge the |
| // message. |
| string receipt_handle = 12; |
| |
| // Message queue identifier in which a message is physically stored. |
| int32 queue_id = 13; |
| |
| // Message-queue offset at which a message is stored. |
| int64 queue_offset = 14; |
| |
| // Period of time servers would remain invisible once a message is acquired. |
| google.protobuf.Duration invisible_duration = 15; |
| |
| // Business code may failed to process messages for the moment. Hence, clients |
| // may request servers to deliver them again using certain back-off strategy, |
| // the attempt is 1 not 0 if message is delivered first time. |
| int32 delivery_attempt = 16; |
| |
| string message_group = 17; |
| |
| // Trace context. |
| string trace_context = 18; |
| |
| // Delay time of first recover orphaned transaction request from server. |
| google.protobuf.Duration orphaned_transaction_recovery_duration = 19; |
| } |
| |
| message Message { |
| |
| Resource topic = 1; |
| |
| // User defined key-value pairs. |
| // If user_properties contain the reserved keys by RocketMQ, |
| // the send message request will be aborted with status `INVALID_ARGUMENT`. |
| // See below links for the reserved keys |
| // https://github.com/apache/rocketmq/blob/master/common/src/main/java/org/apache/rocketmq/common/message/MessageConst.java#L58 |
| map<string, string> user_properties = 2; |
| |
| SystemProperties system_properties = 3; |
| |
| bytes body = 4; |
| } |
| |
| message Assignment { MessageQueue message_queue = 1; } |
| |
| enum QueryOffsetPolicy { |
| QUERY_OFFSET_POLICY_UNSPECIFIED = 0; |
| |
| // Use this option if client wishes to playback all existing messages. |
| BEGINNING = 1; |
| |
| // Use this option if client wishes to skip all existing messages. |
| END = 2; |
| |
| // Use this option if time-based seek is targeted. |
| TIME_POINT = 3; |
| } |
| |
| message SendReceipt { |
| string message_id = 1; |
| string transaction_id = 2; |
| } |
| |
| enum Code { |
| // Success. |
| OK = 0; |
| // Format of access point is illegal. |
| ILLEGAL_ACCESS_POINT = 1; |
| // Format of topic is illegal. |
| ILLEGAL_TOPIC = 2; |
| // Format of consumer group is illegal. |
| ILLEGAL_CONSUMER_GROUP = 3; |
| // Format of message tag is illegal. |
| ILLEGAL_MESSAGE_TAG = 4; |
| // Format of message key is illegal. |
| ILLEGAL_MESSAGE_KEY = 5; |
| // Size of message keys exceeds the threshold. |
| MESSAGE_KEYS_TOO_LARGE = 6; |
| // Format of message group is illegal. |
| ILLEGAL_MESSAGE_GROUP = 7; |
| // Format of message property key is illegal. |
| ILLEGAL_MESSAGE_PROPERTY_KEY = 8; |
| // Message properties total size exceeds the threshold. |
| MESSAGE_PROPERTIES_TOO_LARGE = 9; |
| // Message body size exceeds the threshold. |
| MESSAGE_BODY_TOO_LARGE = 10; |
| |
| // User does not have the permission to operate. |
| // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403 |
| FORBIDDEN = 403; |
| |
| // Code indicates that the client request has not been completed |
| // because it lacks valid authentication credentials for the |
| // requested resource. |
| // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401 |
| UNAUTHORIZED = 401; |
| |
| // Topic resource does not exist. |
| TOPIC_NOT_FOUND = 13; |
| |
| // Consumer group resource does not exist. |
| CONSUMER_GROUP_NOT_FOUND = 14; |
| |
| // Not allowed to verify message. Chances are that you are verifying |
| // a FIFO message, as is violating FIFO semantics. |
| VERIFY_MESSAGE_FORBIDDEN = 15; |
| |
| // Failed to consume message. |
| FAILED_TO_CONSUME_MESSAGE = 16; |
| |
| // Message is corrupted. |
| MESSAGE_CORRUPTED = 17; |
| |
| // Too many requests are made in short period of duration. |
| // Requests are throttled. |
| TOO_MANY_REQUESTS = 18; |
| |
| // Expired receip-handle is used when trying to acknowledge or change |
| // invisible duration of a message |
| RECEIPT_HANDLE_EXPIRED = 19; |
| |
| // Message property is not match the message type. |
| MESSAGE_PROPERTY_DOES_NOT_MATCH_MESSAGE_TYPE = 20; |
| |
| // Code indicates that the server encountered an unexpected condition |
| // that prevented it from fulfilling the request. |
| // This error response is a generic "catch-all" response. |
| // Usually, this indicates the server cannot find a better alternative |
| // error code to response. Sometimes, server administrators log error |
| // responses like the 500 status code with more details about the request |
| // to prevent the error from happening again in the future. |
| // |
| // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500 |
| INTERNAL_SERVER_ERROR = 500; |
| |
| // Code means that the server or client does not support the functionality |
| // required to fulfill the request. |
| NOT_IMPLEMENTED = 501; |
| |
| // Code indicates that the server, while acting as a gateway or proxy, |
| // did not get a response in time from the upstream server that |
| // it needed in order to complete the request. |
| // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504 |
| GATEWAY_TIMEOUT = 504; |
| } |
| |
| message Status { |
| Code code = 1; |
| string message = 2; |
| } |