| // 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.v1; |
| |
| option java_multiple_files = true; |
| option java_package = "apache.rocketmq.v1"; |
| option java_generate_equals_and_hash = true; |
| option java_string_check_utf8 = true; |
| option java_outer_classname = "MQDomain"; |
| |
| option csharp_namespace = "apache.rocketmq.v1"; |
| |
| enum Permission { |
| NONE = 0; |
| READ = 1; |
| WRITE = 2; |
| READ_WRITE = 3; |
| |
| reserved 4 to 64; |
| } |
| |
| enum FilterType { |
| TAG = 0; |
| SQL = 1; |
| |
| reserved 2 to 64; |
| } |
| |
| message FilterExpression { |
| FilterType type = 1; |
| string expression = 2; |
| |
| reserved 3 to 64; |
| } |
| |
| // 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; |
| |
| reserved 2 to 64; |
| } |
| |
| message Resource { |
| string resource_namespace = 1; |
| |
| // Resource name identifier, which remains unique within the abstract resource |
| // namespace. |
| string name = 2; |
| |
| reserved 3 to 64; |
| } |
| |
| enum ConsumeModel { |
| CLUSTERING = 0; |
| BROADCASTING = 1; |
| |
| reserved 2 to 64; |
| } |
| |
| message ProducerData { |
| Resource group = 1; |
| |
| reserved 2 to 64; |
| } |
| |
| enum ConsumePolicy { |
| RESUME = 0; |
| PLAYBACK = 1; |
| DISCARD = 2; |
| TARGET_TIMESTAMP = 3; |
| |
| reserved 4 to 64; |
| } |
| |
| enum ConsumeMessageType { |
| ACTIVE = 0; |
| PASSIVE = 1; |
| |
| reserved 2 to 64; |
| } |
| |
| message ConsumerData { |
| Resource group = 1; |
| |
| repeated SubscriptionEntry subscriptions = 2; |
| |
| ConsumeModel consume_model = 3; |
| |
| ConsumePolicy consume_policy = 4; |
| |
| DeadLetterPolicy dead_letter_policy = 5; |
| |
| ConsumeMessageType consume_type = 6; |
| |
| reserved 7 to 64; |
| } |
| |
| message SubscriptionEntry { |
| Resource topic = 1; |
| FilterExpression expression = 2; |
| |
| reserved 3 to 64; |
| } |
| |
| enum AddressScheme { |
| IPv4 = 0; |
| IPv6 = 1; |
| DOMAIN_NAME = 2; |
| |
| reserved 3 to 64; |
| } |
| |
| message Address { |
| string host = 1; |
| int32 port = 2; |
| |
| reserved 3 to 64; |
| } |
| |
| message Endpoints { |
| AddressScheme scheme = 1; |
| repeated Address addresses = 2; |
| |
| reserved 3 to 64; |
| } |
| |
| 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; |
| |
| reserved 4 to 64; |
| } |
| |
| message Partition { |
| Resource topic = 1; |
| int32 id = 2; |
| Permission permission = 3; |
| Broker broker = 4; |
| |
| reserved 5 to 64; |
| } |
| |
| enum MessageType { |
| NORMAL = 0; |
| |
| // Sequenced message |
| FIFO = 1; |
| |
| // Messages that are delivered after the specified duration. |
| DELAY = 2; |
| |
| // Messages that are transactional. Only committed messages are delivered to |
| // subscribers. |
| TRANSACTION = 3; |
| |
| reserved 4 to 64; |
| } |
| |
| enum DigestType { |
| // CRC algorithm achieves goal of detecting random data error with lowest |
| // computation overhead. |
| CRC32 = 0; |
| |
| // MD5 algorithm achieves good balance between collision rate and computation |
| // overhead. |
| MD5 = 1; |
| |
| // SHA-family has substantially fewer collision with fair amount of |
| // computation. |
| SHA1 = 2; |
| |
| reserved 3 to 64; |
| } |
| |
| // 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; |
| |
| reserved 3 to 64; |
| } |
| |
| enum Encoding { |
| IDENTITY = 0; |
| GZIP = 1; |
| |
| reserved 2 to 64; |
| } |
| |
| message SystemAttribute { |
| // 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 name, IP or arbitrary |
| // identifier that uniquely identify the broker. |
| string store_host = 10; |
| |
| oneof timed_delivery { |
| // Time-point at which broker delivers to clients. |
| google.protobuf.Timestamp delivery_timestamp = 11; |
| |
| // Level-based delay strategy. |
| int32 delay_level = 12; |
| } |
| |
| // 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 = 13; |
| |
| // Partition identifier in which a message is physically stored. |
| int32 partition_id = 14; |
| |
| // Partition offset at which a message is stored. |
| int64 partition_offset = 15; |
| |
| // Period of time servers would remain invisible once a message is acquired. |
| google.protobuf.Duration invisible_period = 16; |
| |
| // 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 = 17; |
| |
| // Message producer load-balance group if applicable. |
| Resource producer_group = 18; |
| |
| string message_group = 19; |
| |
| // Trace context. |
| string trace_context = 20; |
| |
| // Delay time of first recover orphaned transaction request from server. |
| google.protobuf.Duration orphaned_transaction_recovery_period = 21; |
| |
| reserved 22 to 64; |
| } |
| |
| message Message { |
| |
| Resource topic = 1; |
| |
| // User defined key-value pairs. |
| // If user_attribute contains 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_attribute = 2; |
| |
| SystemAttribute system_attribute = 3; |
| |
| bytes body = 4; |
| |
| reserved 5 to 64; |
| } |
| |
| message Assignment { |
| Partition Partition = 1; |
| |
| reserved 2 to 64; |
| } |
| |
| enum QueryOffsetPolicy { |
| // Use this option if client wishes to playback all existing messages. |
| BEGINNING = 0; |
| |
| // Use this option if client wishes to skip all existing messages. |
| END = 1; |
| |
| // Use this option if time-based seek is targeted. |
| TIME_POINT = 2; |
| |
| reserved 3 to 64; |
| } |