RabbitMQ(概念,消息持久化,ACK机制)

RabbitMQ:MessageListenerAdapter消息监听器适配器使用与源码分析 pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/ma 阅读详情

目录

  • RabbitMQ 特点

  • RabbitMQ 概念

  • exchange交换机机制

    • 什么是交换机

    • binding?

    • Direct Exchange交换机

    • Topic Exchange交换机

    • Fanout Exchange交换机

    • Header Exchange交换机

  • RabbitMQ 的 Hello - Demo(springboot实现)

  • RabbitMQ 的 Hello Demo(spring xml实现)

  • RabbitMQ 在生产环境下运用和出现的问题

    • Spring RabbitMQ 注解

    • 消息的 JSON 传输

    • 消息持久化,断线重连,ACK。

特点:

1.可靠性(持久化、发布确认、传输确认)。

2.灵活路由(本身提供一些路由交换机,可以叠加)。

3.支持集群()。

4.高可用性(队列可以在集群的机器上进行镜像)。

5.支持多种协议(AMQP、MQTT、STOMP)。

6.支持多种语言。

7.提供UI管理界面。

8.提供消息跟踪机制,出现问题可以查询。

9.提供插件机制,可以从多反面扩展,包括自定义插件。

 

RabbitMQ 概念

RabbitMQ 即一个消息队列,_主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。_RabbitMQ使用的是AMQP协议,它是一种二进制协议。默认启动端口 5672。

在 RabbitMQ 中,如下图结构:

  • 左侧 P 代表 生产者,也就是往 RabbitMQ 发消息的程序。

  • 中间即是 RabbitMQ,_其中包括了 交换机 和 队列。_

  • 右侧 C 代表 消费者,也就是往 RabbitMQ 拿消息的程序。

那么,_其中比较重要的概念有 4 个,分别为:虚拟主机,交换机,队列,和绑定。_

  • 虚拟主机:一个虚拟主机持有一组交换机、队列和绑定。为什么需要多个虚拟主机呢?很简单,RabbitMQ当中,_用户只能在虚拟主机的粒度进行权限控制。_ 因此,如果需要禁止A组访问B组的交换机/队列/绑定,必须为A和B分别创建一个虚拟主机。每一个RabbitMQ服务器都有一个默认的虚拟主机“/”。

  • 交换机:_Exchange 用于转发消息,但是它不会做存储_ ,如果没有 Queue bind 到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息。

    • 这里有一个比较重要的概念:**路由键 ** 。消息到交换机的时候,交互机会转发到对应的队列中,那么究竟转发到哪个队列,就要根据该路由键。

  • 绑定:也就是交换机需要和队列相绑定,这其中如上图所示,是多对多的关系。

exchange交换机机制

什么是交换机

rabbitmq的message model实际上消息不直接发送到queue中,中间有一个exchange是做消息分发,producer甚至不知道消息发送到那个队列中去。因此,当exchange收到message时,必须准确知道该如何分发。是append到一定规则的queue,还是append到多个queue中,还是被丢弃?这些规则都是通过exchagne的4种type去定义的。

The core idea in the messaging model in RabbitMQ is that the producer never sends any messages directly to a queue. Actually, quite often the producer doesn't even know if a message will be delivered to any queue at all.

Instead, the producer can only send messages to an exchange. An exchange is a very simple thing. On one side it receives messages from producers and the other side it pushes them to queues. The exchange must know exactly what to do with a message it receives. Should it be appended to a particular queue? Should it be appended to many queues? Or should it get discarded. The rules for that are defined by the exchange type.

exchange是一个消息的agent,每一个虚拟的host中都有定义。它的职责是把message路由到不同的queue中。

binding?

exchange和queue通过routing-key关联,这两者之间的关系是就是binding。如下图所示,X表示交换机,红色表示队列,交换机通过一个routing-key去binding一个queue,routing-key有什么作用呢?看Direct exchange类型交换机。

Directed Exchange

路由键exchange,该交换机收到消息后会把消息发送到指定routing-key的queue中。那消息交换机是怎么知道的呢?其实,producer deliver消息的时候会把routing-key add到 message header中。routing-key只是一个messgae的attribute。

