https://github.com/restuwahyu13/golang-kafka-rcp
Example kafka rpc pattern using messaging pattern (Request & Reply)
https://github.com/restuwahyu13/golang-kafka-rcp
golang kafka rpc
Last synced: 4 months ago
JSON representation
Example kafka rpc pattern using messaging pattern (Request & Reply)
- Host: GitHub
- URL: https://github.com/restuwahyu13/golang-kafka-rcp
- Owner: restuwahyu13
- Created: 2023-07-01T06:18:59.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2023-07-01T12:02:59.000Z (almost 2 years ago)
- Last Synced: 2025-01-03T17:51:33.389Z (5 months ago)
- Topics: golang, kafka, rpc
- Language: Go
- Homepage:
- Size: 15.6 KB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# KAFKA RPC (Request & Reply Pattern)
if you need tutorial about kafka check my repo [here](https://github.com/restuwahyu13/node-kafka), in reallife kafka not support messaging rpc pattern, because kafka only support messaging pattern like pub sub, so i manipulated kafka to apply the concept of the rpc pattern like you use rabbitmq but not perfect.
## Server RPC
```go
package mainimport (
"context"
"encoding/json"
"log"
"os"
"os/signal"
"syscall"
"time""github.com/jaswdr/faker"
"github.com/lithammer/shortuuid"
"github.com/restuwahyu13/go-kafka-rpc/pkg"
"github.com/segmentio/kafka-go"
)type Person struct {
ID string `json:"id"`
Name string `json:"name"`
Country string `json:"country"`
City string `json:"city"`
PostCode string `json:"postcode"`
}func main() {
var (
topic string = "account"
groupId string = "account-groupId"
broker pkg.InterfaceKafka = pkg.NewKafka(context.Background())
fk faker.Faker = faker.New()
person Person = Person{}
)go broker.ConsumerRpc(topic, groupId, func(message kafka.Message) ([]byte, error) {
person.ID = shortuuid.New()
person.Name = fk.App().Name()
person.Country = fk.Address().Country()
person.City = fk.Address().City()
person.PostCode = fk.Address().PostCode()personByte, err := json.Marshal(&person)
if err != nil {
return nil, err
}return personByte, nil
})signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, syscall.SIGHUP, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGALRM)for {
select {
case sigs := <-signalChan:
log.Printf("Received Signal %s", sigs.String())
os.Exit(15)
break
default:
time.Sleep(time.Duration(time.Second * 3))
log.Println("...........................")
break
}
}
}
```## Client RPC
```go
package mainimport (
"context"
"fmt"
"log""github.com/jaswdr/faker"
"github.com/lithammer/shortuuid"
"github.com/restuwahyu13/go-kafka-rpc/pkg"
)type Person struct {
ID string `json:"id"`
Name string `json:"name"`
Country string `json:"country"`
City string `json:"city"`
PostCode string `json:"postcode"`
}func main() {
var (
topic string = "account"
broker pkg.InterfaceKafka = pkg.NewKafka(context.Background())
fk faker.Faker = faker.New()
)message, err := broker.PublishRpc(topic, &Person{
ID: shortuuid.New(),
Name: fk.App().Name(),
Country: fk.Address().Country(),
City: fk.Address().City(),
PostCode: fk.Address().PostCode(),
})if err != nil {
log.Fatal(err.Error())
}fmt.Println("RPC Result: ", string(message.Value))
}
```