zl程序教程

您现在的位置是:首页 >  后端

当前栏目

保姆级别的RabbitMQ教程!一看就懂!(有安装教程,送安装需要的依赖包,送Java、Golang两种客户端教学Case) (三)

2023-09-27 14:25:58 时间
保姆级别的RabbitMQ教程!一看就懂!(有安装教程,送安装需要的依赖包,送Java、Golang两种客户端教学Case) (三)
Golang客户端#

关注白日梦 后台回复 rbmq 即可获取如下资料

本文中涉及到的 Golang Case、Java Case以及erlang虚拟机rpm包、rabbitmq-server的rpm包等软件 直接通过yum安装即可。

文末有二维码


下载依赖包


go get github.com/streadway/amqp


Hello World#

image


发送端

Step1: 获取连接: Dial最后面的//test 比较迷惑 其实/test是我的virtualhost 如果只写成/host会把错说 no access to this vhost


image


Step2: 创建channel


image


Step3: 声明queue 后续往这个队列中发送消息


image


Step5: 发送消息


image


接受端

消费者同样需要建立连接和channel、然后声明我们想消费的channel 和上面的生产者代码相同 就不粘出来了。

消费者从channel中接受消息


image


处理消息


image


Worker 模型#

image


同样的Worker模型和Simple模型也是相似的。无外乎是simple模型的消费者启动了多个实例。


消息分发策略 默认情况下RabbitMQ后将P生产的消息以round-robin的策略分发给C1、C2。


你也可以像下图这样设置一个相对公平的分发策略: 当消费者把消息处理完后MQ才会给他新的消息 这样可以实现能者多劳。


image


消息确认机制

什么是ACK机制 你可以往下翻看 Golang客户端/消息确认机制/ACK机制部分的描述。

如果手动ACK如下


image


当我们像上面这样设置手动ACK之后 可以确保如果消费者没处理完消息就挂了 MQ中的消息不会丢失。

但是如果这时MQ挂了 消息同样会丢失。

为了避免这种情况 可以将设置将MQ中的消息也持久化


image


订阅模型#


订阅模型借助一个新的概念 Exchange 交换机 实现 不同的订阅模型本质上是根据交换机(Exchange)的类型划分的。

订阅模型有三种

Fanout 广播模型 : 将消息发送给绑定给交换机的所有队列(因为他们使用的是同一个RoutingKey)。Direct 定向 : 把消息发送给拥有指定Routing Key (路由键)的队列。Topic 通配符 : 把消息传递给拥有 符合Routing Patten(路由模式)的队列。


订阅模型之Fanout模型

image



这个模型的特点就是它在发送消息的时候 并没有指明Rounting Key 或者说他指定了Routing Key 但是所有的消费者都知道 大家都能接收到消息,就像听广播。

生产者 在获取channel之后紧接着创建一个交换机 交换机的类型为 fanout 扇出。

注意 fanout对应的routingkey 路由key为空



image


消费者 需要消费者获取到channel后也要声明交换机。消费者的queue无名称 queue没有routingkey。注意交换机的名字别写错。


image


订阅模型之Direct模型

image


生产者 和Fanout类似 注意交换机的名称为direct 以及添加 特定的routingkey


image


消费者


image


订阅模型之Topic模型

image


和Direct模型相似 不同点 type为topic、并别routingkey支持正则表达式。

详细代码不再重复贴了。可以自行领取源码学习。


消息确认机制#



ACK机制

image

所谓的ACK确认机制

自动ACK 消费者接收到消息后自动发送ACK给RabbitMQ。

手动ACK 我们手动控制消费者接收到并成功消息后发送ACK给RabbitMQ。

你可以看上图 如果使用自动ACK 当消息者将消息从channel中取出后 RabbitMQ随即将消息给删除。接着不幸的是 消费者没来得及处理消息就挂了。那也就意味着消息其实丢失了。

你可能会说 会不会存在重复消费的情况呢 这其实就不是MQ的问题了。你完全可以在你代码的逻辑层面上进行诸如去重、插入前先检查是否已存在等逻辑规避重复消费问题。

具体的实现方式可以参考上面的Golang或JAVA客户端的Worker模型部分。


持久化交换机


image


持久化队列


image


持久化消息


image


资料获取#

参考

官网 https://www.rabbitmq.com/

get start https://www.rabbitmq.com/getstarted.html

download rabbitmq https://www.rabbitmq.com/download.html

rabbitmq和erlang版本对应关系 https://www.rabbitmq.com/which-erlang.html

download erlang https://www.erlang-solutions.com/resources/download.html

rabbitmq推荐的erlang https://www.rabbitmq.com/releases/erlang/

了解更多rabbitmq3.8.X配置 https://www.cnblogs.com/masy-lucifer/p/13551067.html

rabbitmq3.8.9 GitHub:https://github.com/rabbitmq/rabbitmq-server/tree/v3.8.9/docs

认证、授权、访问控制 https://www.rabbitmq.com/access-control.html


Golang和Java怎么选? Java是当前使用最热门的编程语言,Go最近也很火,很多公司比如bilibili后台转向Go开发,头条的后台只用Python和Go。根据最新2022年2月份的TIOBE编程语言指数排行榜,排名前三的分别是Python、C和Java,Go排名在第11位。
gRPC Java 和Golang下server 端消息发送源码分析比较 gRPC Java 和Golang下server 端消息发送源码比较 RPC是平时开发中经常用到的通信框架,gRPC是Google版本的rpc,开发中涉及到跨语言或者单纯通信需求时,gRPC是个不错的选择。