A direct exchange delivers messages to queues based on a message routing key. The routing key is a message attribute added into the message header by the producer. The routing key can be seen as an "address" that the exchange use to decide how to route the message. A message goes to the queue(s) whose binding key exactly matches the routing key of the message.

Default Exchange

这种是特殊的Direct Exchange,是rabbitmq内部默认的一个交换机。该交换机的name是空字符串,所有queue都默认binding 到该交换机上。所有binding到该交换机上的queue,routing-key都和queue的name一样。

Topic Exchange

通配符交换机,exchange会把消息发送到一个或者多个满足通配符规则的routing-key的queue。其中_表号匹配一个word,#匹配多个word和路径,路径之间通过.隔开。如满足a._.c的routing-key有a.hello.c;满足#.hello的routing-key有a.b.c.helo。

Fanout Exchange

扇形交换机,该交换机会把消息发送到所有binding到该交换机上的queue。这种是publisher/subcribe模式。用来做广播最好。

所有该exchagne上指定的routing-key都会被ignore掉。

The fanout copies and routes a received message to all queues that are bound to it regardless of routing keys or pattern matching as with direct and topic exchanges. Keys provided will simply be ignored.

Header Exchange

设置header attribute参数类型的交换机。

RabbitMQ 的 Hello Demo

安装就不说了,建议按照官方文档上做。先贴代码,稍后解释,代码如下:

配置 交换机,队列,交换机与队列的绑定,消息监视容器:

@Configuration

@Data

public class RabbitMQConfig {

 

final static String queueName = "spring-boot";

 

@Bean

Queue queue() {

return new Queue(queueName, false);

}

 

@Bean

TopicExchange exchange() {

return new TopicExchange("spring-boot-exchange");

}

 

@Bean

Binding binding(Queue queue, TopicExchange exchange) {

return BindingBuilder.bind(queue).to(exchange).with(queueName);

}

 

@Bean

SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {

SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();

container.setConnectionFactory(connectionFactory);

container.setQueueNames(queueName);

container.setMessageListener(listenerAdapter);

return container;

}

 

@Bean

Receiver receiver() {

return new Receiver();

}

@Bean

MessageListenerAdapter listenerAdapter(Receiver receiver) {

return new MessageListenerAdapter(receiver, "receiveMessage");

}

}

配置接收信息者(即消费者):

public class Receiver {

 

private CountDownLatch latch = new CountDownLatch(1);

 

public void receiveMessage(String message) {

System.out.println("Received <" + message + ">");

latch.countDown();

}

 

public CountDownLatch getLatch() {

return latch;

}

}

配置发送信息者(即生产者):

@RestController

public class Test {

@Autowired

RabbitTemplate rabbitTemplate;

 

@RequestMapping(value = "/test/{abc}",method = RequestMethod.GET)

public String test(@PathVariable(value = "abc") String abc){

rabbitTemplate.convertAndSend("spring-boot", abc + " from RabbitMQ!");

return "abc";

}

}

以上便可实现一个简单的 RabbitMQ Demo,具体代码在:点这里

那么,这里,分为三个部分分析:发消息,交换机队列,收消息。

  • 对于发送消息:我们一般可以使用 RabbitTemplate,这个是 Spring 封装给了我们,便于我们发送信息,我们调用 rabbitTemplate.convertAndSend("spring-boot", xxx); 即可发送信息。

  • 对于交换机队列:如上代码,我们需要配置交换机 TopicExchange,配置队列 Queue,并且配置他们之间的绑定 Binding

  • 对于接受消息:首先需要创建一个消息监听容器,然后把我们的接受者注册到该容器中,这样,队列中有信息,那么就会调用接收者的对应的方法。如上代码 container.setMessageListener(listenerAdapter); 其中,MessageListenerAdapter 可以看做是 我们接收者的一个包装类,new MessageListenerAdapter(receiver, "receiveMessage"); 指明了如果有消息来,那么调用接收者哪个方法进行处理。

RabbitMQ 的 Hello Demo(spring xml实现)

spring xml方式实现RabbitMQ简单,可读性较好,配置简单,配置和实现如下所示。

上文已经讲述了rabbitmq的配置,xml方式通过properites文件存放用户配置信息:

mq.host=127.0.0.1

mq.username=guest

mq.password=guest

mq.port=5672

