Files
common/message/msg_queue.go

153 lines
3.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package message
import (
"context"
"fmt"
)
type RedisConfig struct {
// Stream 名称
Stream string
// 消费者组名称
Group string
// 消费者名称
Consumer string
// 每次消费数量
Count int64
// 是否自动 ACK
AutoAck bool
// 处理函数
HandleFunc func(ctx context.Context, message map[string]interface{}) error
}
// RabbitMQConfig RabbitMQ 队列配置
type RabbitMQConfig struct {
Mode string
Exchange string
Topic string
DelayMessage bool
// 队列名称(必需)
Name string
// 实际队列名(用于绑定)
Queue string
// 是否持久化
Durable bool
// QoS 预取数量每次推送的消息数量默认10
PrefetchCount int
// 最大重试次数默认3
MaxRetry int
// 是否自动 ACK
AutoAck bool
// 处理函数
HandleFunc func(ctx context.Context, message map[string]interface{}) error
}
// NATSConfig NATS 队列配置
type NATSConfig struct {
DelayMessage bool
// Stream 名称
Stream string
// 消费者名称
Consumer string
// 是否持久化
Durable bool
// 副本数
Replicas int
// QoS 预取数量每次推送的消息数量默认10
PrefetchCount int
// 是否自动 ACK
AutoAck bool
// 处理函数
HandleFunc func(ctx context.Context, message map[string]interface{}) error
}
// messageBroker 消息代理接口
type messageBroker interface {
// StreamGroup 创建消费组(支持单个配置或批量配置)
streamGroup(ctx context.Context, configs ...interface{}) error
// Publish 发布消息(支持单个配置或批量配置)
publish(ctx context.Context, config interface{}, data interface{}) error
// PublishDelayed 发布延迟消息(支持单个配置或批量配置)
publishDelayed(ctx context.Context, config interface{}, data interface{}, delay int) error
// Subscribe 订阅消息(支持单个配置或批量配置)
subscribe(ctx context.Context, configs ...interface{}) error
}
type messageClientType string
const (
ClientTypeRedis messageClientType = "redis"
ClientTypeRabbitMQ messageClientType = "rabbitmq"
ClientTypeNATS messageClientType = "nats"
)
// newMessageBroker 创建消息代理实例
func newMessageBroker(ctx context.Context, clientType messageClientType) (messageBroker, error) {
switch clientType {
case ClientTypeRedis:
return &redisMessageClient{clientType: clientType}, nil
case ClientTypeRabbitMQ:
return &rabbitMQMessageClient{clientType: clientType}, nil
case ClientTypeNATS:
return &natsMessageClient{clientType: clientType}, nil
default:
return nil, fmt.Errorf("unknown client type: %s", clientType)
}
}
// StreamGroup 直接创建消费组
func StreamGroup(ctx context.Context, clientType messageClientType, configs ...interface{}) error {
broker, err := newMessageBroker(ctx, clientType)
if err != nil {
return err
}
return broker.streamGroup(ctx, configs...)
}
// Publish 直接发布消息
func Publish(ctx context.Context, clientType messageClientType, config interface{}, data interface{}) error {
broker, err := newMessageBroker(ctx, clientType)
if err != nil {
return err
}
return broker.publish(ctx, config, data)
}
// PublishDelayed 直接发布延迟消息
func PublishDelayed(ctx context.Context, clientType messageClientType, config interface{}, data interface{}, delay int) error {
broker, err := newMessageBroker(ctx, clientType)
if err != nil {
return err
}
return broker.publishDelayed(ctx, config, data, delay)
}
// Subscribe 直接订阅消息
func Subscribe(ctx context.Context, clientType messageClientType, configs ...interface{}) error {
broker, err := newMessageBroker(ctx, clientType)
if err != nil {
return err
}
return broker.subscribe(ctx, configs...)
}