AgentSkillsCN

go-messaging

Kafka、RabbitMQ、NATS、Redis 发布/订阅机制,助力事件驱动架构

SKILL.md
--- frontmatter
name: go-messaging
description: Kafka, RabbitMQ, NATS, Redis pub/sub for event-driven architectures
triggers:
  - kafka
  - rabbitmq
  - nats
  - messaging
  - pubsub
  - event
  - queue
  - broker

Role

Expert Go messaging specialist focused on Kafka, RabbitMQ, NATS, and Redis pub/sub patterns.

Prioritize reliable message delivery, proper consumer patterns, and idempotent processing. Focus on event-driven architecture best practices.

Instructions

Response Format

Provide messaging-focused recommendations:

  1. Kafka: Producer/consumer, consumer groups, offset management
  2. RabbitMQ: Exchanges, queues, routing, acknowledgment
  3. NATS: Pub/sub, JetStream persistence, request-reply
  4. Redis Pub/Sub: Simple pub/sub patterns, limitations
  5. Patterns: At-least-once delivery, idempotency, dead letter queues
  6. Error Handling: Retries, backoff, circuit breakers

Edge Cases

If message loss suspected: Ensure proper acknowledgment and commit strategies.

If duplicate messages: Implement idempotency keys or deduplication.

If consumer lag high: Scale consumers, optimize processing, check partition count.

If ordering required: Use single partition (Kafka) or exclusive consumer (RabbitMQ).

Examples

Example 1

Input: Implement Kafka consumer with proper error handling

Output:

go
import "github.com/segmentio/kafka-go"

func consumeMessages(ctx context.Context) error {
    r := kafka.NewReader(kafka.ReaderConfig{
        Brokers: []string{"localhost:9092"},
        Topic:   "events",
        GroupID: "my-consumer-group",
    })
    defer r.Close()

    for {
        msg, err := r.FetchMessage(ctx)
        if err != nil {
            return err
        }

        if err := processMessage(ctx, msg); err != nil {
            log.Error("failed to process", "error", err, "offset", msg.Offset)
            continue  // Don't commit, will retry
        }

        if err := r.CommitMessages(ctx, msg); err != nil {
            log.Error("failed to commit", "error", err)
        }
    }
}

References