配置application-mq.xml配置文件,声明连接、交换机、queue以及consumer监听。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:rabbit="http://www.springframework.org/schema/rabbit"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/rabbit

http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd" >

<description>rabbitmq 连接服务配置</description>

 

<!-- 连接配置 -->

<context:property-placeholder location="classpath:mq.properties" />

<rabbit:connection-factory id="connectionFactory" host="${mq.host}" username="${mq.username}" password="${mq.password}" port="${mq.port}"/>

<rabbit:admin connection-factory="connectionFactory"/>

<!-- spring template声明-->

<rabbit:template exchange="amqpExchange" id="amqpTemplate" connection-factory="connectionFactory" />

 

<!--申明queue-->

<rabbit:queue id="test_queue_key" name="test_queue_key" durable="true" auto-delete="false" exclusive="false" />

<!--申明exchange交换机并绑定queue-->

<rabbit:direct-exchange name="amqpExchange" durable="true" auto-delete="false" id="amqpExchange">

<rabbit:bindings>

<rabbit:binding queue="test_queue_key" key="test_queue_key"/>

</rabbit:bindings>

</rabbit:direct-exchange>

 

 

<!--consumer配置监听-->

<bean id="reveiver" class="com.demo.mq.receive.Reveiver" />

<rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto">

<rabbit:listener queues="test_queue_key" ref="reveiver" method="receiveMessage"/>

</rabbit:listener-container>

</beans>

 

上述代码中,引入properties文件就不多说了。

<rabbit:connection-factory>标签声明创建connection的factory工厂。

<rabbit-template>声明spring template,和上文spring中使用template一样。template可声明exchange。

<rabbit:queue>声明一个queue并设置queue的配置项,直接看标签属性就可以明白queue的配置项。

<rabbit:direct-exchange>声明交换机并绑定queue。

<rabbit:listener-container>申明监听container并配置consumer和监听routing-key。

剩下就简单了,application-context.xml中把rabbitmq配置import进去。

<?xml version="1.0" encoding="UTF-8"?>

<beans

xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:task="http://www.springframework.org/schema/task"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-3.0.xsd

http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

 

<context:component-scan base-package="com.demo.**" />

<import resource="application-mq.xml" />

</beans>

 

Producer实现,发送消息还是使用template的convertAndSend() deliver消息。

@Service

public class Producer {

 

@Autowired

private AmqpTemplate amqpTemplate;

 

private final static Logger logger = LoggerFactory.getLogger(Producer.class);

 

public void sendDataToQueue(String queueKey, Object object) {

try {

amqpTemplate.convertAndSend(queueKey, object);

} catch (Exception e) {

e.printStackTrace();

logger.error("exeception={}",e);

}

 

}

}

 

配置consumer

package com.demo.mq.receive;

 

import org.springframework.stereotype.Service;

import java.util.concurrent.CountDownLatch;

 

@Service

public class Reveiver {

private CountDownLatch latch = new CountDownLatch(1);

 

public void receiveMessage(String message) {

System.out.println("reveice msg=" + message.toString());

latch.countDown();

}

}

 

测试deliver消息

Controller

@RequestMapping("/demo/")

public class TestController {

private final static Logger logger = LoggerFactory.getLogger(TestController.class);

@Resource

private Producer producer;

 

 

@RequestMapping("/test/{msg}")

public String send(@PathVariable("msg") String msg){

logger.info("#TestController.send#abc={msg}", msg);

System.out.println("msg="+msg);

producer.sendDataToQueue("test_queue_key",msg);

return "index";

}

}

 

RabbitMQ 在生产环境下运用和出现的问题

在生产环境中,由于 Spring 对 RabbitMQ 提供了一些方便的注解,所以首先可以使用这些注解。例如:

  • @enablerabbit:@enablerabbit 和 @configuration 注解在一个类中结合使用,如果该类能够返回一个 RabbitListenerContainerFactory 类型的 bean,那么就相当于能够把该终端(消费端)和 RabbitMQ 进行连接。Ps:(生成端不是通过 RabbitListenerContainerFactory 来和 RabbitMQ 连接,而是通过 RabbitTemplate )

  • @rabbitlistener:当对应的队列中有消息的时候,该注解修饰下的方法会被执行。

  • @rabbithandler:接收者可以监听多个队列,不同的队列消息的类型可能不同,该注解可以使得不同的消息让不同方法来响应。

