Rabbitmq 消息对列 生产者与消费者的具体实现 springboot

RabbitMQ 基本介绍

RabbitMQ的设计理念是.只要有接收消息的队列. 邮件就会存放到队列里. 直到订阅人取走. . 如果没有可以接收这个消息的消息队列. 默认是抛弃这个消息的..

我实现的功能是将远程实现两

Publisher:

是Message的生产者,Publisher这个Clients产生了一些Message。

Consumer:

Message的消费者,Publisher产生的Message,最终要到达Consumer这个Clients,进行消费。

Exchange:

指定消息按什么规则,路由到哪个Queue,Message消息先要到达Exchange,在Server中承担着从Produce接收Message的责任。

Queue:

到达Exchange的消息,根据制定的规则(Routing key)到达对应的Queue,在Server中承担着装载Message,是Message的容器,等待被消费出去。

Routing key:

在Exchange和Queue之间隐藏有一条黑线,可以将这条黑线看成是Routing key,Exchange就是根据这些定义好的Routing key将Message送到对应的Queue中去,是Exchange和Queue之间的桥梁。

Broker:

之前一直不理解这个Broker,其实Broker就是接收和分发消息的应用,也就是说RabbitMQ Server就是Message Broker。

VirtualHost:

虚拟主机,一个Broker里可以开有多个VirtualHost,它的作用是用作不同用户的权限分离。

Connection:

是Publisher/Consumer和Broker之间的TCP连接。断开连接的操作只会在Publisher/Consumer端进行,Broker不会断开连接,除非出现网络故障或者Broker服务出现问题,Broker服务宕了。

Connection: Channel:

如果每一次访问RabbitMQ就建立一个Connection,那在消息量大的时候建立TCP Connection的开销就会很大,导致的后果就是效率低下。

左边的Client向右边的Client发送消息,流程:

第一:获取Conection

第二:获取Channel

第三:定义Exchange,Queue

第四:使用一个RoutingKey将Queue Binding到一个Exchange上

第五:通过指定一个Exchange和一个RoutingKey来将消息发送到对应的Queue上,

第六:Consumer在接收时也是获取connection,接着获取channel,然后指定一个Queue,到Queue上取消息,它对Exchange,RoutingKey及如何Binding都不关心,到对应的Queue上去取消息就行了。

一个Publisher Client发送消息,哪些Consumer Client可以收到消息,在于Exchange,RoutingKey,Queue的关系上。

RabbitMQ的简单理论知识就介绍这么多,下篇博客介绍RabbitMQ在CentoOS7上的安装和配置。

首先要区别AMQP协议mandatory和immediate标志位的作用。

mandatory和immediate是AMQP协议中basic.pulish方法中的两个标志位,它们都有当消息传递过程中不可达目的地时将消息返回给生产者的功能。具体区别在于:
1. mandatory标志位
当mandatory标志位设置为true时,如果exchange根据自身类型和消息routeKey无法找到一个符合条件的queue,那么会调用basic.return方法将消息返还给生产者;当mandatory设为false时,出现上述情形broker会直接将消息扔掉。
2. immediate标志位
当immediate标志位设置为true时,如果exchange在将消息route到queue(s)时发现对应的queue上没有消费者,那么这条消息不会放入队列中。当与消息routeKey关联的所有queue(一个或多个)都没有消费者时,该消息会通过basic.return方法返还给生产者。

如想使用RabbitMQ 需要先安装 erlang 虚拟机 在安装RabbitMQ 服务器 具体实现请查看 我的上一篇博客

具体的代码参考请参考参考资料 良心制作 环境Springboot +maven +IDEA

https://gitee.com/xdymemory00/RabbitMQ.git

时间: 2024-11-13 03:58:23

Rabbitmq 消息对列 生产者与消费者的具体实现 springboot的相关文章

RabbitMQ 消息确认与公平调度消费者

