消息队列
三个业务场景:解耦、异步、削峰
带来问题
系统可用性降低:外部依赖越多,越容易挂掉。
系统复杂性提高:重复消费,消息丢失,消息传递的顺序性
一致性问题: 一、如何保证消息的可靠性传输(如何处理消息丢失的问题)
从三个方面分析:
)生产者发送时弄丢了数据
解决方法1:生产者发送数据之前开启rabbitmq事务(channel.txtSelect),然后发送消息。
如果消息没有成功被rabbitmq接收到,生产者收到异常报错,回滚事物(channel.txRollback)。重发消息。
如果消息成功接收,提交事务(channel.txCommit)
缺点:事物机制,吞吐量会下来,因为太耗性能。 解决方法2:生产者开启confirm模式,每次写消息,会分配一个guid。
如果rabbitmq接收失败,会返回一个nack,重新发送。
如果rabbitmq接收成功,会返回一个ack。
事物机制是同步的,会阻塞。
confirm机制是异步的,消息rabbitmq接收了之后会异步回调你一个接口通知你这个消息接收到。
一般在生产者这块避免数据丢失,都是用confirm机制的。 )rabbitmq弄丢了数据
解决方法:开启rabbitmq的持久化,消息写入之后会持久化到磁盘。
两步:①创建queue时,durable设置为True
②发送消息时,deliveryMode设置为2 )消费端弄丢了数据
解决方法:ack机制,取消消费端的自动应答,变为手动应答,每次代码处理完成之后,程序里ack。
channel.basicConsume(QUEUE_NAME, false, consumer)//第二个参数false,表示手动应答。
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false)//返回确认状态 二、如何保证消息不被重复消费(保证消息消费时的幂等性)
解决办法:每个消息弄一个编号id,consumer消费了数据之后,每隔一段时间,会把自己消费过的消息的id提交一下。
但是这样还会有一个问题,重启,进程kill,consumer没来的及提交id,还是会重复消费?
这个从业务上解决比较好:
栗子:
消费一条往数据库插入一条,消费第二次的时候,判断是不是消费过了,直接扔到。 幂等性:就一个数据,或者一个请求,给你重复来多次,确保对应的数据是不会改变的,不能出错
栗子:数据库的话,先根据逐渐查下,如果有了,更新或者丢弃都行。
redis,直接弄一个set,天然幂等性。 三、如何保证消息的顺序性
解决办法1:用单线程消费,保证顺序性。
解决办法2:对消息进行编号,消费者处理时根据编号判断顺序。
rabbitmq:拆分多个queue,每个queue一个consumer,就是多一些queue而已,确实是麻烦点;
或者就一个queue但是对应一个consumer,然后这个consumer内部用内存队列做排队,然后分发给底层不同的worker来处理。 四、消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?
.队列满了,可能是消费端问题,多建几个临时消费者。
.过期时间(TTL),消息丢掉之后,从新导入,可以在高峰期过后操作。
假设1万个订单积压在mq里面,没有处理,其中1000个订单都丢了,你只能手动写程序把那1000个订单给查出来,手动发到mq里去再补一次 五、消息队列,该如何进行架构设计
可伸缩性:增加吞吐量和容量,参考kafka设计。
持久化:
高可用性:

参考文章:https://blog.csdn.net/HiBoyljw/article/details/85123099

为rabbitmq添加远程访问用户

[root@localhost sbin]# ./rabbitmqctl  list_users     #用户列表
Listing users ...
[root@localhost sbin]# ./rabbitmqctl add_user admin admin
Creating user "admin" ...
[root@localhost sbin]#./rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator] ...
[root@localhost sbin]#./rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
Setting permissions for user "admin" in vhost "/" ...
[root@localhost sbin]# ./rabbitmqctl list_users
Listing users ...
admin [administrator]
[root@localhost sbin]#

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. MS SQL作业Schedule的限制注意事项

      最近遇到了一个关于MS SQL作业Schedule下有限制的特殊案例,有一个作业,用户要求执行的时间为:9:30,14:30,16:30, 19:00,于是我设置了两个Schedule,其中一个每 ...

  2. GIT基本命令介绍

    1.git remote git remote -v| --verbose 查看仓库详细信息 git remote add <name> <url> 关联远程库.如果你本地新建 ...

  3. 洗礼灵魂,修炼python(72)--爬虫篇—爬虫框架:Scrapy

    题外话: 前面学了那么多,相信你已经对python很了解了,对爬虫也很有见解了,然后本来的计划是这样的:(请忽略编号和日期,这个是不定数,我在更博会随时改的) 上面截图的是我的草稿 然后当我开始写博文 ...

  4. python爬虫之天气预报网站--查看最近(15天)的天气信息(正则表达式)

    python爬虫之天气预报网站--查看最近(15天)的天气信息(正则表达式) 思路: 1.首先找到一个自己想要查看天气预报的网站,选择自己想查看的地方,查看天气(例:http://www.tianqi ...

  5. AndroidNDK开发中使用CMake编译JNI

    虽然一直在做NDK的开发工作,但是由于项目比较久远,都是使用Makefile进行底层编译,对于目前AndroidStudio官方提供的CMake编译方式并不是很了解,现在学习下这种已经不算新潮的新方式 ...

  6. Windows和Linux之间 rsync数据同步

    转载于   https://www.linuxidc.com/Linux/2014-01/95722p2.htm rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——rem ...

  7. (转)Spring Boot 2 (九):【重磅】Spring Boot 2.1.0 权威发布

    http://www.ityouknow.com/springboot/2018/11/03/spring-boot-2.1.html 如果这两天登录 https://start.spring.io/ ...

  8. Matplotlib 绘图 用法

    Matplotlib基础知识 一.Matplotlib基础知识 Matplotlib中的基本图表包括的元素 x轴和y轴 axis 水平和垂直的轴线 x轴和y轴刻度 tick 刻度标示坐标轴的分隔,包括 ...

  9. linux学习笔记整理(一)

    第二章  Linux基本操作 2.1 Linux网络相关概念和修改IP地址的方法2.2 关闭防火墙并设置开机开不启动2.3 临时和永久关闭Selinux2.4 设置系统光盘开机自动挂载2.5 配置本地 ...

  10. centos7下安装docker(15.6docker跨主机网络---Weave)

    Weave是weaveworks开发的容器网络解决方案.weave创建的虚拟网络可以将部署在多个主机上的容器连接起来.对于容器来说,weave就像一个巨大的网络交换机,容器可以直接通信,无需NAT和端 ...