阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

RabbitMQ基础入门指南

169次阅读
没有评论

共计 4122 个字符,预计需要花费 11 分钟才能阅读完成。

1、背景

1)选择 RabbitMQ,而不是 ActiveMQ/ZeroMQ/Apache Qpid 的原因:

(1)RabbitMQ 难以置信的容易安装和使用。

(2)除了 Qpid 外,RabbitMQ 是唯一实现了 AMQP 标准的代理服务器。

(3)正是由于 Erlang,RabbitMQ 集群不可思议的简单。

(4)RabbitMQ 比竞争对手更可靠,更能防止崩溃。

2、安装和运行(CentOS 7)

1)由于 RabbitMQ 是采用 Erlang 编写的,因此需要先安装该语言库:

[root@localhost ~]# wget http://erlang.org/download/otp_src_19.1.tar.gz

[root@localhost ~]# tar -zxvf otp_src_19.1.tar.gz

[root@localhost ~]# cd otp_src_19.1/
# 若运行 configure 脚本时出现 ”No curses library functions found” 错误,则执行 yum install ncurses-devel
[root@localhost otp_src_19.1]# ./configure

[root@localhost otp_src_19.1]# make && make install

# erl 命令输出如下信息时,表示安装成功
[root@localhost otp_src_19.1]# erl
Erlang/OTP 19 [erts-8.1] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V8.1  (abort with ^G)
1>

2)安装 RabbitMQ

(1)从 http://www.rabbitmq.com/download.html 获得压缩包(如 rabbitmq-server-3.6.6.tar.xz),解压得到 rabbitmq-server-3.6.6 目录。

(2)进入该目录,执行 make && make install。

3)运行:

[root@localhost rabbitmq-server-3.6.6]# bash ./deps/rabbit/scripts/rabbitmq-server

              RabbitMQ 3.6.6. Copyright (C) 2007-2016 Pivotal Software, Inc.
  ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
  ##  ##
  ##########  Logs: /var/log/rabbitmq/rabbit@localhost.log
  ######  ##        /var/log/rabbitmq/rabbit@localhost-sasl.log
  ##########
              Starting broker…
 completed with 0 plugins.

此时可执行如下命令检查服务器状态:

# 输出代理服务器的状态、运行中的应用程序和节点等
[root@localhost rabbitmq-server-3.6.6]# bash ./deps/rabbit/scripts/rabbitmqctl status
Status of node rabbit@localhost …
[{pid,25640},
 {running_applications,[{rabbit,”RabbitMQ”,”3.6.6″},
                        {mnesia,”MNESIA  CXC 138 12″,”4.14.1″},
                        {os_mon,”CPO  CXC 138 46″,”2.4.1″},
                        {rabbit_common,[],”3.6.6″},
                        {xmerl,”XML parser”,”1.3.12″},
                        {ranch,”Socket acceptor pool for TCP protocols.”,
                              “1.2.1”},
                        {sasl,”SASL  CXC 138 11″,”3.0.1″},
                        {stdlib,”ERTS  CXC 138 10″,”3.1″},
                        {kernel,”ERTS  CXC 138 10″,”5.1″}]},
 {os,{unix,linux}},
… … 

3、基本概念

1)AMQP:高级消息队列协议。

从概念上来讲,AMQP 消息路由必须有三部分:交换器、队列和绑定。生产者把消息发布到交换器上;消息最终到达队列,并被消费者接收;绑定决定了消息如何从路由器路由到特定的队列。

RabbitMQ 基础入门指南

2)信道

你必须首先连接到 Rabbit,才能消费或者发布消息。一旦 TCP 连接打开(通过了认证),应用程序就可以创建一条 AMQP 信道。信道是建立在“真实的”TCP 连接内的虚拟连接。AMQP 命令都是通过信道发送出去的。每条信道都会被指派一个唯一 ID。

引入信道概念的原因:主要是对操作系统来说建立和销毁 TCP 会话是非常昂贵的开销。在一条 TCP 连接上创建多条信道,而不是创建多条 TCP 连接,既可以满足性能方面的要求,又能确保各个信道数据的私密性,就像拥有独立连接一样。

3)消息:包含有效载荷(payload)和标签(label)。有效载荷就是你想要传输的数据。标签描述了有效载荷,并且 RabbitMQ 用它来决定谁将获得消息的拷贝。

