RabbitMQ入门简介

官方文档:https://www.rabbitmq.com/getstarted.html

队列Queue

订阅消息通过AMQP的basic.consume进行持续订阅,而单条的使用basic.get,其原理仍然是订阅消息队列,但是在获取到一条消息之后就会断开,这样一次只获取一条。
消息订阅需要消费者的确认:basic.Ack命令显示的向rabbitmq服务器进行消息确认。消费者在消费或者拒绝最近接收的一条消息后,就能从队列中自动获取到下一条消息

接收到消息后,在确认之前断开连接,认定为消息未分发,会重新发给另一个消费者,另一方面:在接收消息后不确认,rabbitmq将不会再发送其他消息,从而防止过载
在接收消息后,拒绝消息,
1.使用basic.reject 命令,表示拒绝该消息,命令中的参数requeue是true,则表示重新分发。如果为false,则表示移除消息,移除消息还有一个方法是使用basic.ack进行消息确认,这样就可以简单的移除消息啦。
2.断开连接,这样会认定消息未分发而发给另一个消费者

  • 创建队列:
    AMQP中的queue.declare进行创建 队列设置的参数 exclusive ,auto-delete passive设置为true时,可以检查队列是否存在

交换器Exchange和绑定Binding

  • 绑定键(binding key) 队列通过绑定键绑定到交换器,而交换器负责接收消息时如何把消息分配到对应路由。消息进入服务器,消息将拥有一个路由键,交换器通过消息路由键和队列注册绑定键进行匹配,从而进行分发!

  • 交换器:direct fanout,topic,headers。headers交换器和direct功能相类似,只是在匹配时时按照消息的header而不是路由键进行,效率差。因此没有再使用了。
    1.direct类型交换器是直接交换器:如果路由键==绑定键,就路由到对应的队列。这个交换器中的路由键是在绑定队列到exchange时使用的bindingkey的集合(可以设置多个)


    image.png

服务器中会有一个default的默认交换器,在不声明exchange直接binding时,会把Queue绑定到default的exchange上,该exchange的bindingkey==Queue.Name。在publish消息时,publish中的exchange为空,直接publish指向Queue,这样就会直接发送消息到default exchange,exchange自动给message添加上Queue.Name作为路由键。
2.fanout交换器,把消息广播发送到该交换器上的所有附加队列,这样每个队列都获取到消息,从而进行不同的逻辑处理。

image.png

3.topic交换器:通过设置binding key作为通配规则来进行消息路由匹配,如:.message,表示后缀为.message的所有消息都会发送进来,‘#’表示所有规则匹配,’‘表示任意字符,中间的‘.’则表示了分隔功能.topic功能可以通过主题匹配模式进行分发路由,这时publish消息都是publish到exchange,并且给定routing key,由exchange来进行route到不同Queue中!

image.png

Vhost 虚拟主机和隔离机制:

vhost是amqp的基础,必须在连接时进行指定。默认虚拟主机是“/”

队列的arguments

队列在declare时可以设置一个args集合,用来定义queue的一些属性。

