Advanced Context Usage
Custom Context Implementation
Creating a Custom Context
type CustomContext struct {
context.Context
timeout time.Duration
logger *log.Logger
}
func NewCustomContext(parent context.Context, timeout time.Duration) *CustomContext {
return &CustomContext{
Context: parent,
timeout: timeout,
logger: log.New(os.Stdout, "CustomContext: ", log.LstdFlags),
}
}
func (c *CustomContext) Deadline() (deadline time.Time, ok bool) {
return time.Now().Add(c.timeout), true
}
Context-Aware Error Handling
Error Propagation Patterns
func processRequest(ctx context.Context) error {
select {
case <-ctx.Done():
return fmt.Errorf("request cancelled: %w", ctx.Err())
default:
// Normal processing
return nil
}
}
Distributed Tracing with Context
graph LR
A[Client Request] --> B[Trace Context]
B --> C[Service 1]
C --> D[Service 2]
D --> E[Service 3]
E --> F[Response]
Tracing Context Example
func instrumentedRequest(ctx context.Context) {
// Generate trace ID
traceID := uuid.New()
ctx = context.WithValue(ctx, "traceID", traceID)
// Propagate trace context
span := opentracing.StartSpanFromContext(ctx, "operation")
defer span.Finish()
// Add metadata to span
span.SetTag("user_id", getUserID(ctx))
}
Context Performance Considerations
Technique |
Performance Impact |
Use Case |
Shallow Context |
Low Overhead |
Simple Cancellation |
Deep Context |
Higher Overhead |
Complex Tracing |
Pooled Context |
Optimized |
High-Performance Apps |
Advanced Cancellation Patterns
func complexOperation(ctx context.Context) error {
// Create a cancellable context with timeout
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
// Create a channel for graceful shutdown
done := make(chan struct{})
go func() {
defer close(done)
// Long-running task
for {
select {
case <-ctx.Done():
return
default:
// Perform work
}
}
}()
// Wait for completion or cancellation
select {
case <-done:
return nil
case <-ctx.Done():
return ctx.Err()
}
}
Context in Microservices
graph TD
A[Request Enters] --> B[Context Initialized]
B --> C{Service 1}
C --> |Propagate Context| D{Service 2}
D --> |Propagate Context| E{Service 3}
E --> F[Final Response]
Advanced Techniques
- Context-aware rate limiting
- Dynamic timeout adjustment
- Cross-service context propagation
- Contextual logging and monitoring
- Minimize context depth
- Use context pools
- Implement lazy evaluation
- Avoid unnecessary context copying
Note: Mastering advanced context techniques is crucial for building high-performance, scalable applications in the LabEx ecosystem.