rabbitMQ go语言简单实现

简介: rabbitMQ go语言简单实现

发送端代码

package main
import (
  "fmt"
  "log"
  "time"
  "github.com/streadway/amqp"
)
func failOnError(err error, msg string) {
  if err != nil {
    log.Fatalf("%s : %s", msg, err)
  }
}
func connectMQ() {
  conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
  failOnError(err, "Failed to opem a channel")
  defer conn.Close()
  ch, err := conn.Channel()
  failOnError(err, "Fail open a chennel")
  defer ch.Close()
  q, err := ch.QueueDeclare(
    "hello",
    false,
    false,
    false,
    false,
    nil,
  )
  failOnError(err, "failed to declare a quene")
  forerver := make(chan bool)
  go func() {
    count := 0
    for {
      count += 1
      body := fmt.Sprintf("%s , %d", "hello world", count)
      err = ch.Publish(
        "",
        q.Name,
        false,
        false,
        amqp.Publishing{
          ContentType: "text/plain",
          Body:        []byte(body),
        })
      failOnError(err, "Failed to publish a message")
      time.Sleep(100 * time.Millisecond)
    }
  }()
  <-forerver
}
func main() {
  connectMQ()
}

自动应答 接收端代码

package main
import (
  "log"
  "time"
  "github.com/streadway/amqp"
)
func failOnError(err error, msg string) {
  if err != nil {
    log.Fatalf("%s - %s ", msg, err)
  }
}
func reviceMQ() {
  conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
  failOnError(err, "failed to connect to rabbitmq")
  defer conn.Close()
  ch, err := conn.Channel()
  failOnError(err, " Failede to open achannel")
  defer ch.Close()
  ch.Qos(1, 0, true)
  q, err := ch.QueueDeclare(
    "hello",
    false,
    false,
    false,
    false,
    nil,
  )
  failOnError(err, "failed to declare a queue ")

自动应答, 这样会造成 工人 死亡时 详细丢失

 msgs, err := ch.Consume(
    q.Name,
    "",
    true, // 自动应答 标识
    false,
    false,
    false,
    nil,
  )
  forever := make(chan bool)
  go func() {
    for {
      d := <-msgs
      log.Printf("Receied a message : %s \n len msgs : %d \n", d.Body, len(msgs))
      time.Sleep(400 * time.Millisecond)
      d.Ack(true)
    }
  }()
  log.Printf(" waiting for messages , to exit press ctrl+c")
  <-forever
}
func main() {
  reviceMQ()
}

使用说明

sender 与 reciver serve 都可以启动多份,来提高队列效率

什么是自动应答?


自动应答就是,接到任务就认为完成,

PrefetchCount

PrefetchSize

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
1月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
102 1
|
3月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
272 1
|
3月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
334 0
|
3月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
219 0
|
3月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
192 0
|
3月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
282 0
|
3月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
3月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
4月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
4月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
357 0