Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/romaixn/gosumer
⚡ Improve your application's performance by consuming your Symfony Messenger messages with Go.
https://github.com/romaixn/gosumer
golang messenger performance symfony symfony-messenger
Last synced: about 2 months ago
JSON representation
⚡ Improve your application's performance by consuming your Symfony Messenger messages with Go.
- Host: GitHub
- URL: https://github.com/romaixn/gosumer
- Owner: Romaixn
- License: agpl-3.0
- Created: 2023-06-20T08:44:16.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-03-18T13:12:37.000Z (9 months ago)
- Last Synced: 2024-05-01T18:15:17.746Z (8 months ago)
- Topics: golang, messenger, performance, symfony, symfony-messenger
- Language: Go
- Homepage: https://rherault.dev/articles/gosumer
- Size: 127 KB
- Stars: 45
- Watchers: 3
- Forks: 5
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# Gosumer
⚡ Improve your application's performance by consuming your Symfony Messenger messages with Go.
## ✨ Features
- Consume your messages directly with Go code
- PostgreSQL support
- AMQP support
- Redis support## Installation
Install gosumer with Go```bash
go get github.com/romaixn/gosumer
```## ⚙️ Configuration
### PostgreSQL
Add this to your `config/packages/messenger.yaml`:
```yaml
framework:
messenger:
transports:
go: # Add this new transport
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
serializer: 'messenger.transport.symfony_serializer' # Required, https://symfony.com/doc/current/messenger.html#serializing-messages
options:
use_notify: true
check_delayed_interval: 60000
queue_name: go # Required, used to only get right messages in go side
retry_strategy:
max_retries: 3
multiplier: 2
```Don't forget to specify in the `routing` part the message to process in Go
### RabbitMQ
Create an env variable to create a custom queue (in this example `go` is the name of the queue):
```
RABBITMQ_GO_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/go
```And use it in `config/packages/messenger.yaml`:
```yaml
framework:
messenger:
transports:
go:
dsn: '%env(RABBITMQ_GO_TRANSPORT_DSN)%'
serializer: 'messenger.transport.symfony_serializer'
retry_strategy:
max_retries: 3
multiplier: 2
```### Redis
Create an env variable for Redis:
```
REDIS_TRANSPORT_DSN=redis://localhost:6379/messages
```Add the following to your `config/packages/messenger.yaml`:
```yaml
framework:
messenger:
transports:
async:
dsn: "%env(MESSENGER_TRANSPORT_DSN)%"
options: []
```Make sure to specify the message routing in the `routing` section to process in Go.
## Usage
### Configure the transport
For PostgreSQL:
```go
database := gosumer.PgDatabase{
Host: "localhost",
Port: 5432,
User: "app",
Password: "!ChangeMe!",
Database: "app",
TableName: "messenger_messages",
}
```If you are using a custom schema, you can specify it with backticks:
```go
database := gosumer.PgDatabase{
Host: "localhost",
Port: 5432,
User: "app",
Password: "!ChangeMe!",
Database: "app",
TableName: `"myschema"."messenger_messages"`,
}
```For RabbitMQ:
```go
database := gosumer.RabbitMQ{
Host: "localhost",
Port: nil,
User: "guest",
Password: "guest",
Queue: "go",
}
```For Redis:
```go
database := gosumer.Redis{
Host: "localhost",
Port: 6379,
User: "username",
Password: "password",
DB: 0,
Channel: "channel_name",
}
```### Listen for messages
Call the Listen
```go
// Define your own structure according to your message
type Message struct {
ID int `json:"id"`
Number int `json:"number"`
}err := gosumer.Listen(database, process, Message{})
if err != nil {
log.Fatal(err)
}
```With the function to process your messages:
```go
func process(message any, err chan error) {
log.Printf("Message received: %v", message)// No error
err <- nil// if there is an error, used to not delete message if an error occured
// err <- errors.New("Error occured !")
}
```