消息中间件在工作中一般都不会采用单机模式的,该篇其实是对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的一些问题总结的更多相关文章

  1. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  2. RabbitMq应用二

    在应用一中,基本的消息队列使用已经完成了,在实际项目中,一定会出现各种各样的需求和问题,rabbitmq内置的很多强大机制和功能会帮助我们解决很多的问题,下面就一个一个的一起学习一下. 消息响应机制 ...

  3. 如何优雅的使用RabbitMQ

    RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具.消息队列的使用场景大概有3种: 1.系统集成,分布式系统的设 ...

  4. RabbitMq应用一的补充(RabbitMQ的应用场景)

    直接进入正题. 一.异步处理 场景:发送手机验证码,邮件 传统古老处理方式如下图 这个流程,全部在主线程完成,注册->入库->发送邮件->发送短信,由于都在主线程,所以要等待每一步完 ...

  5. RabbitMq应用一

    RabbitMq应用一 RabbitMQ的具体概念,百度百科一下,我这里说一下我的理解,如果有少或者不对的地方,欢迎纠正和补充. 一个项目架构,小的时候,一般都是传统的单一网站系统,或者项目,三层架构 ...

  6. 缓存、队列(Memcached、redis、RabbitMQ)

    本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...

  7. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

  8. windows下 安装 rabbitMQ 及操作常用命令

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...

  9. RabbitMQ + PHP (三)案例演示

    今天用一个简单的案例来实现 RabbitMQ + PHP 这个消息队列的运行机制. 主要分为两个部分: 第一:发送者(publisher) 第二:消费者(consumer) (一)生产者 (创建一个r ...

  10. RabbitMQ + PHP (二)AMQP拓展安装

    上篇说到了 RabbitMQ 的安装. 这次要在讲案例之前,需要安装PHP的AMQP扩展.不然可能会报以下两个错误. 1.Fatal error: Class 'AMQPConnection' not ...

随机推荐

  1. 编程相关术语(Python)

    1. 程序的组成 程序 (program):(1)由一系列定义计算机如何执行计算的指令组成.(本质) (2)程序(算法)由对象.表达式和语句组成.(元素) 1.1程序的指令类型 输入 (input): ...

  2. 死磕Spring之AOP篇 - Spring AOP自动代理(一)入口

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  3. Chrome扩展开发基础教程(附HelloWorld)

    1 概述 Chrome扩展开发的基础教程,代码基于原生JS+H5,教程内容基于谷歌扩展开发官方文档. 2 环境 Chrome 88.0.4324.96 Chromium 87.0.4280.141 B ...

  4. 后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)

    1 前言&概述 这篇文章是基于这篇文章的更新,主要是更新了一些技术栈以及开发工具的版本,还有修复了一些Bug. 本文是SpringBoot+Android+MySQL的增删查改的简单实现,用到 ...

  5. 磁盘lvm管理

    1.磁盘接口: 从整体的角度上,硬盘接口分为IDE.SATA.SCSI和SAS四种,IDE接口硬盘多用于家用产品中,也部分应用于服务器,SCSI接口的硬盘则主要应用于服务器市场,而SAS只在高端服务器 ...

  6. JAVAEE_Servlet_08_HTTP状态码以及错误页面设置

    HTTP协议状态码 * HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用, HTTP状态码共分为5种类型: - 1** 信息,服务器收到请求,需要请求者 ...

  7. python 匿名函数,内置函数

    一 :匿名函数 匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使 ...

  8. 09- monkey命令详解

    安装模拟器 如果你没有手机可以安装个模拟器,如果有手机了,忽略此步骤. 1.下载模拟器:http://www.xyaz.cn/ 2.安装:直接默认安装. 3.打开安卓模拟器,设置-关于手机-点击版本号 ...

  9. input.focus()在IOS上失效的解决方法

    之前在iphone上做开发时遇到一个问题,在一般的正常浏览器上输入以下代码: 1 2 var apple = document.getElementById('abc'); apple.focus() ...

  10. windows内核开发环境的简易搭建

    一.windows内核开发需要的软件 1.WDK 2.WinDbg 3.virtualKD 4.DebugView 5.Visual C++ 6.0 6.VMware Workstation 二.wi ...