RabbitMQ

探索 OpenStack 之(14):OpenStack 中 RabbitMQ 的使用

主宰稳场 提交于 2020-03-18 04:40:24
本文是 OpenStack 中的 RabbitMQ 使用研究 两部分中的第一部分,将介绍 RabbitMQ 的基本概念,即 RabbitMQ 是什么。 第二部分 将介绍其在 OpenStack 中的使用。 1 RabbitMQ 的基本概念 RabbitMQ 是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。 AMQP 是一个定义了在应用或者组织之间传送消息的协议的开放标准 (an open standard for passing business messages between applications or organizations),它最新的版本是 1.0。AMQP 目标在于解决在两个应用之间传送消息存在的下列问题: 网络是不可靠的 =>消息需要保存后再转发并有出错处理机制 与本地调用相比,网络速度慢 =>得异步调用 应用之间是不同的(比如不同语言实现、不同操作系统等) =>得与应用无关 应用会经常变化 =>同上 AMQP 使用异步的、应用对应用的、二进制数据通信来解决这些问题。 RabbitMQ 是 AMQP 的一种实现,它包括Server (服务器端)、Client (客户端) 和 Plugins (插件)。RabbitMQ 服务器是用 Erlang 语言编写的,其最新版本是刚刚(2015/02/11)发布的 3.4.4 ,而

RabbitMQ3.7.12-1 安装记录

こ雲淡風輕ζ 提交于 2020-03-17 20:05:16
某厂面试归来,发现自己落伍了!>>> linux 安装 RabbitMQ3.7.12-1 记录 安装Erlang依赖环境 相关命令 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash 查看结果 https://packagecloud.io/rabbitmq/erlang/el/7/x86_64/repodata/repomd.xml: [Errno -1] Gpg Keys not imported, cannot verify repomd.xml for repo rabbitmq_erlang Generating yum cache for rabbitmq_erlang-source... The repository is setup! You can now install packages. 导入rabbitmq签名密钥(使RPM工具信任存储库中提供的包上的签名) rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc 这里需要注意

PHP实现RabbitMQ消息队列

◇◆丶佛笑我妖孽 提交于 2020-03-17 14:40:35
某厂面试归来,发现自己落伍了!>>> 先安装PHP对应的RabbitMQ,这里用的是 php_amqp 不同的扩展实现方式会有细微的差异. php扩展地址: http:// pecl.php.net/package/am qp 具体以官网为准 http://www. rabbitmq.com/getstarted .html 介绍 config.php 配置信息 BaseMQ.php MQ基类 ProductMQ.php 生产者类 ConsumerMQ.php 消费者类 Consumer2MQ.php 消费者2(可有多个) config.php <?php return [ //配置 'host' => [ 'host' => '127.0.0.1', 'port' => '5672', 'login' => 'guest', 'password' => 'guest', 'vhost'=>'/', ], //交换机 'exchange'=>'word', //路由 'routes' => [], ];  BaseMQ.php <?php /** * Created by PhpStorm. * User: pc * Date: 2018/12/13 * Time: 14:11 */ namespace MyObjSummary\rabbitMQ; /** Member *

RabbitMQ解决分布式事务问题