具体这些注解的使用,可以参考这里的代码:点这里

首先,生产环境下的 RabbitMQ 可能不会在生产者或者消费者本机上,所以需要重新定义 ConnectionFactory,即:

@Bean

ConnectionFactory connectionFactory() {

CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host, port);

connectionFactory.setUsername(userName);

connectionFactory.setPassword(password);

connectionFactory.setVirtualHost(vhost);

return connectionFactory;

}

这里,可以重新设置需要连接的 RabbitMQ 的 ip,端口,虚拟主机,用户名,密码。

然后,可以先从生产端考虑,生产端需要连接 RabbitMQ,那么可以通过 RabbitTemplate 进行连接。 Ps:(RabbitTemplate 用于生产端发送消息到交换机中),如下代码:

@Bean(name="myTemplate")

RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {

RabbitTemplate template = new RabbitTemplate(connectionFactory);

template.setMessageConverter(integrationEventMessageConverter());

template.setExchange(exchangeName);

return template;

}

在该代码中,new RabbitTemplate(connectionFactory); 设置了生产端连接到RabbitMQ,template.setMessageConverter(integrationEventMessageConverter()); 设置了 生产端发送给交换机的消息是以什么格式的,在 integrationEventMessageConverter() 代码中:

public MessageConverter integrationEventMessageConverter() {

Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter();

return messageConverter;

}

如上 Jackson2JsonMessageConverter 指明了 JSON。上述代码的最后 template.setExchange(exchangeName); 指明了 要把生产者要把消息发送到哪个交换机上。

有了上述,那么,我们即可使用 rabbitTemplate.convertAndSend("spring-boot", xxx); 发送消息,xxx 表示任意类型,因为上述的设置会帮我们把这些类型转化成 JSON 传输。

接着,生产端发送我们说过了,那么现在可以看看消费端:

对于消费端,我们可以只创建 SimpleRabbitListenerContainerFactory,它能够帮我们生成 RabbitListenerContainer,然后我们再使用 @rabbitlistener 指定接收者收到信息时处理的方法。

@Bean(name="myListenContainer")

public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {

SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();

factory.setMessageConverter(integrationEventMessageConverter());

factory.setConnectionFactory(connectionFactory());

return factory;

}

这其中 factory.setMessageConverter(integrationEventMessageConverter()); 指定了我们接受消息的时候,以 JSON 传输的消息可以转换成对应的类型传入到方法中。例如:

@Slf4j

@Component

@RabbitListener(containerFactory = "helloRabbitListenerContainer",queues = "spring-boot")

public class Receiver {

@RabbitHandler

public void receiveTeacher(Teacher teacher) {

log.info("##### = {}",teacher);

}

}

可能出现的问题:

消息持久化

在生产环境中,我们需要考虑万一生产者挂了,消费者挂了,或者 rabbitmq 挂了怎么样。一般来说,如果生产者挂了或者消费者挂了,其实是没有影响,因为消息就在队列里面。那么万一 rabbitmq 挂了,之前在队列里面的消息怎么办,其实可以做消息持久化,RabbitMQ 会把信息保存在磁盘上。

做法是可以先从 Connection 对象中拿到一个 Channel 信道对象,然后再可以通过该对象设置 消息持久化。

生产者或者消费者断线重连

这里 Spring 有自动重连机制。

ACK 确认机制

每个Consumer可能需要一段时间才能处理完收到的数据。如果在这个过程中,Consumer出错了,异常退出了,而数据还没有处理完成,那么 非常不幸,这段数据就丢失了。因为我们采用no-ack的方式进行确认,也就是说,每次Consumer接到数据后,而不管是否处理完 成,RabbitMQ Server会立即把这个Message标记为完成,然后从queue中删除了。

如果一个Consumer异常退出了,它处理的数据能够被另外的Consumer处理,这样数据在这种情况下就不会丢失了(注意是这种情况下)。

为了保证数据不被丢失,RabbitMQ支持消息确认机制,即acknowledgments。为了保证数据能被正确处理而不仅仅是被Consumer收到,那么我们不能采用no-ack。而应该是在处理完数据后发送ack。