一.消息确认 为了确保消息一定被消费者处理,rabbitMQ提供了消息确认功能,就是在消费者处理完任务之后,就给服务器一个回馈,服务器就会将该消息删除,如果消费者超时不回馈,那么服务器将就将该消息重新发送给其他消费者 默认是开启的,在消费者端通过下面的方式开启消息确认,  首先将autoAck自动确认关闭,等我们的任务执行完成之后,手动的去确认,类似JDBC的autocommit一样 QueueingConsumer consumer = new QueueingConsumer(channel

RabbitMQ简单Java示例——生产者和消费者

添加Maven依赖: 使用rabbitmq-client的最新Maven坐标: <!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client --> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.3.0</ver

RabbitMQ基础概念详解(一)——环境配置及模拟生产者和消费者简单消息发送

一.简介: RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件.消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取 完成通信.而作为中间件的 RabbitMq 无疑是目前最流行的消息队列之一. AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然.

rabbitMQ学习笔记(三) 消息确认与公平调度消费者

从本节开始称Sender为生产者 , Recv为消费者   一.消息确认 为了确保消息一定被消费者处理,rabbitMQ提供了消息确认功能,就是在消费者处理完任务之后,就给服务器一个回馈,服务器就会将该消息删除,如果消费者超时不回馈,那么服务器将就将该消息重新发送给其他消费者 默认是开启的,在消费者端通过下面的方式开启消息确认,  首先将autoAck自动确认关闭,等我们的任务执行完成之后,手动的去确认,类似JDBC的autocommit一样 QueueingConsumer consumer

微服务实战(四):落地微服务架构到直销系统(将生产者与消费者接入消息总线)

前一篇文章我们已经完成了基于RabbitMq实现的的消息总线,这篇文章就来看看生产者(订单微服务)与消费者(经销商微服务)如何接入消息总线实现消息的发送与消息的接收处理. 定义需要发送的消息: 下单消息要被发送到消息总线,并被经销商微服务的处理器处理.经销商微服务处理时,需要知道要对哪个经销商处理多少的PV值与电子币余额.这些信息就是事件消息需要承载的重要信息. public class OrderCreatedProcessDealerEvent:BaseEvent { public deci

Kafka-常用术语(消息、生产者、消费者、集群、broker解释)

Kafka-常用术语(消息.生产者.消费者.集群.broker解释) 消息和批次 kafka的数据单元被称为消息.类似于数据库表中的一行数据. 消息由字节数组组成,所以对于kafka来说,消息里的数据没有特别的格式或含义. 消息可以有一个可选的元数据,也就是键,键也是一个字节数组,当消息以一种可控的方式写入不同的分区时,会用到键.最简单的例子就是为键生成一个一致性散列值,然后使用散列值对主题分区数进行取模,为消息选取分区.这样可以保证具有相同键的消息总是被写到相同的分区上. 为了提高效率,消息被

LMAX Disrutpor—多生产者多消费者中,消息复制分发的高性能实现

解决的问题 当我们有多个消息的生产者线程,一个消费者线程时,他们之间如何进行高并发.线程安全的协调? 很简单,用一个队列. 当我们有多个消息的生产者线程,多个消费者线程,并且每一条消息需要被所有的消费者都消费一次(这就不是一般队列,只消费一次的语义了),该怎么做? 这时仍然需要一个队列.但是: 1. 每个消费者需要自己维护一个指针,知道自己消费了队列中多少数据.这样同一条消息,可以被多个人独立消费. 2. 队列需要一个全局指针,指向最后一条被所有生产者加入的消息.消费者在消费数据时,不能消费到这

结合生活案例实现rabbitmq消息通信

ps : 这篇文章比较长,读者还是需要耐心的阅读的.干货多多. 在分布式项目中为了提高性能,也为了实现项目规范,我们都会在处理消息队列的时候引入消息中间件.中间件的作用一个是为了解耦,还有一个是性能提升.消息中间件我们每个人每天都在接触,相信大家都用过美团或者是听过美团.从程序员的角度看美团外卖涉及三方角色.[商家][骑手][顾客].这三者的关系简单理解如下 下面案例会通过代码说明,如下是项目结构 rabbit-demo 下订单 今天我们着重介绍下订单的流程,那为什么选择下订单流程而不选择其他两

nodejs中使用RabbitMq消息中心系统的方式

方式一:通过npm安装amqp库 方式二:通过rabbit.js库http://www.squaremobius.net/rabbit.js/ AMQP:高级消息队列协议,是应用层协议的一个开放标准,RabbitMq是用Erlang语言编写的一个AMQP的开源实现. 核心组件:Exchange & Queue Exchange称为交换器,Queue是消息队列,这两者都在服务器端,Producer和Consumer分别是生产者和消费者,在客户端 原理: 生产者发送消息给交换器Exchange并带一