refactor(monitoring): consolidate workers and extract to scheduler process

Remove standalone lease-recovery, received-inspection, and result-recovery
workers from tenant-api (now handled by scheduler process). Add configurable
concurrency to ingest and projection-rebuild workers via MonitoringWorkers
runtime config. Extract shared runtime types for worker configuration.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-15 14:19:57 +08:00
parent 3f5b5c1e01
commit e8f48c6d37
12 changed files with 161 additions and 450 deletions
@@ -254,6 +254,8 @@ type monitoringTaskResultQueueMetaPatch struct {
LastQueuePublishError *string `json:"last_queue_publish_error"`
}
type MonitoringTaskResultQueueMetaPatch = monitoringTaskResultQueueMetaPatch
func (s *MonitoringCallbackService) HandleTaskResult(ctx context.Context, installationID int64, installationToken string, taskID int64, req MonitoringTaskResultRequest) (*MonitoringTaskResultResponse, error) {
installation, err := s.authenticateInstallation(ctx, installationID, installationToken)
if err != nil {
@@ -1733,6 +1735,10 @@ func (s *MonitoringCallbackService) publishTaskResultEnvelope(ctx context.Contex
return nil
}
func (s *MonitoringCallbackService) PublishTaskResultEnvelope(ctx context.Context, payload []byte) error {
return s.publishTaskResultEnvelope(ctx, payload)
}
func (s *MonitoringCallbackService) tryPatchTaskResultQueueMeta(taskID int64, receivedAt time.Time, patch monitoringTaskResultQueueMetaPatch) {
if s == nil || s.monitoringPool == nil {
return
@@ -1766,6 +1772,10 @@ func (s *MonitoringCallbackService) tryPatchTaskResultQueueMeta(taskID int64, re
}
}
func (s *MonitoringCallbackService) PatchTaskResultQueueMeta(taskID int64, receivedAt time.Time, patch MonitoringTaskResultQueueMetaPatch) {
s.tryPatchTaskResultQueueMeta(taskID, receivedAt, patch)
}
func buildMonitoringRawPayload(req MonitoringTaskResultRequest) ([]byte, []MonitoringSourceItem) {
payload := make(map[string]interface{}, len(req.RawResponseJSON)+4)
for key, value := range req.RawResponseJSON {
@@ -2237,6 +2247,11 @@ func optionalString(value string) *string {
return &text
}
func ValidateMonitoringTaskResultEnvelope(payload []byte) error {
_, err := decodeMonitoringTaskResultEnvelope(payload)
return err
}
func monitoringStringValue(value *string) string {
if value == nil {
return ""