code: func (ctl *Controller) requestJobStateUpdateHandler(c context.Context, payload proto.Message) error {
  	msg := payload.(*tasks.RequestJobStateUpdate)
  
  	// Throttle to once per 2 sec (and make sure it is always in the future). We
  	// rely here on a pretty good (< .5s maximum skew) clock sync on GAE.
  	eta := clock.Now(c).Unix()
  	eta = (eta/2 + 1) * 2
  	dedupKey := fmt.Sprintf("update-job-state-v1:%d:%d", msg.JobId, eta)
  
  	err := ctl.tq().AddTask(c, &tq.Task{
  		DeduplicationKey: dedupKey,
  		Title:            fmt.Sprintf("update:job-%d", msg.JobId),
  		ETA:              time.Unix(eta, 0),
  		Payload:          &tasks.UpdateJobState{JobId: msg.JobId},
  	})
  	return errors.Annotate(err, "when adding UpdateJobState task").Err()
  }
docs: // requestJobStateUpdateHandler is called whenever state of some shard changes.
  //
  // It forwards this notification to the job (specifically updateJobStateHandler)
  // throttling the rate to ~0.5 QPS to avoid overwhelming job's entity group with
  // high write rate.