gRPC API
TaskDaemon provides a gRPC API for high-performance clients.Connection
Copy
localhost:50051
Proto Definition
Copy
syntax = "proto3";
package taskdaemon;
service TaskDaemon {
rpc QueueTask(QueueTaskRequest) returns (QueueTaskResponse);
rpc GetTask(GetTaskRequest) returns (Task);
rpc ListTasks(ListTasksRequest) returns (ListTasksResponse);
rpc DeleteTask(DeleteTaskRequest) returns (DeleteTaskResponse);
rpc RedriveTask(RedriveTaskRequest) returns (Task);
rpc HealthCheck(HealthCheckRequest) returns (HealthCheckResponse);
}
message QueueTaskRequest {
string task_type = 1;
string task_data_json = 2;
}
message QueueTaskResponse {
string task_id = 1;
}
message GetTaskRequest {
string task_id = 1;
}
message Task {
string id = 1;
string task_type = 2;
string status = 3;
string task_data_json = 4;
string result_json = 5;
string error = 6;
int32 retry_count = 7;
string created_at = 8;
string updated_at = 9;
}
message ListTasksRequest {
int32 limit = 1;
string status = 2;
}
message ListTasksResponse {
repeated Task tasks = 1;
}
message DeleteTaskRequest {
string task_id = 1;
}
message DeleteTaskResponse {
bool deleted = 1;
}
message RedriveTaskRequest {
string task_id = 1;
}
message HealthCheckRequest {}
message HealthCheckResponse {
string status = 1;
int32 queue_size = 2;
int32 workers = 3;
}
Client Examples
Python
Copy
import grpc
import taskdaemon_pb2
import taskdaemon_pb2_grpc
import json
channel = grpc.insecure_channel('localhost:50051')
stub = taskdaemon_pb2_grpc.TaskDaemonStub(channel)
# Queue task
response = stub.QueueTask(taskdaemon_pb2.QueueTaskRequest(
task_type="resize",
task_data_json=json.dumps({"url": "https://example.com/image.jpg"})
))
print(f"Task ID: {response.task_id}")
# Get task
task = stub.GetTask(taskdaemon_pb2.GetTaskRequest(task_id=response.task_id))
print(f"Status: {task.status}")
Go
Copy
package main
import (
"context"
"encoding/json"
"log"
pb "github.com/your/taskdaemon/proto"
"google.golang.org/grpc"
)
func main() {
conn, _ := grpc.Dial("localhost:50051", grpc.WithInsecure())
defer conn.Close()
client := pb.NewTaskDaemonClient(conn)
// Queue task
data, _ := json.Marshal(map[string]any{"url": "https://example.com/image.jpg"})
resp, _ := client.QueueTask(context.Background(), &pb.QueueTaskRequest{
TaskType: "resize",
TaskDataJson: string(data),
})
log.Printf("Task ID: %s", resp.TaskId)
// Get task
task, _ := client.GetTask(context.Background(), &pb.GetTaskRequest{
TaskId: resp.TaskId,
})
log.Printf("Status: %s", task.Status)
}
Node.js
Copy
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
const packageDefinition = protoLoader.loadSync('taskdaemon.proto');
const proto = grpc.loadPackageDefinition(packageDefinition).taskdaemon;
const client = new proto.TaskDaemon('localhost:50051', grpc.credentials.createInsecure());
// Queue task
client.QueueTask({
task_type: 'resize',
task_data_json: JSON.stringify({ url: 'https://example.com/image.jpg' })
}, (err, response) => {
console.log('Task ID:', response.task_id);
});
Reflection
gRPC reflection is enabled for tools likegrpcurl:
Copy
# List services
grpcurl -plaintext localhost:50051 list
# Describe service
grpcurl -plaintext localhost:50051 describe taskdaemon.TaskDaemon
# Queue task
grpcurl -plaintext -d '{"task_type": "echo", "task_data_json": "{\"msg\": \"hello\"}"}' \
localhost:50051 taskdaemon.TaskDaemon/QueueTask
When to Use gRPC
Use gRPC over HTTP when:- Building high-throughput internal services
- Need streaming (future feature)
- Using strongly-typed clients
- Performance is critical
- Quick testing with curl
- Browser-based clients
- Simpler integration needs