名字 key 说明
messageTTL x-message-ttl 参数的value是一个毫秒单位的数字,但是要注意太大的数字可能会导致失效,该参数也可以用在发送消息时作为properties添加,对单条信息设置过期时间
auto expire x-xipires value是毫秒单位的数字,表示队列自动删除前的空闲等待时间
Max length x-max-length 设置队列中可以拥有的消息的数量,超过这个数量将会从队列头开始丢弃、若有死信exchange,则会推送到dlx中
Max length btyes x-max-length-bytes value是单位byte的数字,表示队列能存储最多多少大小的信息。和maxlength作用相同,一个是个数,一个是大小,两个同时可用,先到达哪个限制都可以开始生效,同样是超过队列大小限制后,从队列头开始丢弃消息
overflow behavior x-overflow value是{“drop-head”,"reject-publish","reject-publish-dlx"},如果队列是quorum类型的则只能是“drop-head”
dead letter exchange x-dead-letter-exchange value是死信交换器的名字,当队列中的消息1.被消费者basic.reject/nack,requeue设置为false时,消息会推送到DLX中;2.消息过期;3.队列overflow之后(此时x-overflow=“drop-head”)
dead letter routing key x-dead-letter-routing-key value是一个路由键,在消息发送到死信交换器时会使用该路由键,如果不设置,则使用消息的原来的路由键值。
single active consumer x-single-active-consumer value 是true、false,表示队列是否是单一活动消费者,true时,注册的消费组内只有一个消费者消费消息,其他被忽略,false时消息循环分发给所有消费者(默认false)
maximum priority x-max-priority value是一个数字(0255,推荐110),表示队列中的消息优先级属性的分级,开启了priority的队列,在发送消息到该类队列时可以设置message属性:priority的大小(默认不开启)
lazy mode x-queue-mode value是{“default”,“lazy"},默认模式是消息尽量维护在内存中,lazy模式则会尽早的把内存中的消息持久化到磁盘上,减小内存开销
master locator x-queue-master-locator 在集群模式下设置镜像队列的主节点信息:1.random:随机一个节点作为主节点;2.min-masters:表示主节点配置在拥有最少主节点的集群节点上;3.client-local使用与client向连接的集群节点作为主节点

集群和镜像队列

rabbitmq的队列在集群模式下,默认是只存在在单个集群cluster上的,而exchange和bindings信息则是所有集群cluster上进行同步且保持一致性。

如何实现队列的高可用?
队列queues可以配置镜像队列,镜像队列是在多个cluster上设置相同slave,实现master-slave模式。镜像
镜像队列的所有操作都在master上,而不做负载均衡工作,slave仅是用作可用性的备份工作,在master不可用时,资历最老的slave会晋升为master。

  • master配置
    可以在queue的定义arguments中通过master locator定义队列的master节点选举确定策略。
  • 镜像配置
    镜像配置主要通过设置policy来实现。


    网站管理界面

    配置policy

    在定义policy时,主要参数ha-mode和ha-params来控制镜像队列的配置情况,ha-sync-mode来设置消息同步策略

ha-mode ha-params Result
all 不需要设置 在集群中的每个cluster上都设置镜像。当一个节点添加到集群中时,这个节点同样会有相应的镜像(镜像会根据policy设置的进行自动添加)
exactly 具体数量 指定在集群中设置镜像队列的节点个数。如果集群中节点的个数小于count的值,那么所有的节点都会配置镜像。如果其中一个节点上的镜像挂掉,那么会在另一个节点上生成新的镜像,以保持镜像队列的格式 ha-mode:exactly和ha-promote-on-shutdown:always一起使用将会很危险
nodes cluster 的id list 在指定的节点列表上设置镜像。节点名称可以通过rabbitmqctl cluster_status命令获取,通常名称是“rabbit@hostname”的这种形式。如果这些指定的节点都处于不可用状态(宕机或者关闭服务等),那么客户端程序会在自己所连接的那么节点上创建queue。
参数 说明
ha-sync-mode automatic/manual (默认)manual模式在新的镜像队列加入时,不同步以前的消息,仅仅从加入后开始镜像,automatic模式则会自动同步当前所有的消息到镜像队列,注意:在进行同步消息时,会阻塞队列,直到同步完成
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981阅读 15,908评论 2 11
  • 1.什么是消息队列 消息队列允许应用间通过消息的发送与接收的方式进行通信,当消息接收方服务忙或不可用时,其提供了一...
    zhuke阅读 4,467评论 0 12
  • 什么叫消息队列 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂...
    lijun_m阅读 1,343评论 0 1
  • 今天可能是个特殊的日子吧! 一大早群里的姐妹们都在纷纷吐槽自己的老公。 有个特别搞笑的说:"平时每天清早起床,我只...
    游走的孤魂阅读 231评论 0 2
  • 记得小的时候,在日出的清晨,或是在日落的黄昏,总能看到远处的山坡旁,有一缕缕的炊烟在农舍的屋顶上袅袅升起。那青烟在...
    刘炳清阅读 433评论 0 3