基于golang多消息队列中间件的封装nsq,rabbitmq,kafka

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

基于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<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值