请选择 进入手机版 | 继续访问电脑版

运维技术分享平台

 找回密码
 立即注册
首页
查看: 2191|回复: 1

rabbitmq学习笔记

[复制链接]

296

主题

305

帖子

1693

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1693
发表于 2020-4-15 17:22:04 | 显示全部楼层 |阅读模式
rabbitmq学习笔记
1. 什么是消息中间件
消息(message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串、JSON等,也可以很复杂,比如内嵌对象
消息队列中间件(Message Queue MiddleWare,简称为MQ)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
消息队列中间件,也可以称为消息队列或者消息中间件。它一般有两种传递模式:点对点(P2P,Point-to-Point)模式和发布/订阅(Pub/sub)模式。点对点模式是基于队列的,消息生产者发送消息到队列.消息消费者从队列中接收消息,队列的存在使得消息的异步传输成为可能。
发布订阅模式定义了如何向一个内容节点发布和订阅消息,这个内容节点称为主题(topic),主题可以认为是消息传递的中介,消息发布者将消息发布到某个主题,而消息订阅者则从主题中订阅消息。主题使得消息的订阅者与消息的发布者互相保持独立,不需要进行接触即可保证消息的传递,发布/订阅模式在消息的一对多广播时采用。
目前开源的消息中间件有很多,比较主流的有RabbitMQ、Kafka、ActiveMQ、RocketMQ等。面向消息的中间件(简称为MOM,Message Oriented Middleware) 提供了以松散藕合的灵活方式集成应用程序的一种机制。
它们提供了基于存储和转发的应用程序之间的异步数据发送,即应用程序彼此不直接通信,而是与作为中介的消息中间件通信。消息中间件提供了有保证的消息发送,应用程序开发人员无须了解远程过程调用(RPC)和网络通信协议的细节。
消息中间件适用于需要可靠的数据传送的分布式环境。采用消息中间件的系统中,不同的对象之间通过传递消息来激活对方的事件,以完成相应的操作.发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,再合适的时候再将消息转发给接收者,消息中间件能在不同平台之间通信,它常被用来屏蔽各种平台及协议之间的特性,实现应用程序之间的协同,其优点在于能够在客户和服务器端之间提供异步和同步的连接,并且在任何时刻都可以将消息进行传送或存储转发,这也是他比远程过程调用更进步的原因。
举例说明,如图1所示,应用程序A与应用程序B通过使用消息中间件的应用程序编程接口API(application program interface)发送消息进行通信
消息中间件将消息路由给应用程序B,这样消息就可存在于完全不同的计算机上,消息中间件负责处理网络通信,如果网络连接不可用,消息中间们会存储消息,直到连接变得可用,再将消息转发给应用程序B.灵活性的另一方而体现在,当应用程序A发送其消息时,应用程序B甚至可以处于不运行状态,消息中间们将保留这份消息,直到应用程序B开始执行并消费消息,这样还防止了应用程序A因为等待应用程序B消费消息而出现限塞。这种异步通信方式要求应用程序的设计与现在大多数应用不同。不过对于时间无关或并行处理的场景,它可能是一个极其有用的方法。
2. 消息中间件的作用
消息中间件凭借其独到的特性,在不问的应用场景下可以展现不同的作用:总的来说,消息中间件的作用可以概括如下:
解耦:在项目启动之初来预测将来会碰到什么需求是极共困难的。消息中间件在处理过程中间插入了一个隐含的,基于数据的接口层,两边的处理过程都要实现这一接口,这允许你独立地扩展或修改两边的处理过程,只需确保它们遵守同样的结构约束即可。
冗余(存储):有些情况下,处理数据的过程会失败,消息中间件可以把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。在把一个消息从消息中间件件中删除之前,需要你的处理系统明确地指出该消息已被处理完成,从而确保你的教据被安全地保存知道你使用完毕
扩展性:因为消息中间解耦了应用的处理过程,所以提高消息入队和处理的效率是很容易的,只要另外增加处理过程即可,不需要改变代码.也不需要调节参数。
削峰:在访问量剧增的情况下,应用仍然需要继续发挥作用·但是这样的突发流量并不常见。如果以能处理这类峰值为标准而投入资源,无疑是巨大的浪费。使用消息中间件能够使关键组件支撑突发访问压力,不会因为突发的超负荷请求而完全崩溃。
可恢复性:当系统一部分组件失效时,不会影响到整个系统.消息中间件降低了进程间的隅合度,所以即使一个处理消息的进程挂掉,加入消息中间件中的消息仍然可以在系统恢复后进行处理。
顺序保证:在大多数使用场景下,数据处理的顺序很重要,大部分消息中间件支持一定程度上的顺序性。
缓冲:在任何重要的系统中,都会存在需要不同处理时间的元素.消息中间件通过一个级缓冲层来帮助任务最高效率地执行,写入消息中间件的处理会尽可能快速,该缓冲层有助于控制和优化数据流经过系统的速度。
异步通信:在很多时候应用不想也不需要立即处理消息,消息中间件提供了异步处理机制,允许应用把一些消息放入消息中间件中。但并不立即处理它,在之后需要的时候再慢慢处理。
3. RabbitMQ的起源
RabbitMQ是采用Erlang讲言实现AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件,它最初起源于金触系统,用于在分布式系统中存储转发消息。
在此之前,有一些消息中间件的商业实现,比如微软的MSMQ(Microsoft Message Queue),IBMWebSphere等,由于高昂的价格,一般只应用于大型组织机构,它们需要可靠性,解耦及实时消息通信的功能。由于商业壁垒,商业MQ供应商想要解决应用通信的问题,而不是去创建标准来实现不同MQ产品的互通,或者允许应用程序更改MQ平台
为了打破这个壁垒,同时为了能够让消息在各个消息队列平台之间相互融 互通,JMS (Java Message Servrce)应运而生。JMS试图提供公共Java API的方式,隐藏单独MQ产品供应商提供的实际接口,从而跨越了壁垒,以及解决了互通问题,从技术讲,Java应用程序只需针对JMS API 编程,选择合适的MQ驱动即可,JMS 会打理好其他部分,ActiveMQ就是JMS的一种实现,不过尝试使用单独标准化接口来胶合众多不同的接口,最终会暴露出问题,使得应用 程序变得更加脆弱。所以急需一种新的消息通信标准化方案。
4. RabbitMQ的安装
RabbitMQ是由Erlang语言编写的,也正因为如此,在安装RabbitMQ之前需要安装Erlang。建议采用新版Erlang,这样可以获得较多的更新和改进,官网地址:http://www.erlang.org/downloads
n yum安装
yum -y install erlang
yum -y install rabbitmq-server
pip install pika             #安装python API
rabbitmq-server -detached   #启动
n 编译安装Erlang
编译安装Erlang
tar zxf otp_src_19.1.tar.gz
cd otp_src_19.1
./configure --prefix=/data/erlang
make
make install
错误No curses library functions found。
解决yum install ncurses-devel -y
添加环境变量
export ERLANG_HOHE=/data/erlang
export PATH=$ERLANG_HOHE/binPATH
最后执行source /etc/profile让文件生效。可以执行erl命令来验证是否安装成功
n 编译安装RabbitMQ
tar xf rabbitmq-server-generic-unix-3.6.12.tar.xz
mv rabbitmq_server-3.6.12/ /data/rabbitmq
添加环境变量
echo 'export RABBITMQ_HOHE=/data/rabbitmq' >>/etc/profile
echo 'export PATH=$RABBITMQ_HOHE/sbinPATH' >>/etc/profile
source /etc/profile
最后执行source /etc/profile让文件生效。
echo 'export PATH=$PATH:/usr/local/erlang/bin' >>/etc/profile
5. RabbitMQ基础知识总结
1.对于每一个队列都会默认绑定默认交换器,bindingkey与队列名同名,默认Exchange类型direct
2.对于非持久化的交换器,集群中的所有节点同时重启才会删除,对于非持久化的队列,只有队列所在的节点重启,队列才会删除
3.重复声明queue或Exchange,在不设置passive=True,的情况下,重复声明,如果参数有变化会报出异常,如果设置,则正常,但不会修改已经创建的queue或Exchange,不存在会报出异常。此参数为True表示获取queue或exchange的信息,为False表示声明
4.python RabbitMQ 使用mandatory发送消息必须开启投递确认模式,mandatory确保消息到达某个队列,投递确认模式确保消息到达RabbitMQ。如果备份交换器和mandatory参数一起使用,那么mandatory参数无效。
5.延迟队列:如果延迟队列超时,其中的消息会抛弃,在延迟队列超时之前如果队列头部的消息超时会直接抛向死信交换器,如果头部消息未超时则全部抛弃(尽管其后有超时消息)
6.消息ttl可以在声明队列时设置,也可以在发送消息时设置,两者都是用则最小者生效,延迟队列应该通过声明队列设置消息超时时间
7.在确认模式,交换器不存在会抛出异常;mandatory为true,交换器不存在不会返回结果
8.rabbitmq什么时候拒绝消息:如果RabbitMQ因为自身内部错误导致消息丢失,就会发送一条nack(Basic.Nack)命令
9.集群节点崩溃时,该节点的队列和关联的绑定都消失了,在其他节点声明此队列会报404错误
10.创建队列镜像,默认同步模式为manual,已存在的消息不会立即同步,新生产的消息会同步,需要手动同步或者等待未同步的消息消费完则自动同步,当设置模式为automatic时会自动同步,当同步时服务不可用,所以不建议对生产环境中正在使用的队列进行操作。
11. rabbitmactl join_cluster 加入集群时指定一个节点名,而非集群名
12.移除节点时,被移除节点必须停止,在集群节点上操作移除,如果集群停止,则需要添加--offline参数
13.消费者qos不返回ack时,消息情况一直等待当连接断开时会存入队列
14. 在队列主从同步时,此队列服务不可用,并且从节点比较消耗内存,容易出现内存告警,如果内存不够,可能会同步阻塞

回复

使用道具 举报

1

主题

17

帖子

128

积分

注册会员

Rank: 2

积分
128
发表于 2020-4-30 11:11:37 | 显示全部楼层

回帖奖励 +1 金钱

谢谢分享,很有用哦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

首页

手机版|关于自己|运维技术分享平台

GMT+8, 2024-3-29 13:20 , Processed in 0.068895 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表