blob: 76cbb3d4318092548b5143be5cd57a3d5c0b55c3 [file] [log] [blame]
// Copyright 2020 The LUCI Authors.
//
// Licensed 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.
// Package tq provides a task queue implementation on top of Cloud Tasks.
//
// It exposes a high-level API that operates with proto messages and hides
// gory details such as serialization, routing, authentication, etc.
//
// # Transactional tasks
//
// Tasks can be submitted as part of a database transaction. This is controlled
// by Kind field of TaskClass. A transactional task is guaranteed to be
// delivered (at least once) if and only if the database transaction was
// committed successfully. The are some prerequisites for using this mechanism.
//
// First, the sweeper must be running somewhere. The sweeper is responsible for
// discovering tasks that were successfully committed into the database, but
// were failed to be dispatched to Cloud Tasks (for example if the client that
// was submitting the task crashed right after committing the transaction). The
// sweeper can run either as a standalone service (the most convenient option
// for Kubernetes deployments) or as a cron job (the most convenient option for
// Appengine deployments).
//
// Second, the core server/tq library needs to "know" how to talk to the
// database that implements transactions. This is achieved by blank-importing
// a corresponding package.
//
// For Datastore:
//
// import _ "go.chromium.org/luci/server/tq/txn/datastore"
//
// For Spanner:
//
// import _ "go.chromium.org/luci/server/tq/txn/spanner"
//
// The exact location of the import doesn't matter as long as the package is
// present in the import tree of the binary. If your tests use transactional
// tasks, they'll need to import the corresponding packages as well.
//
// # Enabling the sweeper on Appengine
//
// In cron.yaml:
// - url: /internal/tasks/c/sweep
// schedule: every 1 minutes
//
// In queue.yaml:
// - name: tq-sweep
// rate: 500/s
//
// # Using the sweeper with Spanner
//
// You need to Create below tables in your database:
//
// CREATE TABLE TQReminders (
// ID STRING(MAX) NOT NULL,
// FreshUntil TIMESTAMP NOT NULL,
// Payload BYTES(102400) NOT NULL,
// ) PRIMARY KEY (ID ASC);
//
// CREATE TABLE TQLeases (
// SectionID STRING(MAX) NOT NULL,
// LeaseID INT64 NOT NULL,
// SerializedParts ARRAY<STRING(MAX)>,
// ExpiresAt TIMESTAMP NOT NULL,
// ) PRIMARY KEY (SectionID ASC, LeaseID ASC);
package tq