mirror of
https://github.com/marcel-dempers/docker-development-youtube-series.git
synced 2025-06-04 16:56:56 +00:00
78 lines
1.9 KiB
Go
78 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"github.com/julienschmidt/httprouter"
|
|
log "github.com/sirupsen/logrus"
|
|
"os"
|
|
"strings"
|
|
"strconv"
|
|
"gopkg.in/Shopify/sarama.v1"
|
|
)
|
|
|
|
var kafkaBrokers = os.Getenv("KAFKA_PEERS")
|
|
var kafkaTopic = os.Getenv("KAFKA_TOPIC")
|
|
var kafkaPartition = os.Getenv("KAFKA_PARTITION")
|
|
var partition int32 = -1
|
|
var globalProducer sarama.SyncProducer
|
|
|
|
func main() {
|
|
|
|
config := sarama.NewConfig()
|
|
config.Producer.RequiredAcks = sarama.WaitForAll
|
|
config.Producer.Return.Successes = true
|
|
config.Producer.Partitioner = sarama.NewRandomPartitioner
|
|
p, err := strconv.Atoi(kafkaPartition)
|
|
|
|
if err != nil {
|
|
fmt.Println("Failed to convert KAFKA_PARTITION to Int32")
|
|
panic(err)
|
|
}
|
|
|
|
partition = int32(p)
|
|
|
|
producer, err := sarama.NewSyncProducer(strings.Split(kafkaBrokers, ","), config)
|
|
if err != nil {
|
|
fmt.Printf("Failed to open Kafka producer: %s", err)
|
|
panic(err)
|
|
}
|
|
|
|
globalProducer = producer
|
|
|
|
defer func() {
|
|
fmt.Println("Closing Kafka producer...")
|
|
if err := globalProducer.Close(); err != nil {
|
|
fmt.Printf("Failed to close Kafka producer cleanly: %s", err)
|
|
panic(err)
|
|
}
|
|
}()
|
|
|
|
router := httprouter.New()
|
|
|
|
router.POST("/publish/:message", func(w http.ResponseWriter, r *http.Request, p httprouter.Params){
|
|
submit(w,r,p)
|
|
})
|
|
|
|
fmt.Println("Running...")
|
|
log.Fatal(http.ListenAndServe(":80", router))
|
|
}
|
|
|
|
func submit(writer http.ResponseWriter, request *http.Request, p httprouter.Params) {
|
|
|
|
messageValue := p.ByName("message")
|
|
message := &sarama.ProducerMessage{Topic: kafkaTopic, Partition: partition }
|
|
message.Value = sarama.StringEncoder(messageValue)
|
|
|
|
fmt.Println("Received message: " + messageValue)
|
|
|
|
partition, offset, err := globalProducer.SendMessage(message)
|
|
|
|
if err != nil {
|
|
log.Fatalf("%s: %s", "Failed to connect to Kafka", err)
|
|
}
|
|
|
|
fmt.Printf("publish success! topic=%s\tpartition=%d\toffset=%d\n", kafkaTopic, partition, offset)
|
|
|
|
}
|