关于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 ...
随机推荐
- 磁盘挖矿时代开启——GitHub 热点速览 v.21.16
作者:HelloGitHub-小鱼干 本周的 GitHub 热点非常经常,因为一贫如洗的小鱼干突然发现了发家致富之道:磁盘挖矿.chia-blockchain 是一个将磁盘作为计算资源的项目,简而言之 ...
- kube-batch 创建的pod 一直是Pending
官网的例子 apiVersion: batch/v1 kind: Job metadata: name: qj-1 spec: backoffLimit: 6 completions: 6 paral ...
- k8s kubernetes给node节点添加标签和删除node节点标签
node节点IP 192.168.1.205 给节点添加标签的命令 添加label语法 kubectl label nodes <node-name> <label-key>= ...
- 前后端分离中的无痛刷新token机制
今天我们来说一说前后端分离中的无痛刷新token机制 博主先来分享一波福利,最近挖到的宝藏,刚开始学Java的同学看 https://www.bilibili.com/video/BV1Rx41187 ...
- Vue.js小案例、生命周期函数及axios的使用
一.调色框小案例: 随着三个滑动框的变化,颜色框的颜色随之改变 1.1.实例代码 <!DOCTYPE html> <html lang="en" xmlns:v- ...
- 使用var和不使用var的区别(全局变量/局部变量)
https://blog.csdn.net/czh500/article/details/80429133
- ThnikPHP3.2 学习链接整理
ThnikPHP3.2 学习链接整理 ThinkPHP3.2.3 U()方法的使用总结 看云手册 ThinkPHP3.2完全开发手册 TP3.2单字母函数 TP3.x中 M方法和D方法的区别
- addslashes,htmlspecialchars,htmlentities转换或者转义php特殊字符防止xss攻击以及sql注入
一.转义或者转换的目的 1. 转义或者转换字符串防止sql注入 2. 转义或者转换字符防止html非过滤引起页面布局变化 3. 转义或者转换可以阻止javascript等脚本的xss攻击,避免出现类似 ...
- Windows核心编程 第二十章 DLL的高级操作技术
第2 0章 D L L的高级操作技术 看了下这章的内容,谈不上高级,都是些常用相关,但是还是有一些细节需要注意. 20.1 DLL模块的显式加载和符号链接 如果线程需要调用D L L模块中的函数,那么 ...
- 类的两个装饰器classmethod、staticethod和内置魔术方法
一.两个装饰器@classmethod.@staticmethod @classmethod:把类中的绑定方法变成一个类方法,cls 就等于类名 有什么用? 1.在方法中任然可以引用类中的静态变量 2 ...