基于golang多消息队列中间件的封装nsq,rabbitmq,kafka
场景
在创建个人的公共方法库中有这样一个需求,就是不同的项目会用到不同的消息队列中间件,我的思路把所有的消息队列中间件进行封装一个消息队列接口(MQer)有两个方法一个生产一个消费,那么在实例化对象的时候根据配置文件指定当前项目使用的那个消息队列中间件;
接口模型
这个模型的核心思想是消息队列的核心功能生产者生产消息方法和消费者消费消息,任何消息队列都必须有这两个功能;根据如下代码消息队列中间件是可扩展的,只需在实例化消息队列对象那里添加新消息队列的实现;
// MQer 消息队列接口
type MQer interface {
Producer(topic string, data []byte)
Consumer(topic, channel string, ch chan []byte, f func(b []byte))
}
// NewMQ 实例化消息队列对象
func NewMQ() MQer {
switch conf.Conf.Default.Mq {
// mq 设置的类型
case "nsq":
return new(MQNsqService)
case "rabbit":
return new(MQRabbitService)
case "kafka":
return new(MQKafkaService)
default:
return new(MQNsqService)
}
}
/*
配置文件结构设计
mqType: "" # nsq, rabbit, kafka 这三个值然当然了是可扩展的
nsq:
producer: ""
consumer: ""
rabbit:
addr: ""
user: ""
password: ""
kafka:
addr: ""
*/
各个消息队列的实现
1. 依赖库
- nsq : github.com/nsqio/go-nsq
- rabbitmq : github.com/streadway/amqp
- kafka : github.com/Shopify/sarama
2. nsq
nsq结构体
// MQNsqService NSQ消息队列
type MQNsqService struct {
}
生产者
// Producer 生产者
func (m *MQNsqService) Producer(topic string, data []byte) {
nsqConf := &nsq.Config{
}
client, err := nsq.NewProducer(nsqServer, nsqConf)
if err != nil {
log.Error("[nsq]无法连接到队列")
return
}
log.DebugF(fmt.Sprintf("[生产消息] topic : %s --> %s", topic, string(data)))
err = client.Publish(topic, data)
if err != nil {
log.Error("[生产消息] 失败 : " + err.Error())
}
}
消费者
var (
nsqServer = conf.Conf.Default.Nsq<

本文介绍了如何使用Golang实现一个通用的消息队列接口MQer,封装nsq、rabbitmq和kafka,通过配置文件选择不同队列,强调了接口的扩展性和解耦性优势。
最低0.47元/天 解锁文章
1711

被折叠的 条评论
为什么被折叠?



