RabbitMQ

RabbitMQ入门

拥有回忆 提交于 2019-12-26 17:10:27
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 本章主要介绍RabbitMQ 的基本概念 rabbitMQ整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。 Producer: 生产者,就是投递消息的一方。 消息一般可以包含2个部分:消息体和标签(Label)。消息体也可以称为 payload,在实际应用中,消息体一般是一个带有业务逻辑结构的数据,比如一个JSON字符串。 标签用来表述这条消息,比如一个交换器的名称和一个路由键。生产者把消息交由 RabbitMQ,RabbitMQ 之后会根据标签把消息发送给感兴趣的消费者(Consumer) Consumer: 消费者,就是接收消息的一方。 消费者连接到 RabbitMQ 服务器,并订阅到队列上。当消费者消费一条消息时,只是消费消息的消息体(payload)。在消息路由的过程中,消息的标签会丢弃,存入到队列中的消息只有消息体,消费者也只会消费到消息体,也就不知道消息的生产者是谁,当然消费者也不需要知道。 Broker: 消息中间件的服务节点。 对于 RabbitMQ 来说,一个 RabbitMQ Broker 可以简单地看作一个 RabbitMQ 服务节点,或者 RabbitMQ 服务实例。大多数情况下也可以将一个 RabbitMQ Broker 看作一台服务器。 生产者将消息存入

Springboot 集成 RabbitMQ 后的消息确认机制

China☆狼群 提交于 2019-12-26 07:49:53
Springboot 集成 RabbitMQ 后的消息确认机制 上一篇文章介绍了 Springboot 如何集成 RabbitMQ,同时也形成了最基本的实现,不过这个实现好像有一点点问题,记得还在菊厂培训的时候,有一篇培训 PPT 讲过,极其健壮的服务需要达到一年下来,平均只有一到两个小时不能提供服务,反过来就是说,程序可能会在这一两个小时中宕机,宕机意味着数据丢失。就例如我们讲到的 RabbitMQ,假如我们在处理某一条数据的过程中宕机了,程序没有完成处理过程不会正常返回,同时 RabbitMQ 上这条消息因为已经发送给消费者,所以不会保留,那么这条未处理完的数据是不是就丢失了。RabbitMQ 给了我们一个保护机制,手动回复 ack,上一篇文章使用了默认的自动 ack 就无法避免这个问题。 注:后面代码都是对上一篇文章的程序小小改动后测试的 修改手动回复 ack 配置文件 增加开启手动回复的配置 修改的配置信息如下 #rabbitmq相关配置 spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest # 开启发送失败退回 spring.rabbitmq.publisher-returns=true #

RabbitMQ之消息模式2

我的梦境 提交于 2019-12-25 19:59:54
本章目标 消费端限流 消息的ACK与重回队列 TTL消息 死信队列 消费端限流 什么是消费端的限流? 假设一个场景,首先,我们RabbitMQ服务器有上万条未处理的消息,我们随便打开一个消费者客户端,会出现下面情况: 巨量的消息瞬间全部推送过来,但是我们 单个客户端无法同时处理这么多数据! 消费端限流RabbitMQ提供的解决方案 RabbitMQ提供了一种qos(服务质量保证)功能,即在 非自动确认消息 的前提下,如果一定数目的消息(通过基于Consumer或者Channel设置Qos的值)未被确认前,不进行消费新的消息 Void BasicQos(uint prefetchSize, ushort prefetchCount, bool global); prefetchSize : 0 不限制消息大小 prefetchSize :会告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ack,则该Consumer将block(阻塞)掉,直到有消息ack Global :true\false是否将上面设置应用于Channel;简单来说,就是上面限制是 Channel 级别的还是Consumer级别 【 注意 】 prefetchSize和global这两项,RabbitMQ没有实现,暂且不研究; prefetch_count在no_ask

给注册用户发红包,RabbitMQ实现(分布式事务2)