在处理数据后发送的ack,就是告诉RabbitMQ数据已经被接收,处理完成,RabbitMQ可以去安全的删除它了。

如果Consumer退出了但是没有发送ack,那么RabbitMQ就会把这个Message发送到下一个Consumer。这样就保证了在Consumer异常退出的情况下数据也不会丢失。

总结

  1. RabbitMQ 作用:异步,解耦,缓冲,消息分发。

  2. RabbitMQ 主要分为3个部分,生产者,交换机和队列,消费者。

  3. 需要注意消息持久化,目的为了防止 RabbitMQ 宕机;考虑 ACK 机制,目的为了如果消费者对消息的处理失败了,那么后续要如何处理。

在CoppeliaSim里实现一个最简单的强化学习 前言 上一篇文章中介绍了CoppeliaSim的一些基本知识和一个简单的用python去控制CoppeliaSim里面四旋翼无人机运动的一个例子。文章链接 :https://blog.youkuaiyun.com/qq_37051669/article/details/115324851 本文将继续介绍如何利用CoppeliaSim的物理环境去实现一个最简单的强化学习。 如何实现强化学习 强化学习(Reinforcementlearning)是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利. 阅读详情

相关推荐

分类模型AUC低于0.5?5个常见坑点排查指南(附代码示例)

本文针对分类模型AUC低于0.5的常见问题,提供了5个关键排查点及代码示例。从样本分布失衡、特征与标签脱节到量纲差异、模型初始化和数据泄露,详细解析了可能导致AUC异常的原因,并给出实用的诊断方法和解决方案,帮助开发者快速提升模型性能。

weixin_29190169的博客 240

关于@RabbitListener注解自动ack的一些猜测

从网上获取到的信息@RabbitListener采用的是自动ack。

风吹草动 846

深入AOSP构建系统:从BUILD_FINGERPRINT的生成逻辑,看如何定制你的Android设备标识

本文深入解析AOSP构建系统中的设备指纹生成机制,详细介绍了BUILD_FINGERPRINT的生成逻辑及其在Android设备中的关键作用。通过分析多个指纹属性的区别与联系,以及如何定制设备标识,帮助开发者更好地理解和掌握Android系统构建过程。

weixin_27017211的博客 218

RabbitMQ中消息确认机制

概要:RabbitMQ中间件的引入对于整个系统来说是一把双刃剑,在对系统进行解耦的同时也降低了消息的可靠性,但是对于某些系统来说我们又必须保证我们的消息是不会丢失的,因此rabbitmq给提供了以下一些功能来保证消息的可靠性,本文我们主要讲解消息可靠性中的 发送端确认机制以及 消费端确认机制 发送端确认机制 RabbitMQ引入了一种轻量量级的方式,叫发送方确认(publisher confirm)机制。生产者将信道设置成confirm(确认)模式,一旦信道进入confirm 模式...

李嘉图呀李嘉图的博客 4913

SAP FICO资产明细表开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

SAP FICO资产明细表开发说明书(包括源代码,测试样例及FS)

我好像病了的博客 1470

FC7300 Clock介绍

FC7300的时钟架构包括一个高级时钟图和内部时钟需求。它有5个CMU,使用SIRC监控FIRC/SOSC/FOSC,并使用FIRC监控SIRC。此外,CMU4还使用FOSC监Slow Clock。

舊梦的博客 327

使用@RabbitListener注解接受消息时如何进行手动ack

