golang rabbitmq消费者设计_消息队列之RabbitMQ详细指北

本文详细介绍了RabbitMQ在Golang中的应用,包括连接、管道、生产者、交换机、队列和消费者的设计。强调了消息队列在解耦、异步处理和削峰等方面的作用,以及消息丢失的解决方案,如使用confirm模式确保生产者不丢消息。同时讨论了消费者丢失消息的处理,如手动确认消息,以及多线程消费、限流与预取模式。最后,探讨了RabbitMQ的各种调用模式和部署策略。
摘要由CSDN通过智能技术生成

目录

  • 前言

    • 消息队列的作用

    • 消息队列的结构

  • 结构以及常见方案

    • 连接

    • 管道

    • 生产者

    • 交换机

    • 队列

    • 消费者

  • 调用模式

    • 简单队列

    • 工作队列

    • 发布订阅

    • 路由模式

    • 主题模式

    • 远程调用

  • 部署方式

    • 单机模式

    • 普通集群

    • 镜像集群

    • Docker命令

一、前言

RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。

870fc5fd8833b3f2bdf6569fb4b33efe.png

RabbitMQ是一个消息代理。它的工作就是接收和转发消息。你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处。在这个比喻中,RabbitMQ就扮演着邮箱、邮局以及邮递员的角色。

7d5c6d251d5f87e4325c9291a190d4de.png

1. 消息队列的作用

解耦、异步、削峰

  • 异步处理:相比于传统的串行、并行方式,提高了系统吞吐量。

  • 应用解耦:系统间通过消息通信,不用关心其他系统的处理。

  • 流量削锋:可以通过消息队列长度控制请求量;可以缓解短时间内的高并发请求。

  • 日志处理:解决大量日志传输。

  • 消息通讯:消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。

2. 消息队列的结构
  • 生产者

  • 交换机

  • 队列

  • 消费者

二、结构以及常见方案

golang包:"github.com/streadway/amqp"

1.  连接(Connection)
// 连接到RabbitMQ服务器conn, err := amqp.Dial("amqp://{user}:{password}@{ip}:{port(5672)}/")failOnError(err, "Failed to connect to RabbitMQ")defer conn.Close()
2. 管道(Channel)
// 配置连接套接字,它主要定义连接的协议和身份验证等ch, err := conn.Channel()failOnError(err, "Failed to open a channel")defer ch.Close()
3. 生产者(Producer)
1) 生产消息
ch.Publish({
    exchange},{
    routingKey},{
    mandatory},{
    immediate},{
    publishing})
  • exchange 交换机名

  • routingKey 路由键

  • mandatory 强制性  建议false当mandatory标志位设置为true时,如果exchange根据自身类型和消息routingKey无法找到一个合适的queue存储消息,那么broker会调用basic.return方法将消息返还给生产者;当mandatory设置为false时,出现上述情况broker会直接将消息丢弃;通俗的讲,mandatory标志告诉broker代理服务器至少将消息route到一个队列中,否则就将消息return给发送者;

  • immediate 消息 建议false当immediate标志位设置为true时,如果exchange在将消息路由到queue(s)时发现对于的queue上么有消费者,那么这条消息不会放入队列中。当与消息routeKey关联的所有queue(一个或者多个)都没有消费者时,该消息会通过basic.return方法返还给生产者。

  • publishing 消息

    DeliveryMode: amqp.Persistent 设置消息持久化

2)样例代码
q, err := ch.QueueDeclare(    "hello", // name 定义队列名    true,   // durable 定义是否持久化    false,   // delete when usused    false,   // exclusive    false,   // no-wait    nil,     // arguments)......body := "持久化的 Hello W
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值