深入理解消息中间件技术之RabbitMQ服务

[{total_limit,924},{total_used,2},{sockets_limit,829},{sockets_used,0}]},

{processes,[{limit,1048576},{used,204}]},

{run_queue,0},

{uptime,111},

{kernel,{net_ticktime,60}}]

六、Rabbitmq CLI介绍

自带多个命令行工具

1)rabbitmqctl #管理与操作命令

  • 停止节点
  • 访问节点状态,有效配置,运行状况检查
  • 虚拟主机管理
  • 用户和权限管理
  • 政策管理
  • 列出队列,连接,渠道,交流,消费者
  • 集群成员管理

[root@master ~]# rabbitmqctl list_bindings #查看绑定信息

Listing bindings for vhost /...

[root@master ~]# rabbitmqctl list_exchanges #查看交换器

Listing exchanges for vhost / ...

amq.rabbitmq.trace topic

amq.match headers

direct

amq.headers headers

amq.direct direct

amq.rabbitmq.event topic

amq.topic topic

amq.fanout fanout

[root@master ~]# rabbitmqctl list_queues #查看队列

Timeout: 60.0 seconds ...

Listing queues for vhost / ...

更多操作内容请参考:http://www.rabbitmq.com/rabbitmqctl.8.html

2)rabbitmq-plugins #是一个管理插件的工具

[root@master ~]# rabbitmq-plugins --help

Usage:

rabbitmq-plugins [-n ] [-l] [-q] []

General options:

-n node

-q quiet

-l longnames

Default node is "rabbit@server", where `server` is the local hostname. On a host

named "server.example.com", the node name of the RabbitMQ Erlang node will

usually be rabbit@server (unless RABBITMQ_NODENAME has been set to some

non-default value at broker startup time). The output of hostname -s is usually

the correct suffix to use after the "@" sign. See rabbitmq-server(1) for

details of configuring the RabbitMQ broker.

Quiet output mode is selected with the "-q" flag. Informational messages are

suppressed when quiet mode is in effect.

If RabbitMQ broker uses long node names for erlang distribution, "longnames"

option should be specified.

Some commands accept an optional virtual host parameter for which

to display results. The default value is "/".

Commands:

disable |--all [--offline] [--online]

enable |--all [--offline] [--online]

help

list [pattern] [--verbose] [--minimal] [--enabled] [--implicitly-enabled]

set [] [--offline] [--online]

- operation timeout in seconds. Default is "infinity".

参考文章:http://www.rabbitmq.com/rabbitmq-plugins.8.html

3)rabbitmqadmin #它可以执行一些与WEB界面相同的操作,rabbitmqadmin只是一个专门的HTTP客户端。

安装管理插件后,http://{主机名}:15672 /cli/rabbitmqadmin 进行下载

[root@master ~]# wget https://raw.githubusercontent.com/rabbitmq/rabbitmq-management/v3.7.6/bin/rabbitmqadmin

[root@master ~]# cp rabbitmqadmin /usr/local/bin/

[root@master ~]# chmod +x /usr/local/bin/rabbitmqadmin

七、RabbitMQ集群

RabbitMQ 是用 erlang 开发的,集群非常方便,因为 erlang 天生就是一门分布式语言,但其本身并不支持负载均衡。

RabbitMQ 的集群节点包括:

1)内存节点

内存节点就是将所有数据放在内存,只保存状态到内存(例外的情况:持久的queue内容将被保存到 disk)

2)磁盘节点。

磁盘节点将数据放在磁盘,保存状态到内存和磁盘,内存节点虽然不写入磁盘,但是它执行比磁盘节点要好,集群中,只需要一个磁盘节点来保存状态 就足够了,如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失。

深入理解消息中间件技术之RabbitMQ服务

不过,如前文所述,如果在投递消息时,打开了消息的持久化,那即使是内存节点,数据还是安全的放在磁盘。一个 RabbitMQ 集群中可以共享 user、vhost、queue、exchange 等,所有的数据和状态都是必须在所有节点上复制的,一个例外是那些当前只属于创建它的节点的消息队列,尽管它们可见且可被所有节点读取。 RabbitMQ 节点可以动态地加入到集群中,一个节点它可以加入到集群中,也可以从集群环集群进行一个基本的负载均衡。

Rabbit 模式大概分为以下三种:

1)单一模式

2)普通模式

3)镜像模式

单一模式:最简单的情况,非集群模式。

普通模式:默认的集群模式。

对于 Queue 来说,消息实体只存在于其中一个节点,A、B 两个节点仅有相同的元数据,即队列结构。当消息进入 A 节点的 Queue 中后,consumer 从 B 节点拉取时,RabbitMQ 会临时在 A、B 间进行消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer. 所以 consumer 应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理 Queue。否则无论 consumer 连 A 或 B,出口总在 A,会产生瓶颈。该模式存在一个问题就是当 A 节点故障后,B 节点无法取到 A 节点中还未消费的消息实体。如果做了消息持久化,那么得等 A 节点恢复,然后才可被消费。

镜像模式:

把需要的队列做成镜像队列,存在于多个节点,属于 RabbitMQ 的 HA 方案。

该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在 consumer 取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉,所,在对可靠性要求较高的场合中适用。


分享到:


相關文章: