Get desktop application:
View/edit binary Protocol Buffers messages
MasterAdminService is implemented by the Master for managing the cluster. This allows an external service to control the state of the system.
AddJobGroup creates a new JobGroup. An error is thrown if this job group already exist.
AddJobGroupRequest runs a new job group with job group definition and configuration provided in the request. A JobGroup is a group of Jobs. e.g., for Kafka, JobGroup = Topic, Job = Partition.
The JobGroup that is registered to the system.
DeleteJobGroup deletes the JobGroup from storage. This differs from updating state to CANCEL which stops the job but retains the job group information in storage. Deleted Job Groups are not recoverable!
DeleteJobGroupRequest is sent to delete job group from storage.
DeleteJobGroupResponse is sent back in response to a delete request. Any non-error GRPC response is considered success.
(message has no fields)
GetAllJobGroups is a server stream that returns all job groups. We use streams b/c gRPC has a 1MB single payload limit for large clusters a unary request may not work.
GetAllJobGroupsRequest is sent to request all job groups.
(message has no fields)
GetAllJobGroupsResponse is sent back with the job groups.
GetClusterScaleStatus returns the scale status for the entire cluster.
GetClusterScaleStatusRequest is sent to get the scale status of the cluster.
(message has no fields)
GetClusterScaleStatusResponse is sent back with the scale status of the cluster.
the total number of job groups in the cluster
the total number of workers in the cluster
the combined messages per second of all the workers in the cluster
the combined bytes per second of all the workers in the cluster
the combined messages per second of all the job groups in the cluster
the combined bytes per second of all the job groups in the cluster
GetJobGroup returns the JobGroup for the specified id.
GetJobGroupRequest is sent to get a job group from storage.
GetJobGroupResponse is sent back in response to a get request.
UpdateJobGroupConfiguration updates the mutable JobConfiguration for a JobGroup.
UpdateJobGroupRequest updates the (mutable) Job configuration for the specified JobGroup.
UpdateJobGroupConfigurationResponse contains the update JobGroup.
UpdateJobGroupState updates the expected state for the JobGroup.
UpdateJobGroupStateRequest changes the expected state for the specified job group. Note: this updates the expected state but does not necessarily block until the distributed workers pick up the jobs.
UpdateJobGroupStateResponse is the job group after the expected state has been changed.
MasterWorkerService is the GRPC service exposed by the master for the worker to contact. Each worker is required to register itself and maintain an active heartbeat for liveness and to receive work assignment.
Heartbeat must be sent by a worker regularly to maintain liveness and lease.
HeartbeatRequest is sent by the worker to the master to indicate liveness. If the master does not receive a successful heartbeat request in a configurable amount of time, it should consider the worker dead and rebalance the job to other workers as necessary. The HeartbeatRequest also contains a progress report on all running job that the worker has previously received. The master may use this information to rebalance the workload as it sees fit.
HeartbeatResponse is sent by the controller to the worker to tell how it should command the jobs running at the worker. The controller compares how it expects the jobs on the worker to run and how they actually run, and derives the commands for the jobs according to the matrix of CommandType.
RegisterWorker is used by a new worker to register itself to receive work.
RegisterWorkerRequest is sent by the worker when it believes that it is not an active member of the cluster. A worker should set the Participants set as it best understands them. The master will validate that the Participants set is in a valid state when responding.
RegisterWorkerResponse is sent by the master to the worker to acknowledge that it is successfully registered as a worker in a cluster The participants set may have modified data (specifically the node id). The worker is required to update its internal participants information to match the updated one provided by the master. The correct participants set must be sent in all subsequent requests.
Audit configuration contains the configurations for individual audit tasks
Used in:
Type of audit to be executed as part of the task
Frequency of the audit in seconds
Config that will be populated based on the audit type
Configurations for cross DC auditing
Configurations for auditing replication pipelines
Configurations for retention auditing
Audit metadata contains the configurations for the different types of auditing to be performed
Used in: , ,
a list of audit configs
AuditTask is a specification for audit tasks in Uatu
Used in:
cluster to audit
topic to audit
partition to audit
Auditing related metadata
AuditTaskGroup is a specification for audit tasks in Uatu
Used in:
cluster to audit
topic to audit
Represents the different types of audit that can be done in KafkaAuditTask
Used in:
0 enum must be invalid per t.uber.com/protobuf-style
Type of audit where Kafka message count and latency are computed for a given duration. In addition, unique message count is calculated precisely by de-duping the messages
Type of audit where Kafka message count and latency are computed for a given duration. In addition, unique message count is calculated approximately
Type of audit where the topic retention is audited for any violations
Type of audit where topic availability is monitored. e.g offline partitions
Audit type for aggregating service local audits
Audit type for aggregating KRP local audits
Audit type for comparing cross dc message count
Audit type for monitoring replication pipelines - e.g regional to agg
AutoOffsetResetPolicy defines which offset to start to read when 1. the specified start_offset does not exist on the Kafka server, or 2. start_offset is not specified and there is no previously-committed offset on the Kafka server.
Used in: ,
0 enum must be invalid per t.uber.com/protobuf-style
automatically reset the offset to the earliest offset.
automatically reset the offset to the latest offset.
Used in: ,
0 enum must be invalid per t.uber.com/protobuf-style
the type of job to monitor by producing natively
the type of job to monitor by consuming natively
the type of job to monitor by producing via proxy
the type of job to monitor by consuming via proxy
Used in:
the type of job Kafka Availability to perform to monitor a service
whether the availability task should be zone aware. should be set for proxy producer or proxy consumer with zone isolation
AvailabilityTaskGroup is a task group spec for Kafka Availability
Used in:
the type of job Kafka Availability to perform to monitor a service
whether the availability task should be zone aware. should be set for proxy producer or proxy consumer with zone isolation
Command is an instruction that is sent from master to worker to change the worker behavior.
Used in:
The type of command that is being issued.
Details for the job to run.
CommandType of the command that is being issued. The matrix of commands is: +---------------+----------------+----------------+----------------+----------------+----------------+----------------+----------------------------------------+ | - | Expected State | null | INVALID | UNIMPLEMENTED | FAILED | CANCELED | RUNNING | +---------------+----------------+----------------+----------------+----------------+----------------+----------------+----------------------------------------+ | Actual State | - | - | - | - | - | - | - | +---------------+----------------+----------------+----------------+----------------+----------------+----------------+----------------------------------------+ | null | - | N/A | N/A | N/A | N/A | N/A | COMMAND_RUN | +---------------+----------------+----------------+----------------+----------------+----------------+----------------+----------------------------------------+ | INVALID | - | N/A | N/A | N/A | N/A | N/A | COMMAND_RUN | +---------------+----------------+----------------+----------------+----------------+----------------+----------------+----------------------------------------+ | UNIMPLEMENTED | - | N/A | N/A | N/A | N/A | N/A | COMMAND_RUN | +---------------+----------------+----------------+----------------+----------------+----------------+----------------+----------------------------------------+ | FAILED | - | N/A | N/A | N/A | N/A | N/A | COMMAND_RUN | +---------------+----------------+----------------+----------------+----------------+----------------+----------------+----------------------------------------+ | CANCELED | - | N/A | N/A | N/A | N/A | N/A | COMMAND_RUN | +---------------+----------------+----------------+----------------+----------------+----------------+----------------+----------------------------------------+ | RUNNING | - | COMMAND_CANCEL | COMMAND_CANCEL | COMMAND_CANCEL | COMMAND_CANCEL | COMMAND_CANCEL | COMMAND_UPDATE | | | | | | | | | if configuration change | +---------------+----------------+----------------+----------------+----------------+----------------+----------------+----------------------------------------+
Used in:
0 enum must be invalid per t.uber.com/protobuf-style
This is a command to run a job.
This command cancels a job. A CANCELED job cannot be restarted.
This command updates a job.
Represents specific audit configurations for cross DC auditing
Used in:
Used in:
Used in:
Used in:
Used in:
Used in:
EncodedFormatInfo configures the encoded format of the messages
Used in: ,
encoded format type
schema version of the encoded format
EncodedFormatType defines the type to encode data
Used in:
Per http://t.uber.com/protobuf-style, enum must start with INVALID=0
Flow describes how the data should flow.
Used in: , ,
messages_per_sec constraint.
bytes_per_sec constraint.
max_inflight_messages constraint.
To do exactly-once delivery in multiple partitions, Kafka guarantees atomic transactions. 1. read uncommitted messages 2. only read committed messages
Used in: ,
0 enum must be invalid per t.uber.com/protobuf-style
no value present
read all messages including uncommitted
read only transaction committed messages
The Job is the unit of work that needs to be done.
Used in: , ,
job_id is a globally unique id for the job item. This is set by the master when job is created.
JobType is an enumeration for the type of job to be run. This allows the master-worker protocol to generalize to multiple types of workload that needs sharding. JobType shall be used to determine the set of valid tasks that contains specific information about the job. The mapping of JobType to Tasks is: - JOB_TYPE_KAFKA_CONSUMER_TO_RPC_DISPATCHER: KafkaConsumerTask and RpcDispatcherTask.
FlowControl defines how the data should flow (msgs/s, bytes/s inflight_msgs).
KafkaConsumerTask is populated for job that is involves Kafka Consumption. Specifically, this is non-null for: - JOB_TYPE_KAFKA_CONSUMER_TO_RPC_DISPATCHER
RpcDispatcherTask is populated for job that is involves RPC dispatching. Specifically, this is non null for: - JOB_TYPE_KAFKA_CONSUMER_TO_RPC_DISPATCHER
SecurityConfig is populated for job that intends to use message security feature It contains service identity that will be used for authz check. It also stores the flag which decides if the job should be run securely.
RetryConfig is populated for job that involves one or more retry queues. It contains instructions on entry conditions for retry queues. It also stores the flag controlling if this feature is turned on or not, and how the retry count is calculated.
KafkaDispatcherTask is populated for job that involves Kafka replication. Specifically, this is non-null for: - JOB_TYPE_KAFKA_REPLICATION and - JOB_TYPE_LOAD_GEN_PRODUCE
MiscConfig contains the non-work-related, miscellaneous configs of a job
Audit task is populated for job that involves auditing in Uatu SLA monitor. Whenever audit task is populated, the job type would be set to JOB_TYPE_KAFKA_AUDIT
ResqConfig is populated for a job's resilience configuration It contains resilience queue configuration and a flag controlling if resilience queue should be enabled or not
AvailabilityTask should be populated for Kafka Availability jobs
ReplicationTask should be populated for Kafka Replication/Ingestion jobs
The extensible field, used for 3rdParty application
Used in: , , ,
Job group id is a unique id for this job group. We use string b/c we want the znode to be /jobgroup/<string> in order to leverage zookeeper optimistic locking to ensure uniqueness of logical job group.
JobType is an enumeration for the type of job to be run. This allows the master-worker protocol to generalize to multiple types of workload that needs sharding. JobType shall be used to determine the set of valid tasks that contains specific information about the job. The mapping of JobType to Tasks is: - JOB_TYPE_KAFKA_CONSUMER_TO_RPC_DISPATCHER: KafkaConsumerTask and RpcDispatcherTask.
Flow defines how the data should flow (msgs/s, bytes/s inflight_msgs).
KafkaConsumerTaskGroup is populated for job that is involves Kafka Consumption. Specifically, this is non-null for: - JOB_TYPE_KAFKA_CONSUMER_TO_RPC_DISPATCHER
RpcDispatcherTaskGroup is populated for job that is involves RPC dispatching. Specifically, this is non null for: - JOB_TYPE_KAFKA_CONSUMER_TO_RPC_DISPATCHER
SecurityConfig is populated for job that intends to use message security feature. It contains service identity that will be used for authz check. It also stores the flag which decides if the job should be run securely.
RetryConfig is populated for job that involves one or more retry queues. It contains instructions on entry conditions for retry queues. It also stores the flag controlling if this feature is turned on or not, and how the retry count is calculated.
KafkaDispatcherTaskGroup is populated for job that involves Kafka produce Specifically, this is non-null for: - JOB_TYPE_KAFKA_REPLICATION and - JOB_TYPE_LOAD_GEN_PRODUCE
MiscConfig contains the miscellaneous configs of a jobGroup
Audit task is populated for job that involves auditing in Uatu SLA monitor. Whenever audit task is populated, the job type would be set to JOB_TYPE_KAFKA_AUDIT
ResqConfig is populated for a job's resilience configuration It contains resilience queue configuration and a flag controlling if resilience queue should be enabled or not
AvailabilityTaskGroup is populated for jobs related to Kafka Availability service Its job type should be JOB_TYPE_KAFKA_AVAILABILITY when populated
ReplicationTaskGroup is populated for job groups that involve Kafka replication/ingestion Its job type should be JOB_TYPE_KAFKA_REPLICATION when populated
The extensible field, used for 3rdParty application
Used in:
cluster to read from.
topic to read from.
consumer_group to read on behalf of and/or checkpoint for.
scale state snapshots
JobSnapshot is an aggregated view of the job from both the master and worker's perspective.
Job is the expected definition/configuration for this job from the master's perspective.
JobStatus is the last reported configuration of the job from the worker's perspective.
JobState is the current state of the worker. If you add or remove any state, please update the matrix in master_worker_service.proto and CommandListBuilder.java.
Used in: , , , , ,
0 enum must be invalid per t.uber.com/protobuf-style
UNIMPLEMENTED signals that the command or job type is not supported by this worker.
FAILED signals a worker side failure of the job. A worker may determine that a job is failed independent of any command issued by the master. This is the ONLY JobState the worker may determine independently of a COMMAND from the master. All other JobStates must be in response to a COMMAND from the master. This is a terminal state.
RUNNING is used for jobs that actively running in a stable state.
CANCELED is used for jobs for which COMMAND_TYPE_CANCEL was received by master. This is a terminal state. A canceled job does not necessarily imply cancelation due to failure.
JobStatus is used by the worker to report the current status of job it was assigned.
Used in: , ,
Job that is registered.
JobState is the current state of the job. See comments above each enumeration for the description of each JobState.
Consumer Task Status contains task state when job_type = JOB_TYPE_KAFKA_CONSUMER*.
Dispatcher Task Status contains task state when job_type = JOB_TYPE_LOAD_GEN_PRODUCE
JobType is an enumeration for the type of job to be run. This allows the master-worker protocol to generalize to multiple types of workload that needs sharding.
Used in: ,
0 enum must be invalid per t.uber.com/protobuf-style
KAFKA_CONSUMER_TO_RPC_DISPATHCER is a job item that should consume from Kafka and dispatch to RPC. This is used by Consumer Proxy.
KAFKA_AUDIT is a job that consumes messages or other metadata from Kafka for auditing
KAFKA_REPLICATION is a job item that should consume from one Kafka queue and produce to another queue. This is used by the Replication Service.
Load generator producer job to produce records to the broker for stress/spike test
Load generator consumer job to consume records from the broker for stress/spike test
Indicates a Kafka Availability job
KafkaConsumerTask is a specification for a Kafka Consumption task.
Used in:
cluster to read from.
topic to read from.
partition to read from.
consumer_group to read on behalf of and/or checkpoint for.
the auto offset reset policy.
start_offset to start at when reading. 1. When start_offset >= 0, the consumer tries to read from this offset. If iet does not exist on the Kafka server, then use auto_offset_reset_policy to reset the starting offset. 2. When start_offset < 0, the consumer tries to read from last committed offset. If it does not exist on the Kafka server, then use auto_offset_reset_policy to reset the starting offset.
end_offset to stop at when reading. end_offset follows Kafka zero-offset semantics so actually refers to the first offset to **not** consume. For example, if end_offset = 100, then the last offset to read and process is 99. 0 for unbounded consumption.
a delay processing time for the kafka topic. This is a configuration for the original topic. for retry topics, use processing_delay_ms in RetryConfig.
isolation level could be read_uncommitted or read_committed, default read_uncommitted
Auditing related metadata. It will be set if the job type is `JOB_TYPE_KAFKA_AUDIT`
committed_offset is the committed offset of a consumer group to a topic
KafkaConsumerTaskGroup is a specification for a Kafka Consumption Group task.
Used in:
cluster to read from.
topic to read from.
consumer_group to read on behalf of and/or checkpoint for.
the auto offset reset policy.
start_timestamp to start at when reading. 1. When start_timestamp >= 0, the consumer tries to read from the earliest offset whose timestamp is greater than or equal to the start_timestamp. If it does not exist on the Kafka server, then use auto_offset_reset_policy to reset the starting offset. 2. When start_timestamp < 0, the consumer tries to read from last committed offset. If it does not exist on the Kafka server, then use auto_offset_reset_policy to reset the starting offset.
end_timestamp to stop at when reading. end_timestamp follows Kafka zero-offset semantics so actually refers to the first timestamp to **not** consume.
a delay processing time for the kafka topic. This is a configuration for the original topic. for retry topics, use processing_delay_ms in RetryConfig.
isolation level could be read_uncommitted or read_committed, default read_uncommitted
Auditing related metadata. It will be set if the job type is `JOB_TYPE_KAFKA_AUDIT`
start/end offset for each partition. The partition_offset_ranges, if available, will make the controller ignore the start_timestamp and end_timestamp. That means only the partitions in the partition_offset_ranges will be consumed. New partitions after expansion will not be consumed either.
KafkaConsumerTaskStatus represents the state of a consumer task.
Used in:
Read offset, following Kafka conventions, is the next offset to be read.
Commit offset, following Kafka convention, is the next offset to be committed.
number of messages per second delivered.
number of bytes per second delivered.
deprecated, use total_messages_inflight instead
deprecated, use total_bytes_inflight instead
number of messages inflight to be processed
number of bytes of messages inflight to be processed
computed cpu usage, in terms of percentage per core
KafkaDispatcherTask is a specification for a Kafka dispatcher task.
Used in:
cluster to produce to.
topic to produce to.
whether deduplication with uDeduplify is enabled or not.
partition to produce to.
whether to produce securely
true when acks=1/lossy, false when acks=all/lossless
optional encoded format information
Used in:
cluster to produce to
topic to produce to
whether deduplication with uDeduplify is enabled or not.
whether to produce securely
true when acks=1/lossy, false when acks=all/lossless
optional encoded format information
KafkaDispatcherTaskStatus represents the state of the dispatcher task.
Used in:
MiscConfig contains the miscellaneous configs of a jobGroup/job
Used in: ,
enables extra logging for debugging purpose
the service name which owns this consumer
enables job scale reset based on quota. If enabled, each flow control quota update will reset the job scale based on the quota values, otherwise quota update will not reset the job scale.
Node identifies a member of a cluster.
Used in: ,
id is a UUID assigned to each node by the master.
host name for the node.
port for the node if it is reachable over the network. This may be 0 to indicate if it is unset.
zone where the node is located
Participants is a master-worker pair of participants. Participants is included in all master-worker requests so that both parties are clear about who they are communicating and the Node id can be used to as a fencing mechanism.
Used in: , , ,
PartitionOffsetRange is a specification for a single partition offset range.
Used in:
the partition index
the start offset of the partition
the end offset of the partition
PartitionOffsetRanges is a specification for a set of partition offset ranges.
Used in:
start/end offset for each partition
Represents specific audit configurations for auditing replication pipeline
Used in:
ReplicationTask is the task spec for Kafka Replication/Ingestion jobs
Used in:
whether the source end_offset should be ignored and keep running continuously
ReplicationTaskGroup is a task group spec for Kafka Replication/Ingestion
Used in:
whether the source end_offset should be ignored and keep running continuously
ResqConfig configures the underlying resilience queue for a topic in the consumer
Used in: ,
the resilience queue topic name. an empty resq_topic indicates that the resilience queue feature is disabled.
the cluster to find the resilience queue topic on.
Optional to specify flow control for resilience queue topic If left unspecified, resilience queue will inherit flow control from main topic
whether the resilience queue is enabled or not
whether the resilience queue uses acks=1 producer or not
Used in:
RetryConfig configures the retry policy for retriable errors. It's the updated version of RetryConfig(see below).
Used in: ,
a list of retry queues
whether the whole policy is enabled or not;
RetryQueue configures one retry queue in a set of retry queues
Used in:
retry queue topic. when the recipient service indicates the consumer proxy to retry a message, the message should be produced to the retry queue topic. an empty retry queue topic indicates that it is disabled.
the cluster to write the retry_queue_topic to.
a user configurable delay that is applied to redelivering of retried requests. when retry topic is enabled, the retry delay must fail into [0, 86400000]. i.e, 0ms ~ 1day.
The max retry of the retry queue
RpcDispatcherTask is a specification for a Rpc Dispatcher task.
Used in:
uri for resolving the destination service that will receive RPC push messages. We support a subset of standard Uber URI schemes from dev-platform/frameworks/jfx/library/grpc/client/src/main/java/com/uber/jfx/grpc/GrpcChannelBuilder.java#L56: 1. muttley://muttley-routing-key[@service-name] (this is a KCP internal format which is different from standard Muttley format)
This indicates the procedure name that is used to identify the handler on the callee server. e.g., kafka.consumerproxy.consumer_group/topic.
when a rpc call take more than rpc_time_out_ms to finish, it is considered failed.
DEPRECATED. Use retry_queue_topic in RetryConfig instead.
DEPRECATED. Use retry_cluster in RetryConfig instead.
dlq topic. when the recipient service indicates the consumer proxy to stash a message, the message should be produced to the dlq topic. an empty dlq topic indicates that it is disabled.
the cluster to write the dlq_topic to.
when rpc timeout times exceeds the limit, send message to DLQ if configured the option should be disabled by default, only enable when consumer stuck with rpc timeout
the max allowed timeout in backoff retry. Even with exponential backoff, the timeout value should not exceed rpc_timeout_limit_ms, if it is configured.
Used in:
uri for resolving the destination service that will receive RPC push messages. We support a subset of standard Uber URI schemes from dev-platform/frameworks/jfx/library/grpc/client/src/main/java/com/uber/jfx/grpc/GrpcChannelBuilder.java#L56: 1. muttley://muttley-routing-key[@service-name] (this is a KCP internal format which is different from standard Muttley format)
This indicates the procedure name that is used to identify the handler on the callee server. e.g., kafka.consumerproxy.consumer_group/topic.
when a rpc call take more than rpc_time_out_ms to finish, it is considered failed.
DEPRECATED, use the retry_queue_topic for each retry queue in RetryConfig instead
DEPRECATED, use the retry_cluster for each retry queue in RetryConfig instead
dlq topic. when the recipient service indicates the consumer proxy to stash a message, the message should be produced to the dlq topic. an empty dlq topic indicates that it is disabled.
the cluster to write the dlq_topic to.
when rpc timeout times exceeds the limit, send message to DLQ if configured the option should be disabled by default, only enable when consumer stuck with rpc timeout
the max allowed timeout in backoff retry. Even with exponential backoff, the timeout value should not exceed rpc_timeout_limit_ms, if it is configured.
Used in:
Used in:
scale computers for up/down/hibernate/bootstrap
scale status of job group
Used in: , ,
scale of the job group which indicates number of works needed
the combined messages per second of all the jobs in the job group
the combined bytes per second of all the jobs in the job group
SecurityConfig stores details of the user service identities. It also holds the flag which is used to decide if a job will be run securely.
Used in: ,
service_identities will store the SPIFFE Id(principal name) of the user service this will be used to check if the user has the necessary permissions to consume from a topic
is_secure flag will be used to decide if the job should be run securely the job will still be run unsecured(normal flow) if identity is provided but this flag is set to false
the flag which determines if the job is multi-tenancy enabled
StoredJob is the internal representation of job within storage.
Used in: , ,
The last updated timestamp for this record.
Job information.
The expected state of the job.
The exepcted worker id for this job.
scale of the job
this indicates the pod that the job consumes from
JobGroup is a grouping of jobs that represent a single logical resource. In Kafka, JobGroup -> topic and Job -> topic-partition.
Used in: , , ,
The last updated timestamp for this record.
The grouped job provides the aggregate expected state for the job group. Note: the partition and job_id fields within the aggregate_job are unusued and must always be set to 0 to indicate unuse.
state of the job group.
The specific (partitioned) job for this job group. Implementations should guarantee uniqueness of jobs.
scale status of job group for autoScaler
StoredJobStatus is the internal representation of JobStatus report from worker
Used in:
The last updated timestamp for this record.
The status of the job as reported by the worker in the last heartbeat.
The id for the worker current working on this job.
StoreWorker is the internal representation of a worker on the master within storage. We choose to use protobuf encoded Worker so that schema evolution for data written to storage can be seamlessly handled between master upgrades. This shall only be used internally in the master's implementation and shall not be exposed to the worker.
Used in:
The last updated timestamp for this record.
The node information for this worker.
The state of this worker.
TopicInfo represents information about a topic
Used in:
Cluster name
Topic name
TopicsToCompare represents the source(LHS) and the destination(RHS) topics that must be compared against
Used in: ,
List of source topics / clusters - LHS
List of destination topics / clusters - RHS
Used in:
Used in:
WorkerState is the state of the worker.
Used in:
0 enum must be invalid per t.uber.com/protobuf-style
REGISTERING state represents the a worker node that has/is sending RegisterWorker, but has yet to send Heartbeat.
WORKING state represents workers that has/is stably sending Heartbeat.