由于进行手动ack需要调用当前channel的basicAck方法,所以在注解注解的处理方法的入参中需要加入channel入参以及deleveryTag入参。下面看一个示例 /** * @param message :解码后的消息 * @param delicveryTag :使用@Header接口获取messageProperties中的DELIVERY_TAG属性。 * @param c...

tinysakura的博客 2万+

UNET改进77:全网首发-添加CFBlock |

本文介绍了在UNet模型中集成CFBlock注意力机制的实现方法。主要分为三个步骤:1) 创建CFBlock模块,包含卷积注意力机制和MLP;2) 在UNet连接处添加注意力模块;3) 在卷积层中嵌入注意力机制。具体实现包括:定义Conv、MLP和ConvolutionalAttention等基础模块,构建CFBlock核心结构;在UNet跳跃连接处插入注意力模块;将注意力机制整合到DoubleConv和Down模块中。该方法通过在不同位置引入注意力机制,可有效提升模型的特征提取能力。代码实现使用PyTor

AIcurator的博客 388

rabbitmq消息可靠性--------Consumer Ack(消费者确认机制)(一)

文章预览:Consumer Ack(消费者确认机制)springBoot完整案列1. pom.xml2.yml3.主入口类4.rabbitConfig5.MessageListener5.2 @RabbitListener(queues = "q.biz", ackMode = "MANUAL") Consumer Ack(消费者确认机制) 如何保证消息被消费者成功消费? 生产者发送确认机制和消息的持久化存储机制,然而这依然无法完全保证整个过程的可靠性,因为如果消息被消费过程中业务处理失败了但是消息却已经

weixin_43811057的博客 5304

芒果YOLO11改进23:主干Backbone篇GhostNet:原创改进高效 GhostNet 网络,华为出品,打造全新检测器

主干Backbone篇GhostNet:原创改进高效 GhostNet 网络,华为出品,打造全新检测器

包括YOLOv5、YOLOv7、YOLOv8等模型改进 406

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

RabbitMq的一些概念,持久化、队列排他、自动删除、消息确认机制、消息ACK、消费消息的模式

一、队列持久化的概念 队列的声明默认是存放到内存中的,如果rabbitmq重启会丢失,如果想重启之后还存在就要使队列持久化,保存到Erlang自带的Mnesia数据库中,当rabbitmq重启之后会读取该数据库。 二、排他 简单理解就是在连接关闭时是否会删除队列(无论队列中有没有消息) 三、自动删除 当队列中有消息时,无论是否排他,关闭连接都不会删除队列,此时消费者消费完消息后再断开消费者,队列会被自动删除。(这里如果有多个消费者消费同一个队列,则需要所有消费者都断开后才能自动删除) 四、消..

毅呀毅呀哟 7896

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring 集成 RabbitMQ 与其概念,消息持久化,ACK机制

目录RabbitMQ 概念exchange交换机机制什么是交换机binding?Direct Exchange交换机Topic Exchange交换机Fanout Exchange交换机Header Exchange交换机RabbitMQ 的 Hello - Demo(springboot实现)RabbitMQ 的 Hello Demo(spring xml实现)RabbitMQ 在生产环境下运用...

思考、总结、专注 4404

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

RabbitMQ:Spring 集成 RabbitMQ 与其概念,消息持久化,ACK机制等

目录 RabbitMQ 概念 exchange交换机机制 什么是交换机 binding? Direct Exchange交换机 Topic Exchange交换机 Fanout Exchange交换机 Header Exchange交换机 RabbitMQ 的 Hello - Demo(springboot实现) RabbitMQ 的 Hello De...

weixin_30737433的博客 173

深度掌握 RabbitMQ 消息确认(ACK)机制,确保消息万无一失

消息的发布与订阅模式:RabbitMQ 采用发布/订阅模式,生产者将消息发布到交换器(Exchange),交换器根据路由规则将消息路由到相应的队列(Queue),消费者从队列中获取消息并进行处理。交换器(Exchange)和队列(Queue)的工作机制:交换器负责接收生产者发送的消息,并根据路由键将消息路由到一个或多个队列。队列则用于存储消息,等待消费者进行消费。自动 ACK:当消费者从队列中获取消息后,RabbitMQ 会自动将该消息标记为已确认,无需消费者手动进行确认操作。手动 ACK。

m0_67265654的博客 931

rabbitmq多个消费者同时接收_一文看懂RabbitMQ--概念、工作过程、持久化

概述MQ的内容之前已经介绍了几次了,所以今天这里主要聊一聊消息队列(MQ),以RabbitMQ为例来做个总结。01基础定义1. BrokerBroker的概念来自与Apache ActiveMQ,通俗的讲就是MQ的服务器。2. 消息的生产者、消费者消息生产者Producer:发送消息到消息队列。消息消费者Consumer:从消息队列接收消息。3. 点对点消息队列模型消息生产者向一个特定的队列发送消...

weixin_39783149的博客 1840

RabbitMq

消息传递模式:RabbitMQ支持多种消息传递模式,包括发布/订阅、点对点和工作队列等,使其更灵活适用于各种消息通信场景。消息路由和交换机:RabbitMQ引入交换机的概念,用于将消息路由到一个或多个队列。允许根据消息的内容、标签或路由键进行灵活的消息路由,从而实现更复杂的消息传递逻辑。消息确认机制:RabbitMQ支持消息确认机制,消费者可以确定已成功处理消息。确保了消息不会再传递后被重复消费,增加了消息的可靠性。消息持久性。

qq_44288171的博客 2079

Rabbitmq,Rocketmq,Kafka基本概念介绍和常见消息确保方案

1.Rabbitmq 首先说的是rabbitmq,为什么先提它呢,因为它是这么多款开源mq里面完全遵循AMQP(Advanced Message Queue )的开源实现的。 概念:结合下图来理解 上图表述了消息生产,通过server到消息被消费的过程。那么来看看rabbitmq中几个名词概念。 Queue Queue(队列)RabbitMQ的作用是存储消息,队列的特性是先进...

qq_34177039的博客 1074

RabbitMQ的架构、交换机机制和ACK机制

RabbitMQ RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。 RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。 RabbitMQ使用的是AMQP协议,它是一种二进制协议。默认启动端口 5672。 RabbitMQ 的架构 RabbitMQ Server: 也叫broker server,它不是运送食物的卡车,而是一种传输服务。 RabbitMQ isn’t a food truc

Jay的博客 562

RabbitMQ ACK/NACK机制解析

在分布式系统中,消息队列扮演着至关重要的角色,它能够有效地解耦生产者和消费者,提高系统的可用性和伸缩性。然而,在实际应用中,如何确保消息的可靠传递和处理成为一个关键问题。这就引出了RabbitMQ中的ACK/NACK机制,它是保证消息传递可靠性的核心知识点。想象一个场景,在一个复杂的电商系统中,订单服务需要处理大量的订单消息。如果订单服务在处理消息时突然崩溃,而消息没有被正确处理,那么可能会导致订单数据丢失或重复处理。为了防止这种情况发生,我们需要引入一种机制来确保消息在传递过程中能够被正确地确认和处理。

JavaCodePro的博客 949

RabbitMQ面试题

rabbitMQ总结消息队列,也就是MQ消息队列是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。 常见的MQ有4种ActiveMQ: 基于JMSRabbitMQ:基于AMQP协议,erlang语言开发,稳定性好 RocketMQ:基于JMS,阿里巴巴产品,目前交由Apache基金会 Kafka:分布式消息系统,高吞吐量 RabbitMQ分五种消息模型:

WL_creep的博客 389

1-rabbitmq-解决(应用解耦、流量削峰、消息分发、异步消息)、常见消息队列及比较、rabbitmq安装、消息安全之ack和durable持久化、基于Queue实现生产者消费者模型、闲置消费

rabbitmq-解决(应用解耦、流量削峰、消息分发、异步消息)、常见消息队列及比较、rabbitmq安装、消息安全之ack和durable持久化、基于Queue实现生产者消费者模型、闲置消费

linjun的博客 916

RabbitMQ中如何保证消息的可靠传输?如果消息丢了怎么办

本文为joshua317原创文章,转载请注明:转载自joshua317博客RabbitMQ中如何保证消息的可靠传输?如果消息丢了怎么办 - joshua317的博客 数据的丢失问题,可能出现在生产者、MQ、消费者中 一、生产者丢失 生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥 的,都有可能。此时可以选择用 RabbitMQ 提供的事务功能,就是生产者发送数据之前开启 RabbitMQ 事务channel.txSelect,然后发送消息,如果消息没有成功被 R.

joshua317的博客 196

rabbitmq消费者获取消息慢_一文理解RabbitMQ原生版

导读首发于公众号:JAVA大贼船,原创不易,喜欢的读者可以关注一下哦!一个分享java学习资源,实战经验和技术文章的公众号!什么是RabbitMQRabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue 高级消息队列协议 )的开源实现, 能够实现异步消息处理。RabbitMQ是支持持久化消息队列的消息中间件,应用在上下游的层次级业务逻辑中,上级业务逻辑相当于...

weixin_39966740的博客 690
上一篇: 集群部署环境下session共享的问题
下一篇: 分布消息中间件--协议(AQMP、MQTT)
heary29
博客等级 码龄12年 37粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值