RabbitMQ 基础知识

RabbitMQ 常用命令

  1. 设置文件夹结构(日志文件夹,数据库文件夹 - 存储服务器信息,比如元数据、虚拟主机等
$ mkdir -p /var/log/rabbitmq 
$ mkdir -p /var/lib/rabbitmq/mnesia/rabbit
  1. 启动 - 生产环境运行 RabbitMQ 时,通常建一个 rabbitmq 用户,为其赋予文件夹权限,而非使用普通用户账户来运行所有命令。
$ ./sbin/rabbitmq-server
  1. 查看服务器状态
$ ./sbin/rabbitmqctl status
  1. vhost 和权限控制无法通过 AMQP 协议创建(不同于交换器,队列和绑定),需要通过 ./sbin/ 目录中的 rabbitmqctl 工具来创建
    远程控制方法: 通过指定 -n rabbit@[server_name] 来管理远程 RabbitMQ 节点,@ 左边是 Erlang 应用程序名称,这里永远是 rabbit,右边是服务器主机名或者 IP 地址。**需要确保运行 Rabbit 节点的服务器和运行 rabbitmqctl 的工作站安装了相同的 Erlang cookie
// 1. 创建虚拟机
$ ./sbin/rabbitmqctl add_vhost [vhost_name]
// 2. 删除虚拟机
$ ./sbin/rabbitmqctl delete_vhost [vhost_name]
// 3. 查看虚拟机
$ ./sbin/rabbitmqctl list_vhosts
  1. 重要概念
  1. vhost: 本质上是一个 mini 版的 RabbitMQ 服务器,拥有自己的交换器、绑定、队列...,更重要的是,它拥有自己的权限控制。这使得你能够安全地使用一个 RabbitMQ 服务器来服务众多应用程序,而不用担心别人删除你的队列,不用担心队列、交换器的命名冲突,有利于集群部署
    vhost 之于 Rabbit 就像是虚拟机之于物理服务器一样:它们通过在各个实例间提供逻辑上的分离,允许你为不同的应用程序安全保密的运行数据。
  2. 消费者对消息的确认和告诉生产者消息已经被接收了这两件事情毫不相关
    消费者通过确认命令告诉 RabbitMQ 它已经正确的接收了消息,同时 RabbitMQ 才能安全的把消息从队列删除
  3. 消费者和生产者都能通过 queue.declare 命令来创建队列,但如果消费者在同一条信道上订阅了另一个队列的话,就无法再声明队列了。必须先取消订阅,将信道置为 传输 模式
  4. 队列设置中一些有用的参数
  • exclusive(独占的):如果设置为 true,队列将变为私有的,此时只有你的应用程序才能消费队列消息,当你想要限制一个队列只有一个消费者的时候很有帮助
  • auto-delete:当最后一个消费者取消订阅的时候,队列就会自动删除,如果你需要临时队列只为一个消费者服务的话,请结合使用 auto-deleteexclusive。当消费者断开连接时,队列就被移除了
  1. basic.reject 允许消费者拒绝 RabbitMQ 发送的消息,如果把 reject 命令的 requeue 参数设置为 true 的话,RabbitMQ 会将消息发送给下一个订阅的消费者,如果设置为 false 的话, RabbitMQ 立即会把消息从队列中移除。
  2. dead letter 死信队列:用来存放那些被拒绝而不重入队列的消息,需要使用 reject 命令并将 requeue 参数设置为 false。死信队列让你通过检测 (拒绝 / 未送达) 的消息来发现问题
交换器、绑定、队列的关系图

QA:
1. 如果声明一个已经存在的队列会发生什么?

如果声明参数完全匹配现存队列,Rabbit 就什么也不做,并成功返回。如果参数不匹配的话,队列声明尝试会失败,如果只是想检测队列是否存在,则可以设置 queue.declarepassive(被动的) 为 true。在该设置下,如果队列存在,那么 queue.declare 命令会成功返回;如果队列不存在, queue.declare 命令也不会创建队列,而会返回一个错误。

2. 由生产者还是消费者来创建队列?

消费者才需要订阅队列,但是还要考虑生产者能否承担得起丢失消息。发送出去的消息如果路由到了不存在的队列的话,Rabbit 会忽略它们。如果不能承担消息丢失,最好生产者和消费者都尝试去创建队列

3. 如何保证消息的持久化?

必须设置成如下:

  • delivery mode(投递模式) 必须设置为 2 (persistent)持久化, 2 是非持久化(non-persistent)
  • 发送到持久化的交换器
  • 到大持久化的队列

4. 持久化原理?

先将消息写入磁盘上的一个持久化文件。当发布一条持久性消息到持久化交换器上时,Rabbit 会把消息写入到日志文件后才发送响应。注意:如果之后这条消息路由到了非持久化队列,它会自动从持久性日志中移除,并且无法从服务器重启中恢复。 一旦从持久化队列中消费了一条持久性消息(并且手动确认了它),Rabbit 在持久性日志中把这条消息标记为等待垃圾收集。

一. direct 交换器:如果路由键匹配的话,消息就被投递到对应的队列

image.png

二. fanout 交换器:当发送一条消息到 fanout 交换器时,它会把消息投递给所有附加在此交换器上的队列

image.png

应用场景:举例来说,一个 web 应用程序可能需要在用户上传图片时,用户相册必须清除缓存,同时用户应该得到积分奖励。你可以将两个队列绑定到图片上传交换器上。一个用于清除缓存,一个用户增加用户积分。当有新需求需要添加其他规则时,只要为新的消费者写一段代码,然后声明新的队列并将其绑定到 fanout交换器上即可,而不用修改原来的代码。

三. topic 交换器:

topic交换器消息流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容