You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							69 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							69 lines
						
					
					
						
							1.7 KiB
						
					
					
				| package main | |
| 
 | |
| import ( | |
| 	"context" | |
| 	"log" | |
| 	"os" | |
| 	"time" | |
| 
 | |
| 	"github.com/segmentio/kafka-go" | |
| ) | |
| 
 | |
| func main() { | |
| 	if len(os.Args) < 3 { | |
| 		log.Fatal("Usage: kafka-go-consumer <broker> <topic>") | |
| 	} | |
| 	broker := os.Args[1] | |
| 	topic := os.Args[2] | |
| 
 | |
| 	log.Printf("Connecting to Kafka broker: %s", broker) | |
| 	log.Printf("Topic: %s", topic) | |
| 
 | |
| 	// Create a new reader | |
| 	r := kafka.NewReader(kafka.ReaderConfig{ | |
| 		Brokers:  []string{broker}, | |
| 		Topic:    topic, | |
| 		GroupID:  "kafka-go-test-group", | |
| 		MinBytes: 1, | |
| 		MaxBytes: 10e6, // 10MB | |
| 		MaxWait:  1 * time.Second, | |
| 	}) | |
| 	defer r.Close() | |
| 
 | |
| 	log.Printf("Starting to consume messages...") | |
| 
 | |
| 	ctx := context.Background() | |
| 	messageCount := 0 | |
| 	errorCount := 0 | |
| 	startTime := time.Now() | |
| 
 | |
| 	for { | |
| 		m, err := r.ReadMessage(ctx) | |
| 		if err != nil { | |
| 			errorCount++ | |
| 			log.Printf("Error reading message #%d: %v", messageCount+1, err) | |
| 
 | |
| 			// Stop after 10 consecutive errors or 60 seconds | |
| 			if errorCount > 10 || time.Since(startTime) > 60*time.Second { | |
| 				log.Printf("\nStopping after %d errors in %v", errorCount, time.Since(startTime)) | |
| 				break | |
| 			} | |
| 			continue | |
| 		} | |
| 
 | |
| 		// Reset error count on successful read | |
| 		errorCount = 0 | |
| 		messageCount++ | |
| 
 | |
| 		log.Printf("Message #%d: topic=%s partition=%d offset=%d key=%s value=%s", | |
| 			messageCount, m.Topic, m.Partition, m.Offset, string(m.Key), string(m.Value)) | |
| 
 | |
| 		// Stop after 100 messages or 60 seconds | |
| 		if messageCount >= 100 || time.Since(startTime) > 60*time.Second { | |
| 			log.Printf("\nSuccessfully consumed %d messages in %v", messageCount, time.Since(startTime)) | |
| 			log.Printf("Success rate: %.1f%% (%d/%d including errors)", | |
| 				float64(messageCount)/float64(messageCount+errorCount)*100, messageCount, messageCount+errorCount) | |
| 			break | |
| 		} | |
| 	} | |
| }
 |