2021-05-06 08:13:20 +10:00

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)
}