亡梦爱人 提交于 2020-03-16 17:58:46
SpringBoot消息重试机制 消息重试机制幂等性 如何合适选择重试机制 情况1: 消费者获取到消息后,调用第三方接口,但接口暂时无法访问,是否需要重试? 需要重试 情况2: 消费者获取到消息后,抛出数据转换异常,是否需要重试? 不需要重试 总结:对于情况2,如果消费者代码抛出异常是需要发布新版本才能解决的问题,那么不需要重试,重试也无济于事。应该采用日志记录+定时任务job健康检查+人工进行补偿 消费者如果保证消息幂等性,不被重复消费 产生原因:网络延迟传输中,会造成进行MQ重试中,在重试过程中,可能会造成重复消费。 解决办法: 使用全局MessageID判断消费方使用同一个,解决幂等性。 基于全局消息id区分消息,解决幂等性 生产者: 请求头设置消息id(messageId) @Component public class FanoutProducer { @Autowired private AmqpTemplate amqpTemplate; public void send(String queueName) { String msg = "my_fanout_msg:" + System.currentTimeMillis(); Message message = MessageBuilder.withBody(msg.getBytes())

应对MQ缺点的办法

牧云@^-^@ 提交于 2020-03-16 11:49:48
某厂面试归来,发现自己落伍了!>>> 1.消息丢失怎么办?(消息的可靠性传输) 消息的丢失可能会出现在三个地方: (1)生产者弄丢数据 生产者将数据发送到RabbitMQ的时候,可能数据就在半路给搞丢了,因为网络啥的问题,都有可能。怎么解决? ①事务 :生产者发送数据之前开启RabbitMQ事务(channel.txSelect),然后发送消息,如果消息没有成功被RabbitMQ接收到,那么生产者会收到异常报错,此时就可以回滚事务(channel.txRollback),然后重试发送消息;如果收到了消息,可以提交事务(channel.txCommit)。但是问题是,RabbitMQ事务机制一搞,基本上吞吐量会下来,因为太耗性能。 ②confirm模式 :在生产者那里设置开启confirm模式之后,你每次写的消息都会分配一个唯一的id,然后如果写入了RabbitMQ中,RabbitMQ会给你回传一个ack消息,告诉你说这个消息ok了。如果RabbitMQ没能处理这个消息,会回调你一个nack接口,告诉你这个消息接收失败,你可以重试。而且你可以结合这个机制自己在内存里维护每个消息id的状态,如果超过一定时间还没接收到这个消息的回调,那么你可以重发。 所以一般在生产者这块避免数据丢失,都是用confirm机制的。 (2)Mq弄丢数据 就是RabbitMQ自己弄丢了数据

RabbitMQ的下载、安装

空扰寡人 提交于 2020-03-16 09:07:48
下载 有windows版的,用得不多。 运维一般用的是tar.xz,最符合需求,但需要自己配置很多东西,有些麻烦。 我们使用最简单的rpm即可。rpm对新手友好,环境变量什么的自动给你配好,很简单,但安装配置使用的都是预置选项,有些地方可能不太符合需求。 RabbitMQ是Erlang写的,需要配置Erlang环境。查看推荐的erlang版本,然后到erlang官网下载。 源码、文档、windows版,这些都不是我们想要的,往下滑,找rpm安装包 点进去选择需要的版本下载。 安装 1、先安装erlang的依赖 yum install epel-release unixODBC unixODBC-devel SDL 如果不先安装erlang的依赖,安装erlang时会报错:没有提供xxx。此外erlang还需要一些依赖,安装erlang时会自动提示,那时候再安装。 2、安装erlang yum install esl-erlang_22.2.2-1~centos~8_amd64.rpm 3、安装rabbitmq server   yum install rabbitmq-server-3.8.3-1.el8.noarch.rpm 默认安装目录是/usr/lib/rabbitmq,默认已经把rabbitmq安装为服务(默认不会开机自启)。 4、开启rabbitmq的控制台 cd

centos6安装rabbitmq

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-16 08:31:57
一、安装依赖包 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz 二、下载erlang wget https://packages.erlang-solutions.com/erlang/esl-erlang/FLAVOUR_1_general/esl-erlang_21.0.5-1~centos~6_amd64.rpm 三、下载rabbitmq wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.14/rabbitmq-server-3.7.14-1.el6.noarch.rpm 四、安装erlang rpm -ivh esl-erlang_21.0.5-1~centos~6_amd64.rpm 报错 warning: esl-erlang_21.0.5-1~centos~6_amd64.rpm: Header V4 RSA/SHA1 Signature, key ID a14f4fca: NOKEY error: Failed dependencies: libwx_baseu-2

RabbitMQ之与Spring集成

纵然是瞬间 提交于 2020-03-15 08:00:25
Maven配置 <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>3.6.0</version> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>1.6.0.RELEASE</version> </dependency> 增加rabbitmq.properties文件并引入到spring中 mq.host=127.0.0.1 mq.username=zns mq.password=123456 mq.port=5672 用户名和密码可以访问http://localhost:15672登录后台设置, 注意:5672是连接端口,15672是管理界面的端口 增加spring-rabbitmq.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001

Ubuntu上安装和使用RabbitMQ

本小妞迷上赌 提交于 2020-03-14 04:23:18
Ubuntu上安装和使用RabbitMQ 1. 安装RabbitMQ服务软件包 输入以下命令进行安装 #apt install rabbitmq-server 2.安装完成后在rabbitMQ中添加用户 命令:#rabbitmqctl add_user tiankafei tiankafei 将用户设置为管理员(只有管理员才能远程登录) 命令:#rabbitmqctl set_user_tags tiankafei administrator 同时为用户设置读写等权限 命令:#rabbitmqctl set_permissions -p / tiankafei ".*" ".*" ".*" 3.安装RabbitMQ监控管理插件进行RabbitMQ的管理 命令:#rabbitmq-plugins enable rabbitmq_management 插件rabbitmq_management启动成功后就可以通过web页面进行RabbitMQ的监控和管理 4.使用rabbitmq_management插件进行监控和管理 使用firefox浏览器登录:http://192.168.12.111:15672 在登录页面使用 guest/guest用户名和密码登录RabbitMQ管理系统,在系统中可以对RabbitMQ服务进行channel,queue,用户等的管理 PS

处理线上RabbitMQ队列阻塞

烂漫一生 提交于 2020-03-12 19:13:11
前言   那天我和同事一起吃完晚饭回公司加班,然后就群里就有人@我说xxx商户说收不到推送,一开始觉得没啥。我第一反应是不是极光没注册上,就让客服通知商户,重新登录下试试。这边打开极光推送的后台进行检查。后面反应收不到推送的越来越多,我就知道这事情不简单。 事故经过   由于大量商户反应收不到推送,我第一反应是不是推送系统挂了,导致没有进行推送。于是让运维老哥检查推送系统各节点的情况,发现都正常。于是打开RabbitMQ的管控台看了一下,人都蒙了。已经有几万条消息处于 ready 状态,还有几百条 unacked 的消息。   我以为推送服务和MQ连接断开了,导致无法推送消息,于是让运维重启推送服务,将所有的推送服务重启完,发现 unacked 的消息全部变成 ready ,但是没过多久又有几百条 unacked 的消息了,这个就很明显了能消费,没有进行 ack 呀。   当时我以为是网络问题,导致mq无法接收到 ack ,让运维老哥检查了一下,发现网络没问题。现在看是真的是傻,网络有问题连接都连不上。由于确定的是无法 ack 造成的,立马将 ack模式 由原来的 manual 改成 auto 紧急发布。将所有的节点升级好以后,发现推送正常了。   你以为这就结束了其实并没有,没过多久发现有一台MQ服务出现异常,由于生产采用了 镜像队列 ,立即将这台有问题的MQ从集群中移除