RabbitMQ消息的消费与持久化
作为消费者的客户端要消费Rabbitmq的消息,首先要建立与它某个队列的连接,具体连接时可指定队列的BindingKey和关系的exchange标识,Rabbitmq判断若已有队列通过BindingKey与exchange标识关联则允许消费者消费队列的消息,否则新建一个队列用指定的BindingKey与exchange关联,获取特定的消息。若果exchange是topic类型则也可用通配符‘#’获取所有发到这个exchange的消息。
rabbitmq一个队列类似一个消费群组,当有多个消费者都关注这个队列消息时,它会将消息平均分配给各个消费者。若果不同应用消费者想要订阅所有发到exchange的消息,则可以建不同的group消费。
rabbitmq默认消息、队列、交换器(exchange)都不具有持久化的性质,如果应用需要持久化功能,那么在声明时要配置好。首先交换器和队列的声明时要指定durable参数为true,这样重启后队列和交换器都会恢复。然后消息在发送时要在properties中指定delivery_mode = 2,这样服务重启后队列中的这种消息可以恢复。但消息的持久化不是一个强约束,涉及数据落地的时机及系统层面同步问题,若要尽可能提高消息的持久化有效性,可配置状态反馈的confirm mode。
状态反馈的目的是为了确认行为的结果。当你向exchange提交消息时,是否提交成功,是否送达到队列,队列中的消息是否被消费者正常消费等问题都要考虑。在AMQP中要确保消息业务可靠性只能使用事务,不过rabbitmq有些简便的扩展机制如状态确认可到达同样的目的。
rabbitmq中状态反馈分为发布状态反馈和提取状态反馈。具体发布消息时设置channel的confirm mode,这样对持久化消息被投递到一个持久化队列成功并且把数据写入磁盘时会给发送者一个状态确认;在未关闭消息的ack机制情况下,当消息被consumer从队列提取后,在未明确收到确认消息之前,队列中的消息不会被删除,而是变成等待确认状态,当consumer反馈成功给队列时,消息才会被删除,若consumer反馈拒绝给队列,则消息可能再被其它consumer提取。
https://www.zouyesheng.com/rabbitmq.html#toc11
RabbitMQ消息的消费与持久化的更多相关文章
- 压测应用服务对RabbitMQ消息的消费能力--实践脚本
最近运维跟我反馈我负责的应用服务线上监控到消费RabbitMQ消息队列过慢,目前只有20左右,监控平台会有消息积压的告警. 开发修改了一版应用服务的版本,提交给我做压测验证. 之前没有做过消息中间件的 ...
- Python RabbitMQ消息持久化
RabbitMQ消息持久化:就是将队列中的消息永久的存放在队列中. 处理方案: # 在实例化时加入durable=True来确认消息的实例化,客户端服务端都要写 channel.queue_dec ...
- Python操作rabbitmq消息队列持久化
消息队列持久化 Python操作rabbit消息队列的持久化,如下: # 创建一个名为balance的队列,对queue进行durable持久化设为True(持久化第一步)channel.queue_ ...
- RabbitMQ消息丢失问题和保证消息可靠性-消费端不丢消息和HA(二)
继续上篇文章解决RabbitMQ消息丢失问题和保证消息可靠性(一) 未完成部分,我们聊聊MQ Server端的高可用和消费端如何保证消息不丢的问题? 回归上篇的内容,我们知道消息从生产端到服务端,为了 ...
- 【朝夕专刊】RabbitMQ消息的持久化优先级
欢迎大家阅读<朝夕Net社区技术专刊> 我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为忠实读者,文末福利不要错过哦! 上篇文章介绍了R ...
- rabbitmq 消息持久化
rabbitmq 消息持久化 2016-02-18 11:19 224人阅读 评论(0) 收藏 举报 分类: 综合(15) 版权声明:本文为博主原创文章,未经博主允许不得转载. 二: 任务分发 & ...
- RabbitMQ消息发布和消费的确认机制
前言 新公司项目使用的消息队列是RabbitMQ,之前其实没有在实际项目上用过RabbitMQ,所以对它的了解都谈不上入门.趁着周末休息的时间也猛补习了一波,写了两个窗体应用,一个消息发布端和消息消费 ...
- springboot项目整合rabbitMq涉及消息的发送确认,消息的消费确认机制,延时队列的实现
1.引入maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...
- 使用EasyNetQ组件操作RabbitMQ消息队列服务
RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...
随机推荐
- Rem实现移动端适配
移动端适配 web页面跑在手机端(h5页面) 跨平台 基于webview() 基于webkit 常见适配方法 pc端采用display:inline-block,让div盒子横着排 移动web:采用定 ...
- Python连接SQLite数据库代码
import sqlite3 # create database conn = sqlite3.connect('test.db') #不存在就创建后再打开 print ("Opened d ...
- LM3S之boot loader学习笔记-1
LM3S之boot loader学习笔记-1 彭会锋 (首先声明,此系列文章编写参考了很多资料,其中一些内容是原版内容的引用和整理,并加入了一些自己的见解,我已经尽量标明引用部分,如有未全部标注部分, ...
- 聊一聊Spring AOP
前两天,在给新入职的同事做技术介绍时,讲到spring的AOP.使我又一次认识到,对于AOP,特别是spring AOP的理解,虽然大家都能说上来几句,但是许多人认识并不太全面,甚至可以说是一知半解- ...
- 关系型数据库事务遵循ACID原则
事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (Atomicity) 原子性 原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功 ...
- iptables详解(13):iptables动作总结之二
概述 阅读这篇文章需要站在前文的基础上,如果你在阅读时遇到障碍,请参考之前的文章. 前文中,我们已经了解了如下动作 ACCEPT.DROP.REJECT.LOG 今天,我们来认识几个新动作,它们是: ...
- node.js利用express连接mysql数据库
我们创建一个mysql.js (好像大神们,称呼这叫一个模块,然后暴露一个接口)用来连接数据库 var connction ={}; connction.mysql = { host:"lo ...
- LeetCode OJ:Swap Nodes in Pairs(成对交换节点)
Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...
- 关于javascript严格模式下七种禁止使用的写法
分享至javascript语言精髓与编程实践 开启严格模式(”use strict"): 在全局代码的开始处加入 在eval代码的开始处加入 在函数声明代码处加入 在new Function ...
- 浅析C#中ASP.NET页面的生存周期
一般来说,页要经历下表概述的各个阶段.除了页生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于页. 阶段 说明 页请求 页请求发生在页生命周期开始之前.用户请求页时,ASP.NET ...