首页 > 其他分享 >Golang 接入 NSQ 实现消费者和生产者

Golang 接入 NSQ 实现消费者和生产者

时间:2024-12-23 14:02:04浏览次数:6  
标签:topic err 接入 Golang 0.1 消息 nsq NSQ

        在现代分布式系统中,消息队列是不可或缺的组件,它允许系统之间异步传递消息,从而实现解耦和高效的处理。NSQ 是一个高性能、分布式的消息队列,它适合于处理高吞吐量的消息传递。接下来,我将将介绍如何在 Golang 中接入 NSQ 实现生产者和消费者。

什么是 NSQ?

NSQ 是一个分布式消息队列系统,设计初衷是为了处理实时、高吞吐量的消息传递。它通过去中心化的设计来增强系统的高可用性和扩展性。NSQ 使用 TCP 连接来传递消息,支持高效的消息推送和拉取。

安装 NSQ

在开始编写代码之前,首先需要安装并启动 NSQ 服务。

  1. 安装 NSQ

    可以通过 go get 安装 NSQ 相关的 Go 客户端包:

    go get -u github.com/nsqio/go-nsq
    
  2. 启动 NSQ 服务

    下载并运行 NSQ 的服务端,可以通过官方的二进制文件或者 Docker 启动。

    1. 下载并运行 NSQ 服务(假设你已经安装了 nsq):

      nsqd --broadcast-address=127.0.0.1 --lookupd-tcp-address=127.0.0.1:4160
      
    2. 启动 NSQ Lookup 服务:

      nsqlookupd --broadcast-address=127.0.0.1
      
    3. 启动 Web 界面(可选):

      nsqadmin --lookupd-http-address=127.0.0.1:4161
      

    这将会启动 NSQ 的 Web 管理界面,默认访问地址为 http://127.0.0.1:4171

Golang 接入 NSQ

生产者

生产者的任务是向 NSQ 中发送消息。以下是一个简单的 NSQ 生产者示例:

package main

import (
	"fmt"
	"log"

	"github.com/nsqio/go-nsq"
)

func main() {
	// 1. 创建 NSQ 生产者
	producer, err := nsq.NewProducer("127.0.0.1:4150", nsq.NewConfig())
	if err != nil {
		log.Fatal(err)
	}
	defer producer.Stop()

	// 2. 生产消息并发布到指定 topic
	topic := "example_topic"
	message := []byte("Hello NSQ!")

	err = producer.Publish(topic, message)
	if err != nil {
		log.Fatal("Failed to publish message:", err)
	}

	fmt.Println("Message sent to NSQ:", string(message))
}

解释

  1. 创建生产者:

    • 使用 nsq.NewProducer 创建一个 NSQ 生产者实例。127.0.0.1:4150 是 NSQ 的数据端口。
  2. 发布消息:

    • 使用 producer.Publish 方法向指定的 topic 发布消息。在这个示例中,消息内容是字符串 "Hello NSQ!",它会被发送到 example_topic 主题。
  3. 关闭生产者:

    • 使用 defer 确保在程序退出时关闭生产者,释放资源。

消费者

消费者的任务是从 NSQ 中接收消息并进行处理。以下是一个简单的 NSQ 消费者示例:

package main

import (
	"fmt"
	"log"

	"github.com/nsqio/go-nsq"
)

type MessageHandler struct{}

func (h *MessageHandler) HandleMessage(message *nsq.Message) error {
	// 消费消息
	fmt.Println("Received message:", string(message.Body))
	return nil
}

func main() {
	// 1. 创建 NSQ 消费者
	consumer, err := nsq.NewConsumer("example_topic", "channel1", nsq.NewConfig())
	if err != nil {
		log.Fatal(err)
	}

	// 2. 设置消息处理逻辑
	consumer.AddHandler(&MessageHandler{})

	// 3. 连接到 NSQ
	err = consumer.ConnectToNSQD("127.0.0.1:4150")
	if err != nil {
		log.Fatal("Failed to connect to NSQD:", err)
	}

	// 4. 等待消费者退出
	select {}
}

解释

  1. 定义消息处理器:

    • MessageHandler 结构体实现了 nsq.Handler 接口的 HandleMessage 方法,负责处理接收到的消息。在此方法中,我们简单地打印了消息内容。
  2. 创建消费者:

    • 使用 nsq.NewConsumer 创建消费者,example_topic 是订阅的消息主题,channel1 是消息的消费频道。消费者将从指定的 NSQD 服务获取消息。
  3. 连接到 NSQ:

    • 使用 consumer.ConnectToNSQD 连接到 NSQ 服务的地址。
  4. 启动消费者:

    • 使用 select {} 保持消费者持续运行,等待消息到达。

     

