go 消息队列服务器,Go语言系列(十二)之RabbitMQ消息队列

1. RabbitMQ是什么?

MQ 是什么?队列是什么,MQ 我们可以理解为消息队列,队列我们可以理解为管道。以管道的方式做消息传递。

生活场景:

1.其实我们在双11的时候,当我们凌晨大量的秒杀和抢购商品,然后去结算的时候,就会发现,界面会提醒我们,让我们稍等,以及一些友好的图片文字提醒。而不是像前几年的时代,动不动就页面卡死,报错等来呈现给用户。

在这业务场景中,我们就可以采用队列的机制来处理,因为同时结算就只能达到这么多。

2.在我们平时的超市中购物也是一样,当我们在结算的时候,并不会一窝蜂一样涌入收银台,而是排队结算。这也是队列机制。

2. RabbitMQ简介

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 下面将重点介绍RabbitMQ中的一些基础概念,了解了这些概念,是使用好RabbitMQ的基础。

可靠性(Reliablity):使用了一些机制来保证可靠性,比如持久化、传输确认、发布确认。

灵活的路由(Flexible Routing):在消息进入队列之前,通过Exchange来路由消息。对于典型的路由功能,Rabbit已经提供了一些内置的Exchange来实现。针对更复杂的路由功能,可以将多个Exchange绑定在一起,也通过插件机制实现自己的Exchange。

消息集群(Clustering):多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。

高可用(Highly Avaliable Queues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。

多种协议(Multi-protocol):支持多种消息

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Go 中,你可以使用消息队列来发送消息给 服务器。一个常见的消息队系统是 RabbitMQ,下面是一个示例代码,展示了如何在 Gin 服务器中使用 Rabbit 发送消息: 首先,你需要安装 RabbitMQ 的 Go 客户端库。可以使用以下命令进行安装: ``` go get github.com/streadway/amqp ``` 接下来,你可以在你的代码中导入所需的包: ```go import ( "github.com/gin-gonic/gin" "github.com/streadway/amqp" ) ``` 然后,你需要建立一个 RabbitMQ 连接,并创建一个通道来发送消息。这可以在 Gin 服务器启动时完成: ```go func main() { // 建立 RabbitMQ 连接 conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") if err != nil { panic(err) } defer conn.Close() // 创建通道 ch, err := conn.Channel() if err != nil { panic(err) } defer ch.Close() // 启动 Gin 服务器 router := gin.Default() // ... } ``` 然后,在你的 Gin 路由处理函数中,你可以使用创建的通道来发布消息。以下是一个示例路由处理函数: ```go func sendMessage(ch *amqp.Channel, message string) error { // 声明一个消息队列 q, err := ch.QueueDeclare( "my_queue", // 队列名 false, // 是否持久化 false, // 是否自动删除 false, // 是否排他队列 false, // 是否等待服务器响应 nil, // 额外参数 ) if err != nil { return err } // 发布消息 err = ch.Publish( "", // 交换机名 q.Name, // 队列名 false, // 是否等待服务器响应 false, // 是否阻塞 amqp.Publishing{ ContentType: "text/plain", Body: []byte(message), }, ) return err } func main() { // ... router.GET("/send", func(c *gin.Context) { message := c.Query("message") // 发送消息 err := sendMessage(ch, message) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"message": "Message sent"}) }) // ... } ``` 在上述示例中,我们首先声明了一个名为 "my_queue" 的队列,然后使用 `ch.Publish` 发布消息到这个队列中。 这只是一个简单的示例,你可以根据你的需求对代码进行更多的调整和扩展。希望这可以帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值