消费者接收到的每一条消息都必须进行确认:或者通过 AMQP 的 basic.ack 命令显式发送确认,或者在订阅到队列时将 auto_ack 参数设置为 true。

消费者拒绝消息的方法:一、从 RabbitMQ 服务器断开连接。RabbitMQ 将把消息重新入队并发送给另一个消费者。好处:所有 RabbitMQ 版本都支持。缺点:这样连接 / 断开连接的方式会额外增加 RabbitMQ 的负担。二、RabbitMQ 2.0.0 或以上版本可使用 AMQP 的 basic.reject 命令。如果把 reject 命令的 requeue 参数设置为 true,RabbitMQ 会将消息重新发送给下一个订阅的消费者。如果设置为 false,则会立即把消息从队列中移除,而不会把它发送给新的消费者(比如检测到一条格式错误的消息时)。你也可以通过对消息确认的方式来简单地忽略该消息。

4)队列

消费者从特定队列接收消息的方式:通过 AMQP 的 basic.consume 命令订阅;通过 AMQP 的 basic.get 命令从队列获得单条消息。

如果队列当前无人订阅,则消息会在队列中等待。当队列拥有多个消费者时,队列收到的消息将以循环的方式发送给消费者(负载均衡)。每条消息只会发送给一个订阅的消费者。

如何创建队列:通过 AMQP 的 queue.declare 命令。如果不指定队列名称,Rabbit 会分配一个随机名称并在 declare 命令的响应中返回。如果消息不能丢失,则生产者和消费者都应该尝试去创建队列(发送出去的消息如果路由到了不存在的队列,Rabbit 会忽略它们)。如果可以丢失,或你实现了一种方法来重新发布未处理的消息,则可以只让消费者创建队列。

5)交换器和绑定

生产者把消息发布到交换器上。然后,根据确定的规则(路由键),RabbitMQ 将决定消息该投递到哪个队列。队列通过路由键绑定到交换器。当你把消息发送到代理服务器时,消息将拥有一个路由键(可能为空),RabbitMQ 会将其和绑定使用的路由键进行匹配。如果匹配,则消息将投递到相应的队列。如果路由的消息不匹配任何绑定模式,则消息将进入“黑洞”。

有如下四种类型的交换器,每种类型实现了不同的路由算法:

(1)direct:如果路由键匹配,消息就被投递到对应的队列。服务器必须实现 direct 类型交换器,包含一个空白字符串名称的默认交换器。

(2)fanout:把消息投递给所有附加在此交换器上的队列(广播)。

(3)topic:使得来自不同源头的消息能够到达同一个队列。

(4)headers:允许你匹配 AMQP 消息的 header 而非路由键。除此之外,它和 direct 完全一致,但性能会差很多,因此不太实用,而且几乎再也用不到了。

6)虚拟主机(vhost):每一个 RabbitMQ 服务器都能创建虚拟消息服务器,我们称之为虚拟主机。

每一个 vhost 本质上是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器和绑定。更重要的是,它拥有自己的权限机制(AMQP 并没有指定权限控制是在 vhost 级别还是在服务器端级别实现。这留给了服务器的开发者去决定。在 RabbitMQ 的例子中,权限控制以 vhost 为单位)。这使得你能安全地使用一个 RabbitMQ 服务器来服务众多应用程序,因为各个 vhost 实例间实现了逻辑上的分离。另外,它还能避免队列和交换器的命名冲突。

当你在 Rabbit 里创建一个用户时,用户通常会被指派给至少一个 vhost,并且只能访问被指派 vhost 内的队列、交换器和绑定。

创建 vhost:rabbitmqctl add_vhost [vhost_name]。vhost 创建成功后,就可以连接上去并添加队列和交换器了。

删除 vhost:rabbitmqctl delete_vhost [vhost_name]。

查看 Rabbit 服务器上运行哪些 vhost:rabbitmqctl list_vhosts。

参考资料:

《RabbitMQ 实战:高效部署分布式消息队列》

RabbitMQ 实战:高效部署分布式消息队列 中文 PDF 扫描版下载见   http://www.linuxidc.com/Linux/2017-10/147592.htm

  本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-10/147591.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4122字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中