Golang使用NSQ示例

Golang 搭配 NSQ 实现异步任务处理 在现代分布式系统中,异步任务处理已成为构建可扩展、高可用应用程序的关键技术。本文旨在为开发者提供使用Golang和NSQ实现异步任务处理的全面指南,涵盖从基础概念到高级优化的所有方面。介绍NSQ的核心概念和架构详细讲解Golang与NSQ的集成方式提供完整的代码实现和优化建议探讨实际应用场景和最佳实践分析未来发展趋势和挑战NSQ:一个实时分布式消息平台,设计用于大规模处理消息Topic:消息的逻辑分类,生产者将消息发布到特定TopicChannel。 阅读详情

一、下载

  安装包下载地址:https://nsq.io/deployment/installing.html

  nsq源码地址:https://github.com/nsqio/nsq

 官方提供的golang版本客户端:https://github.com/nsqio/go-nsq

 

二、运行NSQ

  •  首先启动nsqlookud
nsqlookupd
  • 启动nsqd,并接入刚刚启动的nsqlookud。这里为了方便接下来的测试,启动了两个nsqd
nsqd --lookupd-tcp-address=127.0.0.1:4160
nsqd --lookupd-tcp-address=127.0.0.1:4160 --tcp-address=0.0.0.0:4152 --http-address=0.0.0.0:4153
  • 启动nqsadmin
nsqadmin --lookupd-http-address=127.0.0.1:4161

 

三、示例

    使用官方提供的golang客户端:

go get github.com/nsqio/go-nsq

  

1.生成者

      ps:开启两个生产者producer1和producer2,由这两个生产者交替生产消息

package main

