blob: 71dc72b1f501aa9e1860712564c0fe805b2f7c2b [file] [log] [blame]
// 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;
}
message RetryPolicy {
int32 max_attempts = 1;
oneof strategy {
ExponentialBackoff exponential_backoff = 2;
CustomizedBackoff customized_backoff = 3;
}
}
// https://en.wikipedia.org/wiki/Exponential_backoff
message ExponentialBackoff {
google.protobuf.Duration initial = 1;
google.protobuf.Duration max = 2;
float 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 {
string resource_namespace = 1;
// Resource name identifier, which remains unique within the abstract resource
// namespace.
string name = 2;
}
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 publishing, when an invalid digest were detected, brokers need
// respond client with BAD_REQUEST.
//
// For messages 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 ClientType {
CLIENT_TYPE_UNSPECIFIED = 0;
PRODUCER = 1;
PUSH_CONSUMER = 2;
SIMPLE_CONSUMER = 3;
}
enum Encoding {
ENCODING_UNSPECIFIED = 0;
IDENTITY = 1;
GZIP = 2;
}
message SystemProperties {
// Tag, which is optional.
optional 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, which is absent
// for message publishing.
optional 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, which is optional.
optional google.protobuf.Timestamp delivery_timestamp = 11;
// If a message is acquired by way of POP, this field holds the receipt,
// which is absent for message publishing.
// Clients use the receipt to acknowledge or negatively acknowledge the
// message.
optional 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, which is absent for
// message publishing.
optional int64 queue_offset = 14;
// Period of time servers would remain invisible once a message is acquired.
optional 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, and it is absent
// for message publishing.
optional int32 delivery_attempt = 16;
// Define the group name of message in the same topic, which is optional.
optional string message_group = 17;
// Trace context for each message, which is optional.
optional string trace_context = 18;
// 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
optional 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 Code {
CODE_UNSPECIFIED = 0;
// Generic code for success.
OK = 20000;
// Generic code for multiple return results.
MULTIPLE_RESULTS = 30000;
// Generic code for bad request, indicating that required fields or headers are missing.
BAD_REQUEST = 40000;
// Format of access point is illegal.
ILLEGAL_ACCESS_POINT = 40001;
// Format of topic is illegal.
ILLEGAL_TOPIC = 40002;
// Format of consumer group is illegal.
ILLEGAL_CONSUMER_GROUP = 40003;
// Format of message tag is illegal.
ILLEGAL_MESSAGE_TAG = 40004;
// Format of message key is illegal.
ILLEGAL_MESSAGE_KEY = 40005;
// Format of message group is illegal.
ILLEGAL_MESSAGE_GROUP = 40006;
// Format of message property key is illegal.
ILLEGAL_MESSAGE_PROPERTY_KEY = 40007;
// Message properties total size exceeds the threshold.
MESSAGE_PROPERTIES_TOO_LARGE = 40008;
// Message body size exceeds the threshold.
MESSAGE_BODY_TOO_LARGE = 40009;
// Transaction id is invalid.
INVALID_TRANSACTION_ID = 40010;
// Format of message id is illegal.
ILLEGAL_MESSAGE_ID = 40011;
// Format of filter expression is illegal.
ILLEGAL_FILTER_EXPRESSION = 40012;
// Receipt handle of message is invalid.
INVALID_RECEIPT_HANDLE = 40013;
// Message property is not match the message type.
MESSAGE_PROPERTY_DOES_NOT_MATCH_MESSAGE_TYPE = 40014;
// Client type could not be recognized.
UNRECOGNIZED_CLIENT_TYPE = 40015;
// Message is corrupted.
MESSAGE_CORRUPTED = 40016;
// Request is rejected due to missing of x-mq-client-id header.
CLIENT_ID_REQUIRED = 40017;
// Generic code indicates that the client request lacks valid authentication
// credentials for the requested resource.
UNAUTHORIZED = 40100;
// Generic code for the case that user does not have the permission to operate.
FORBIDDEN = 40300;
// Generic code for resource not found.
NOT_FOUND = 40400;
// Message not found from server.
MESSAGE_NOT_FOUND = 40401;
// Topic resource does not exist.
TOPIC_NOT_FOUND = 40402;
// Consumer group resource does not exist.
CONSUMER_GROUP_NOT_FOUND = 40403;
// Generic code indicates that too many requests are made in short period of duration.
// Requests are throttled.
TOO_MANY_REQUESTS = 42900;
// Generic code indicates that server/client encountered an unexpected
// condition that prevented it from fulfilling the request.
INTERNAL_ERROR = 50000;
// 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 = 50001;
// The HA-mechanism is not working now.
HA_NOT_AVAILABLE = 50002;
// Generic code means that the server or client does not support the
// functionality required to fulfill the request.
NOT_IMPLEMENTED = 50100;
// Generic code for timeout.
TIMEOUT = 50400;
// Message persistence timeout.
MASTER_PERSISTENCE_TIMEOUT = 50401;
// Slave persistence timeout.
SLAVE_PERSISTENCE_TIMEOUT = 50402;
// 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.
PROXY_TIMEOUT = 50403;
UNSUPPORTED = 50500;
// Operation is not allowed in current version.
VERSION_UNSUPPORTED = 50501;
// Not allowed to verify message. Chances are that you are verifying
// a FIFO message, as is violating FIFO semantics.
VERIFY_FIFO_MESSAGE_UNSUPPORTED = 50502;
// Generic code for failed message consumption.
FAILED_TO_CONSUME_MESSAGE = 60000;
}
message Status {
Code code = 1;
string message = 2;
}
enum Language {
LANGUAGE_UNSPECIFIED = 0;
JAVA = 1;
CPP = 2;
DOT_NET = 3;
GOLANG = 4;
RUST = 5;
}
// User Agent
message UA {
// SDK language
Language language = 1;
// SDK version
string version = 2;
// Platform details, including OS name, version, arch etc.
string platform = 3;
// Hostname of the node
string hostname = 4;
}