关于RabbitMQ的一些问题总结
消息中间件在工作中一般都不会采用单机模式的,该篇其实是对mq的高可用等等常见问题做一些归纳。
消息队列的高可用
普通集群与镜像集群模式,此处不做深究,另开一篇专门讲述此处
如何保证消息不被重复消费
保证消息队列幂等性,为什么会造成重复消费,正常消费时消费者在消费消息时候,消费完毕会发送一个确认信息给消息队列,消息队列知道该消息被消费,将其删除,RabbitMQ发送一个ACK确认消息,重复消费的原因,因为网络传输等故障,ack并没有传送到消息队列,消息队列不知道该消息已经消费过了,再次分发该消息
- 用该消息做数据库insert操作,负责对该消息做一个唯一主键,重复消费时,数据库中主键冲突,就不会产生脏数据
- 用该消息做redis set 操作,无论set 本来具备幂等性
- 准备第三方介质做消费记录。redis 给消息分配全局id,消费过该消息将其写入,以k-v 形式写入redis,消费者在开始消费前,应该先去redis中查询有无消费记录
如何保证消费的可靠性传输
- 生产者丢数据 rabbitmq提供transaction 以及 confirm模式确保生产者不丢消息,tralnsaction机制,在发送消息前,开启事务channel.txSe,然后发送消息,发送过程中出现异常,事务回滚,缺点是吞吐量下降;confirm模式,一旦channel进入confirm模式,所有在该信道上面发布的消息都会被指派一个唯一的ID,消息被投递到所匹配队列后,rabbitmq就会发送一个Ack给生产者,生产者知道消息以及正确到达目标队列,若rabbitMQ没能处理该消息,则会发送一个Nack消息,可进行重试操作
- 消息队列丢数据 开启持久化磁盘配置,持久化配置可与confirm机制配合使用,消息持久化磁盘后,再给生产者ACK消息,则在持久化磁盘之前,RabbitMQ挂了,生产者就收不到Ack信号,就会自动重发;持久化设置,queue 持久化标识durable设置为true,代表为持久队列,发送消息时deliveryModel =2
- 消费者丢数据 自动确认消息模式,消费者会自动确认收到消息,RabbitMQ会立即将消息删除,消费者出现异常没有处理该消息,则丢失该消息,改为手动确认即可
如何保证消息的顺序性
- 通过算法将需要保持先后顺序的消息放到同一个消息队列中,只用一个消费者去消费
- 为了吞吐量,多个消费者去消费的情况,例如在发微博,写评论三个异步操作,一个消费者先执行写评论的操作,微博未发,则写评论是失败的,等另一个消费者,先执行写微博的操作,再执行就可以成功,保持入队的有序性,出队以后顺序交给消费者自己去保证
关于RabbitMQ的一些问题总结的更多相关文章
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- RabbitMq应用二
在应用一中,基本的消息队列使用已经完成了,在实际项目中,一定会出现各种各样的需求和问题,rabbitmq内置的很多强大机制和功能会帮助我们解决很多的问题,下面就一个一个的一起学习一下. 消息响应机制 ...
- 如何优雅的使用RabbitMQ
RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具.消息队列的使用场景大概有3种: 1.系统集成,分布式系统的设 ...
- RabbitMq应用一的补充(RabbitMQ的应用场景)
直接进入正题. 一.异步处理 场景:发送手机验证码,邮件 传统古老处理方式如下图 这个流程,全部在主线程完成,注册->入库->发送邮件->发送短信,由于都在主线程,所以要等待每一步完 ...
- RabbitMq应用一
RabbitMq应用一 RabbitMQ的具体概念,百度百科一下,我这里说一下我的理解,如果有少或者不对的地方,欢迎纠正和补充. 一个项目架构,小的时候,一般都是传统的单一网站系统,或者项目,三层架构 ...
- 缓存、队列(Memcached、redis、RabbitMQ)
本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...
- 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)
Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...
- windows下 安装 rabbitMQ 及操作常用命令
rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...
- RabbitMQ + PHP (三)案例演示
今天用一个简单的案例来实现 RabbitMQ + PHP 这个消息队列的运行机制. 主要分为两个部分: 第一:发送者(publisher) 第二:消费者(consumer) (一)生产者 (创建一个r ...
- RabbitMQ + PHP (二)AMQP拓展安装
上篇说到了 RabbitMQ 的安装. 这次要在讲案例之前,需要安装PHP的AMQP扩展.不然可能会报以下两个错误. 1.Fatal error: Class 'AMQPConnection' not ...
随机推荐
- Flink状态管理与状态一致性(长文)
目录 一.前言 二.状态类型 2.1.Keyed State 2.2.Operator State 三.状态横向扩展 四.检查点机制 4.1.开启检查点 (checkpoint) 4.2.保存点机制 ...
- Vue3+Vite引入Echarts5.0图表库
1 概述 环境Vue3+Vite,需要引入ECharts库. 2 尝试 目前ECharts已更新到5.0版本,在Vue中引入并不难,npm/cnpm安装后在需要的组件中引入: import echar ...
- 研发团队管理:IT研发中项目和产品原来区别那么大,项目级的项目是项目,产品级的项目是产品!!!
前言 从事IT行业多年,一路从小杂兵成长为大团队Leader,对于研发整个体系比较清楚,其实大多人都经历过但是都忽略了的研发成本管控的一个关键的点就是研发过程中项目级和产品级的区别. 市场基本 ...
- CPF 入门教程 - 属性和事件(七)
CPF C#跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) CPF 入门 ...
- odoo字段属性列举
罗列一些Odoo中的字段属性,基本包含大部分的属性. 常用字段属性 平平无奇常用字段属性 string:字段的标题,在UI视图标签中使用.它是可选项,如未设置,会通过首字母大写及将空格替换成为下划线来 ...
- 10- JMeter5.1.1 工具快速入门
什么是JMeter JMeter是Apache组织开发的开源软件,由Java语言实现. 主要用于软件系统性能测试,他最初被设计用于web测试,后来被扩展到其他领域. Jmeter特点 http://w ...
- 08- adb常用命令以及模拟器链接adb命令
adb 命令简介 ADB即 Android debug bridge.是Android下面一个通用的调试工具. 熟练使用adb命令会大大增加开发效率,作为测试人员,熟练掌握adb,我们可以管理设备或手 ...
- PAT 乙级 -- 1005 -- 继续(3n+1)猜想
题目简述 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如 ...
- hdu1914 稳定婚姻问题
稳定婚姻问题就是给你n个男的,n个女的,然后给你每个男生中女生的排名,和女生心目中男生的排名,然后让你匹配成n对,使婚姻稳定,假如a和b匹配,c和d匹配,如果a认为d比b好,同时 ...
- Linux文件共享服务之Samba
目录 Samba Samba的配置 Samba Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Message Block的缩写,即为服务器消息块 ...