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

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

Golang客户端#


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

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

文末有二维码


下载依赖包:


go get github.com/streadway/amqp


Hello World#


发送端:

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



Step2: 创建channel



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



Step5: 发送消息



接受端:

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

消费者从channel中接受消息:



处理消息:



Worker 模型#


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


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


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



消息确认机制

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

如果手动ACK如下:



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

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

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



订阅模型#


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

订阅模型有三种

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


订阅模型之Fanout模型



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

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

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




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



订阅模型之Direct模型


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



消费者:



订阅模型之Topic模型


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

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


消息确认机制#



ACK机制

所谓的ACK确认机制:

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

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

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

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

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


持久化交换机



持久化队列



持久化消息



资料获取#


参考:

官网: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

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
26天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
1月前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
147 26
|
1月前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
1月前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
2月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
42 2
|
1月前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
66 0
|
2月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
19 0
|
15天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
70 17
|
25天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
10天前
|
缓存 安全 算法
Java 多线程 面试题
Java 多线程 相关基础面试题