爷,独闯天下 提交于 2019-12-25 15:53:36
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 沿用昨天的代码,先定义交换机名称和routing key名称 死信队列 DLX,Dead Letter Exchange 的缩写,又死信邮箱、死信交换机。DLX就是一个普通的交换机,和一般的交换机没有任何区别。 当消息在一个队列中变成死信(dead message)时,通过这个交换机将死信发送到死信队列中(指定好相关参数,rabbitmq会自动发送)。 什么是死信呢?什么样的消息会变成死信呢? 消息被拒绝(basic.reject或basic.nack)并且requeue=false. 消息TTL过期 队列达到最大长度(队列满了,无法再添加数据到mq中) public interface UserCenterMq { /** * 用户系统exchange名 */ String MQ_EXCHANGE_USER = "user.topic.exchange"; /** * 发送红包routing key */ String ROUTING_KEY_POST_REDPACKET = "post.redpacket"; //String ROUTING_KEY_POST_REDPACKET = "post.#"; /** * 死信队列: */ String deadRoutingKey = "dead_routing

RabbitMQ-05-消费消息 有死信队列

妖精的绣舞 提交于 2019-12-25 15:50:10
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1、引入依赖 参考跟前一篇代码。 2、配置文件添加配置项 参考跟前一篇代码。 3、配置死信队列 import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.FanoutExchange; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.HashMap; import java.util.Map; @Configuration public class MQDeadConfig { public static final String MOON_FANOUT_EXCHANGE = "moon.fanout.exchange"; public static final String MOON_FANOUT

RabbitMQ-04-消费消息

那年仲夏 提交于 2019-12-25 15:46:03
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1、引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> 2、配置参数 spring.rabbitmq.addresses=10.10.60.65 spring.rabbitmq.port=5672

RabbitMQ的消息确认机制

三世轮回 提交于 2019-12-25 14:30:41
一、RabbitMQ消息确认机制 RabbitMQ的消息确认有两种: 1、对生产端发送消息的确认。这种是用来确认生产者将消息发送给交换器,交换器传递给队列的过程中,消息是否成功投递。发送确认分为两步,一是确认是否到达交换器,二是确认是否到达队列。 2、对消费端消费消息的确认。这种是确认消费者是否成功消费了队列中的消息。 二、RabbitMQ对生产端发送消息的确认 rabbitmq对生产端发送消息的确认分为事务和实现confirm机制。不过一般不使用事务,性能消耗太大。对生产端的confirm机制参见: https://www.cnblogs.com/alan6/p/11483419.html 三、消费端消费消息后对RabbitMQ的确认 为了保证消息能可靠到达消费端,RabbitMQ也提供了消费端的消息确认机制。消费者在声明队列时,可以指定noAck参数,当noAck=false时,RabbitMQ会等待消费者显式发回ack信号后才从内存(和磁盘,如果是持久化消息的话)中移去消息。否则,RabbitMQ会在队列中消息被消费后立即删除它。 采用消息确认机制后,只要令noAck=false,消费者就有足够的时间处理消息(任务),不用担心处理消息过程中消费者进程挂掉后消息丢失的问题,因为RabbitMQ会一直持有消息直到消费者显式调用basicAck为止。 消费端消息的确认分为:自动确认

RabbitMQ Centos6.8安装

纵饮孤独 提交于 2019-12-25 12:15:38
笔者所在业务环境 springcloud 1.5.8 jdk1.8 软件安装包百度网盘链接: https://pan.baidu.com/s/1Augp_VYZTfRMSQkchkbx-w 提取码: neqh 也是目前产品中线上用的版本 一、安装编译工具,安装Erlang之前需要进行编译工具安装,通过执行以下命令就可以完成安装。 yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel 二、安装和配置Erlang #进入上传安装工具存放目录 cd /root #解压erlang tar xvf otp_src_20.3.tar.gz #进入解压erlang目录 cd otp_src_20.3 #配置 '--prefix'指定的安装目录,必须记住这个目录下面需要修改此目录 ./configure --prefix=/usr/local/erlang --with-ssl -enable-threads -enable-smmp-support -enable-kernel-poll --enable-hipe --without-javac #安装 make && make install #配置环境变量 vi /etc/profile 在你配置jdk等环境变量的地方加入 #使环境变量生效

RabbitMQ. Masstransit. Virtual Hosts.

天大地大妈咪最大 提交于 2019-12-25 09:42:25
问题 how can I create virtual host from masstransit service bus configuration? I mean, for example, I deployed my app to some new PC and it should create new virtual host for itself. I'm trying do this like this: var bus = ServiceBusFactory.New(sbc => { sbc.UseRabbitMq(); sbc.UseHealthMonitoring(10); sbc.ReceiveFrom("rabbitmq://localhost:5672/mynewcustomvhost/myqueue?temporary=true"); }); But getting error: "No Obvious Problems says ConfigurationResult" Why so? 回答1: Try this: ServiceBusFactory.New

HA RabbitMQ without set mirror policy

混江龙づ霸主 提交于 2019-12-25 08:48:39
问题 I set up lab about ha for rabbitmq using cluster and mirror queue. I am using centos 7 and rabbitmq-server 3.3.5. with three server (ha1, ha2, ha3). I have just joined ha1 and ha2 to ha3, but do not set policy for mirror queue. When I test create queue with name "hello" on ha1 server, after i check on ha2, and ha3 using rabbitmqctl list queue, hello queue is exist on all node on cluster. I have a question, why i do not set policy to mirror queue on cluster, but it automatic mirror queue have