import (
	"fmt"
	"log"
	"bufio"
	"os"

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


func main() {
	strIP1 := "127.0.0.1:4150"
	strIP2 := "127.0.0.1:4152"

	producer1,err := initProducer(strIP1)
	if err != nil {
		log.Fatal("init producer1 error:",err)
	}
	producer2,err := initProducer(strIP2)
	if err != nil {
		log.Fatal("init producer2 error:",err)
	}

	defer producer1.Stop()
	defer producer2.Stop()

	//读取控制台输入
	reader := bufio.NewReader(os.Stdin)

	count := 0
	for {
		fmt.Print("please say:")
		data, _, _ := reader.ReadLine()
		command := string(data)
		if command == "stop" {
			fmt.Println("stop producer!")
			return
		}
		if count % 2 == 0 {
			err := producer1.public("test1",command)
			if err != nil {
				log.Fatal("producer1 public error:",err)
			}
		}else {
			err := producer2.public("test2",command)
			if err != nil {
				log.Fatal("producer2 public error:",err)
			}
		}

		count++
	}
}

type nsqProducer struct {
	 *nsq.Producer
}


//初始化生产者
func initProducer(addr string) (*nsqProducer, error) {
	fmt.Println("init producer address:",addr)
	producer,err := nsq.NewProducer(addr,nsq.NewConfig())
	if err != nil {
		return nil,err
	}
	return &nsqProducer{producer},nil
}

//发布消息
func (np *nsqProducer)public(topic,message string) error {
	err := np.Publish(topic,[]byte(message))
	if err != nil {
		log.Println("nsq public error:",err)
		return err
	}
	return nil
}

 

 2.消费者

    ps:初始化两个消费者消费test1和test2

package main

import (
	"time"
	"fmt"
	"log"
	
	"github.com/nsqio/go-nsq"
)

func main() {
	err := initConsumer("test1", "test-channel1", "127.0.0.1:4161")
	if err != nil {
		log.Fatal("init Consumer error")
	}
	err = initConsumer("test2","test-channel2","127.0.0.1:4161")
	if err != nil {
		log.Fatal("init Consumer error")
	}
	select {

	}
}


type nsqHandler struct {
	nsqConsumer      *nsq.Consumer
	messagesReceived int
}

//处理消息
func (nh *nsqHandler)HandleMessage(msg *nsq.Message) error{
	nh.messagesReceived++
	fmt.Printf("receive ID:%s,addr:%s,message:%s",msg.ID, msg.NSQDAddress, string(msg.Body))
	fmt.Println()
	return nil
}

func initConsumer(topic, channel, addr string) error {
	cfg := nsq.NewConfig()
	cfg.LookupdPollInterval = 3*time.Second
	c,err := nsq.NewConsumer(topic,channel,cfg)
	if err != nil {
		log.Println("init Consumer NewConsumer error:",err)
		return err
	}

	handler := &nsqHandler{nsqConsumer:c}
	c.AddHandler(handler)

	err = c.ConnectToNSQLookupd(addr)
	if err != nil {
		log.Println("init Consumer ConnectToNSQLookupd error:",err)
		return err
	}
	return nil
}

 

结果:

生产者:

 

消费者:

 

也可以通过nsqadmin   http://localhost:4171/   查看nsq相关信息

Golang 借助 NSQ 实现消息的延迟处理功能 在电商大促中,用户下单后 30 分钟未支付需要自动取消订单;在社交应用里,发帖后 2 小时需要提醒用户“是否修改内容”——这些场景都需要消息的延迟处理。本文将聚焦“如何用 Golang 和 NSQ 实现这一功能”,覆盖从概念理解到代码实战的全流程。用“快递驿站”类比 NSQ 的核心组件和延迟消息的工作流程;拆解 NSQ 延迟处理的底层算法(时间轮);提供完整的 Golang 代码示例(生产者、消费者、环境搭建);总结实际项目中的常见问题和优化方向。NSQ。 阅读详情

相关推荐

Golang 与 NSQ:构建分布式消息处理架构

本文旨在为开发者和架构师提供使用Golang和NSQ构建分布式消息处理系统的全面指南。我们将覆盖从基础概念到高级应用的完整知识体系,包括NSQ的安装配置、Golang客户端的开发、性能优化和故障处理等关键主题。文章将从NSQ的基本概念开始,逐步深入到Golang与NSQ的集成实践,最后探讨高级应用场景和性能优化技巧。每个部分都配有详细的代码示例和架构图。消息队列(Message Queue): 一种在应用程序之间传递消息的中间件生产者(Producer): 创建并发送消息到队列的应用程序。

AI Agent Harness Engineering 1063

Golang之NSQ

1 NSQ 1.1 NSQ简介 NSQ是一个基于go语言开发的一个比较流行的分布式的消息队列。 1.2 NSQ优势 不存在单点故障,容错性能高以及高可用性,可靠的消息交付 支持横向扩展,没有集中式代理 配置和部署简单 1.2.1 NSQ适用于异步处理 参照下图利用消息队列把业务流程中的非关键流程异步化,从而显著降低业务请求的响应时间。 1.2.2 NSQ适用于应用解耦 通过使用消息队列将不同...

franky专栏 1470

Golang 匿名函数使用

最近在研究NSQ中间件,在研究这个中间件的过程中,发现了一些自己在平时开发工作中未使用到的Golang特性;决定记录下在这个过程中学习到的一些知识;本篇文章要写的,是关于Golang匿名函数的使用 匿名函数没有函数名只有函数体,他可以作为一种类型被赋值给函数类型的变量,匿名函数也往往以变量方式传递。 Go语言支持随时在代码里定义匿名函数。 匿名函数,由一个不带函数名的函数声明和函数体组成。简而言之,就是匿名函数可以将作为普通变量使用:能在函数中传递或者是赋值给变量。

飞越蓝天的专栏 503

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

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

qq_37325838的博客 836

掌握Golang领域NSQ,提升系统异步处理能力

本文旨在帮助Golang开发者理解和掌握NSQ消息队列的使用,提升系统异步处理能力。内容涵盖NSQ的基本概念、核心架构、Golang客户端使用、实际应用场景以及性能优化等方面。介绍消息队列和NSQ的基本概念深入解析NSQ的架构和工作原理展示Golang中使用NSQ的实际代码示例探讨NSQ在实际项目中的应用场景分析NSQ的性能优化和最佳实践展望NSQ的未来发展趋势消息队列(Message Queue): 一种应用程序间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。

AI Agent Harness Engineering 655

NSQ 在 Golang 物联网项目中的实时数据处理方案

本文旨在为Golang开发者提供在物联网项目中实施NSQ消息队列的完整方案,涵盖从基础概念到高级应用的各个层面。我们将重点讨论NSQ在实时数据采集、处理和分发场景中的最佳实践。文章首先介绍NSQ的核心概念及其在物联网中的价值,然后深入架构原理,接着提供完整的Golang实现示例,最后讨论实际应用和未来趋势。NSQ:一个实时的分布式消息平台,设计用于大规模处理高吞吐量的消息流Topic:消息的逻辑分类通道,生产者发布消息到特定TopicChannel。

AI Agent Harness Engineering 378

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

golang的接口是一种抽象类型,是对其他类型行为的概括与抽象,从语法角度来看,接口是一组方法定义的集合,文本的封装使用了golang接口这一特性,把所有的消息队列中间件抽象为一个MQer拥有生产和消费两个方法,具体的各个消息队列中间件去实现这两个方法即可,最明显的优点在于扩展性,解耦性,选择性,维护性这几个表象上。

Man_ge的博客 2081

LM Studio中文版零基础入门:从安装到模型下载的保姆级教程(附国内镜像源配置)

本文提供LM Studio中文版的零基础入门教程,涵盖从软件安装、中文界面切换到国内镜像源配置的全流程。特别针对模型下载速度慢的问题,详细介绍了如何通过修改配置文件使用国内镜像站,并推荐适合新手的入门模型及硬件配置建议,帮助用户快速上手本地大模型运行。

pz890123456的博客 2597

Golang与NSQ消息队列

文章目录1. 概述2. 基础应用场景3. 相关文档4.安装操作5. NSQ服务端基础组件介绍5.1 nsqd5.2 nsqlookupd5.3 nsqadmin6.操作NSQ6.1 安装客户端6.1 单机启动nsqd6.1.1 单NSQ的使用6.1.2 通过nsqadmin查看6.1.3 NSQ的单点结构6.3 NSQ集群6.3.1 启动NSQ各组件6.3.2 NSQ的拓扑结构6.3.3 Go语言...

Gcaptain 1134

保姆级教程:手把手带你复现APFNet论文的RGBT目标跟踪模型(附完整代码与数据集配置)

本文提供了一份详细的APFNet论文复现指南,涵盖从环境搭建到模型测试的全流程。通过解析多模态融合模块和渐进式训练流程,帮助读者高效完成RGBT目标跟踪模型的复现工作,特别针对训练和测试中的常见问题提供实用解决方案。

weixin_29056781的博客 342

使用fluent计算流噪声_Fluent能够做的事

刚接触到fluent的同学们,应该会比较好奇,fluent能够做些什么事情,和你的研究有没有关联,能不能达到你的目的?如果不弄明白这样一点,前期可能会做很多无用功。 fluent是计算流体力学的软件,是一个工具。这样一个工具发展至今,可以用来模拟的绝不只有流体力学。下面我们依次来说明。首先是流动,fluent提供了非常丰富的流动模型,不仅可以模拟层流,同样还可以模拟...

weixin_28717647的博客 4857

golang使用Nsq

为什么要使用Nsq 最近一直在寻找一个高性能,高可用的消息队列做内部服务之间的通讯。一开始想到用zeromq,但在查找资料的过程中,意外的发现了Nsq这个由golang开发的消息队列,毕竟是golang原汁原味的东西,功能齐全,关键是性能还不错。其中支持动态拓展,消除单点故障等特性, 都可以很好的满足我的需求 下面上一张Nsq与其他mq...

weixin_33831196的博客 519

ilqr算法原理推导及代码实践

ilqr算法原理详解

Forwarding3的博客 1741

python 消息队列 go_Go语言使用NSQ消息队列

1. 概述NSQ 是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,由bitly公司开源出来的一款简单易用的消息中间件相关描述如下:NSQ是一个实时分布式消息传递平台,旨在大规模运行,每天处理数十亿条消息。 它促进了没有单点故障的分布式和分散式拓扑,从而实现了容错能力和高可用性,并提供了可靠的消息传递保证。 查看功能和保证。 从操作上讲,NSQ易于配置和部署(所有参数均在命令行上指...

weixin_39945178的博客 315

基于 YOLOv26 的车辆违规停车检测系统:实时监控

本文提出了一种基于YOLOv26的车辆违规停车实时检测系统。系统采用多模块架构,包括视频预处理、YOLOv26目标检测、DeepSORT目标跟踪、停车区域定义、行为分析和违规判定等功能模块。关键技术包括使用YOLOv26s模型进行车辆检测,结合DeepSORT算法实现车辆跟踪,支持多种停车区域定义方式(多边形、矩形、限时区域等)。系统通过边缘计算平台部署,实现了对道路边、禁止停车区等场景的实时监控,能够准确识别长时间停车、禁止区域停车等违规行为,并触发告警机制。实验结果表明,该系统在车辆检测准确率和违规判定

一键难忘的博客 773

基于R-CNN深度学习的石头剪刀布手势识别系统:数据集、模型和UI界面的完整实现

本项目的目标是开发一个基于R-CNN深度学习模型的手势识别系统,能够识别石头、剪刀、布三种手势,并通过UI界面让用户能够进行交互。数据集准备与标注:收集包含石头剪刀布手势的图像,并对其进行标注。深度学习模型构建与训练:采用R-CNN模型进行手势的识别和定位。UI界面设计:设计一个简洁的界面,用户可以上传手势图像并进行识别。R-CNN(Region Convolutional Neural Networks)是一个典型的目标检测模型。生成候选区域。

YOLO 876

go语言中nsq和redis协作

通过上述示例,你可以看到 NSQ 如何作为消息队列来处理异步消息,而 Redis 作为后端数据存储来及时接收和存储这些消息。这种结合使用使得系统能够高效地处理大量的数据,同时保持良好的性能与可扩展性。

qq_45249945的博客 1542

SAP_PP模块中MRP中信号灯简介

一、信号灯的作用二、常见的信号灯颜色及含义三、信号灯的来源四、常见场景示例示例1:物料满足所有需求示例2:生产订单已延迟示例3:缺料或未产生计划订单五、相关事务码参考六、如何应对红色或黄色信号灯?七、前台操作说明在 SAP PP 模块中,**MRP(物料需求计划)运行结果中的“信号灯”是一种非常直观的可视化提示工具,用于帮助用户快速识别物料计划是否存在异常或需要关注的问题。这些信号灯通常出现在MD04(库存/需求清单)、MD05(单物料MRP清单)、MD07(MRP列表)**等事务代码的界面中。

我小时候很黑的博客 633

python 消息队列 go_NSQ(分布式消息队列)

前言我们可以将原本耦合、同步执行的程序 解耦成 生产端+ 消息队列+消费端模型的异步程序,加上分布式的生产者和消费者架构就可以在一定程度上支撑大并发。NSQ是go语言开发的消息队列,所以对nsqd进行水平扩展时它的部署、配置也会相对简单。如果熟悉golang的话在遇到了十分棘手的问题时,看一下源码!NSQ介绍NSQ是1个分布式(distributed)、可扩展(scalable)、配置简单(Ops...

weixin_39625468的博客 522

智能手表竞品分析与市场调研报告

本报告旨在通过调研当前主流智能手表产品的功能特点、市场表现、用户反馈、定价策略等方面,辅助我司即将立项的Aurora Watch S1产品在功能定义、目标用户、定价区间、差异化竞争等方面做出科学决策。 调研范围包括国内外中端价位主流品牌(¥199~¥999),重点关注小米、华为、荣耀、Amazfit、Redmi、Haylou 等品牌的热销型号。

hoony123的博客 7万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

golang-nsq高性能消息队列

nsq高性能消息队列前言安装和部署特性nsq优点&缺点客户端Golang的客户端 前言 tips:如果本文对你有用,请爱心点个赞,提高排名,让这篇文章帮助更多的人。谢谢大家!比心❤~ 如果解决不了,可以在文末加我微信,进群交流。 NSQ 是实时的分布式消息处理平台,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。 NSQ 具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。 NSQ 非常容易配置和部署,且具有最大的灵活性,支持众多消息协

梦逸灵箭——的博客 1241

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Docker部属Nsq集群

  用一了段时间NSQ还是很稳定的。除了稳定,还有一个特别值的说的就是部署非常简单。总想写点什么推荐给大家使用nsq来做一些东西。但是就是因为他太简单易用,文档也比较简单易懂。一直不知道要写啥!!!!!   nsq官网: http://nsq.io/      为了容灾需要对nsqd多机器部属,有了Docker后,快速扩还是很方便的。   部署完后我会用go和c#写一些代码方便大家学习。 ...

weixin_33749131的博客 115

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Go操作NSQ

Go操作NSQ 目录 NSQ介绍 NSQ应用场景 安装 NSQ组件 NSQ架构 NSQ特性 Go操作NSQ NSQ是目前比较流行的一个分布式的消息队列,本文主要介绍了NSQ及Go语言如何操作NSQ。 1. NSQ介绍 NSQ是Go语言编写的一个开源的实时分布式内存消息队列,其性能十分优异。 NSQ的优势有以下优势: NSQ提倡分布式和分散的拓扑,没有单点故障,支持容错和高可用性,并提供可靠的消息交付保证 NSQ支持横向扩展,没有任何集中式代理。 NSQ易于配置和部署,并且内置了管理界面。

努力努力再努力L 404

NSQ使用入门

NSQ使用入门 简介 消息队列是进程间通信或同一进程不同线程间进行通信一种方式,可以将服务异步化,对流量进行整形,削峰填谷,是高并发、大数据场景下不可或缺的中间件;使得消息生产者和消费者解耦,方便系统模块化设计。 NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,由bitly公司开源出来的一款简单易用的消息中间件。 官方和第三方还为NSQ开发了众多客户端功能库,如官方提供的基于HTTP的nsqd、Go客户端go-nsq、Python客户端pynsq、基于Node.js的JavaScri

riba2534的博客 3395

golang mq NSQ安装及API基本使用

【代码】golang mq NSQ安装及API基本使用。

学亮编程手记 838
上一篇: NSQ理解
下一篇: Golang中heap包源码分析
思维的深度
博客等级 码龄11年 2万+粉丝 391原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值