uber / uber/submitqueue

submitqueue: port internal queue contracts to proto (submitqueue/core/messagequeue)

Đang mở
#356 1 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Ngôn ngữ chính
Go
Star
225
Fork
11
Merge trung bình
3 ngày 8 giờ
Pull request đã merge (30 ngày)
61

Mô tả

Problem

The repo's queue-contract convention (doc/rfc/messagequeue-contract.md) is proto3 payloads serialized as protojson, with a contract package owning both the messages and their topic_keys bindings — api/runway/messagequeue/ is the reference example and stovepipe/core/messagequeue/ follows it. The submitqueue domain has not been ported: there is no submitqueue/core/messagequeue/ package, and 11 of its 12 topics still carry hand-rolled JSON via ToBytes/FromBytes methods on entity types.

Current state per topic:

Topic key Payload Serialization
start RequestID entity JSON
cancel CancelRequest entity JSON
validate RequestID entity JSON
batch RequestID entity JSON
score BatchID entity JSON
speculate BatchID entity JSON
prioritize QueueID entity JSON
build BatchID entity JSON
buildsignal BuildID entity JSON
conclude BatchID entity JSON
log RequestLog entity JSON
merge MergeRequest ✅ protojson (api/runway/messagequeue — correctly borrowed; runway owns that queue's contract)

Consequences of the split: no additive-evolution guarantees (protojson's unknown-field discard, UPPER_SNAKE enums, int64-as-string are only enforced on merge), no topic_keys binding or contract test for internal topics, and queue-payload serialization concerns living on domain entities (which are supposed to be pure data).

Work

  1. Create submitqueue/core/messagequeue/ mirroring the reference layout: proto/ sources, committed protopb/, and the generic protojson glue (Marshal / Unmarshal[T] / TopicKeys) — same as stovepipe/core/messagequeue/.
  2. Define proto messages for each payload shape (request-ID carrier, batch-ID carrier, build-ID carrier, queue-ID carrier, cancel request, request log) and bind each topic key to its message via the topic_keys option from api/base/messagequeue.
  3. Add the contract test: protojson round-trip per message + every topic key bound to exactly one message.
  4. Migrate producers and consumers topic by topic (gateway Land/Cancel publishes, all orchestrator stage controllers, core/request.PublishLog, and the DLQ controllers/republish tooling — anything touching msg.Payload).
  5. Once no queue payload uses them, remove ToBytes/FromBytes from the submitqueue entity types (RequestID, BatchID, BuildID, QueueID, CancelRequest, RequestLog, and the full-entity variants) so entities go back to being pure data.
  6. Bazel visibility stays domain-scoped per the internal-contract rule.

Caveats

  • Wire-format flip: protojson output (snake_case fields, int64-as-string) differs from the current encoding/json entity output, so in-flight messages from before a cutover won't parse after it. Port topic-by-topic with drained queues (fine at the current pre-prod stage), or give consumers a transitional dual-format read if needed.
  • The log topic crosses gateway ↔ orchestrator but both are submitqueue-domain services, so the internal contract location (submitqueue/core/messagequeue/) is correct — it must not go under api/.
  • The message-ID convention is a separate concern tracked in #352 (intent-scoped message IDs); porting payloads to proto neither depends on nor resolves it, but call sites will be touched by both — coordinate to avoid churn.

Related

  • #352 — intent-scoped message IDs (same call sites)
  • #357 — stovepipe counterpart (retire leftover JSON serializers, contracts for upcoming stages)

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Bắt đầu với doc/rfc/messagequeue-contract.md và so sánh api/runway/messagequeue/ với stovepipe/core/messagequeue/. Lập bản đồ mười hai chủ đề giữa gateway Land/Cancel, các stage controllers của orchestrator, core/request.PublishLog, cùng các bộ điều khiển DLQ và tooling republish. Được xem là hoàn tất khi submitqueue/core/messagequeue/ có các proto contracts, protopb được tạo, glue, bindings và contract tests, tất cả payload users đã được migrate, và các entity serializers được liệt kê đã bị xóa.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
go
Lĩnh vực
distributed-systems
Loại issue
Tái cấu trúc
Độ khó
5/5
Thời gian dự kiến
Hơn một tuần
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
32/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.