标签:topic,err,接入,Golang,0.1,消息,nsq,NSQ
From: https://blog.csdn.net/qq_37325838/article/details/144664106

相关文章

  • Linux golang安装
    目录方法一:使用包管理器安装(推荐对于大多数用户)对于基于Debian/Ubuntu的系统:对于基于RedHat/CentOS的系统:方法二:从官方网站下载并手动安装(推荐对于需要特定版本的用户)在Linux上安装Go(Golang)可以通过以下几种方式进行。以下是两种最常用的方法:通过包管理器安装和从官方......
  • Golang 从数组创建slice(三个参数)
    测试环境:win64,go版本:1.21.8 IDE:GoLand一般的我们知道,slice本身是不存数据的,是对于底层数组的引用,所以最接近底层的创建slice的方法可以这样写:arr:=[5]int{1,2,3,4,5}sliceInt:=arr[:]sliceInt的底层数据就是arr我这次记录下我平时不太会用到的用三个参数创建,大......
  • Golang逃逸现象
    1、什么是内联函数?什么是逃逸现象?什么是内联函数?内联函数是一种在编译时,直接将要调用的代码嵌入到调用处的优化技术,其主要目的是减少函数调用时的开销,例如对于普通函数其执行过程如下:将参数压入栈中根据地址跳转至对应位置执行执行完毕后返回调用点而使用内联函数则将函......
  • 在SpringBoot项目中接入sensitive-word实现敏感词过滤(DFA算法、为敏感词打上标签、忽
    文章目录1.前言2.敏感词过滤的常见解决方案3.DFA算法3.1什么是DFA算法3.2DFA算法的原理3.2.1数据是如何存储的3.2.2数据是如何检索的3.3DFA算法的应用场景4.sensitive-word简介4.1什么是sensitive-word4.2sensitive-word的官网4.3sensitive-word的性能5.......
  • Golang学习笔记_16——Map
    Golang学习笔记_13——数组Golang学习笔记_14——切片Golang学习笔记_15——range文章目录Map1.介绍2.声明和初始化3.类型4.基本操作4.1插入更新4.2访问值4.3删除4.4遍历5.注意事项6.示例Map1.介绍在Go语言中,map是一种内置的数据结构,用于存储键......
  • Golang中的Map是怎么遍历的
    在Golang中,遍历map的常见方法是使用for...range循环。map是无序的键值对集合,因此遍历map时,每次迭代访问的键值对顺序可能不同。以下是一个遍历map的示例:packagemainimport"fmt"funcmain(){//创建一个mapmyMap:=map[string]int{"ap......
  • Golang学习笔记_13——数组
    Golang学习笔记_10——SwitchGolang学习笔记_11——指针Golang学习笔记_12——结构体文章目录数组1.定义2.访问和修改3.多维数组4.计算数组长度5.数组作为函数参数6.遍历7.数组的内存表示源码数组Go语言中的数组是一种具有固定长度、相同类型元素的集......
  • Golang学习笔记_14——切片
    Golang学习笔记_11——指针Golang学习笔记_12——结构体Golang学习笔记_13——数组文章目录切片1.定义2.创建3.基本操作4.动态性5.子切片6.数组和切片7.注意8.高级用法源码切片Go语言中的切片(slice)是一种非常强大且灵活的数据结构,它基于数组,但提供了......
  • Golang学习历程【第四篇 运算符&流程控制】
    Golang学习历程【第四篇运算符&流程控制】1.运算符1.1算术运算符1.2关系运算符1.3逻辑运算符1.4赋值运算符1.5其他运算符2.二进制运算3.流程控制3.1条件表达式if3.2for循环3.3forrange(键值循环)3.4switch...case3.5break,continue,goto1.运算符1.......
  • golang:第三方库:用vipper解析yaml配置文件
    一,安装第三方库$gogetgithub.com/spf13/viper二,代码1,配置文件Database:DBType:mysqlUserName:dbusernamePassword:dbpasswordHost:127.0.0.1:3306DBName:dbnameCharset:utf8ParseTime:TrueMaxIdleConns:10MaxOpenConns:30 2,代码:......