节点描述的是一个Erlang节点运行着一个Erlang应用程序。Erlang虚拟机的每个实例我们称之为节点。多个Erlang应用程序可以运行在同一个节点之上。节点之间可以进行本地通信。在RabbitMQ安装目录下找到./sbin目录,运行./rabbitmq-server。通常情况下可以在/var/log/rabbitmq/目录下找到名为rabbit@{hostname}.log的日志文件。rabbitmq-server同时启动了节点和应用程序,而rabbitmqctl stop会把节点和应用程序同时关闭。使用rabbitmqctl stop_app会只停止rabbitmq应用程序而不关闭erlang节点。Rabbitmq允许设置系统范围的可调参数并通过配置文件进行设置。该文件位于/etc/rabbitmq/rabbitmq.config。Rabbitnmq配置文件实际上是一个包含了嵌套哈希表的数组。每个erlang应用程序会有自己的哈希表来配置选项。mnesia指的是Mnesia数据库配置选项。rabbit指的是RabbitMQ特定的配置选项。每个选项都表达为{[option_name],[option_value]}。

  RabbitMQ中的每个队列,交换器和绑定的元数据都保存到了Mnesia中。Mnesia是内建在Erlang的非SQL型数据库。Mnesia通过将RabbitMQ元数据首先写入到一个仅追加的日志文件以确保其完整性。然后在定期将日志内容转存到真实的Mnesia数据库文件中。

    Mnesia的dump_log_write_threshold选项控制转储的频度。

    tcp_listeners定义了Rabbitmq应该监听的非SSL加密通信的IP地址和端口。

  Rabbit配置项  

    ssl_listeners定义了RabbitMQ应该监听的SSL加密通信的IP地址和端口。

    ssl_options指定了SSL相关的选项,有效的选项有cacertifile,certfile,keyfile和fail_if_no_peer_cert。

    vm_memory_high_watermark控制RabbitMQ允许消耗的内存。它以十进制的数值的形式明确了Rabbit允许使用的安装内存百分比。

    msg_store_file_size_limit指定RabbitMQ垃圾收集存储内容之前。消息存储数据库的最大大小。

    queue_index_max_journal_entries指定了在转储到消息存储数据库并提交前,消息存储日志里的最大条目收数。

 

RabbitMQ权限

  RabbitMQ权限系统中的单个用户可以跨越多个vhost进行授权。

  在RabbitMQ中,用户是访问控制的基本单元。针对一到多个vhost,其可以被赋予不同级别的访问权限,并使用标准的用户名/密码对来认证用户。

  ./rabbitmqctl add_user username password  --添加用户

  ./rabbitmqctl delete_user username  --删除用户

  ./rabbitmqctl list_users  --查看所有用户

  ./rabbitmqctl change_password username newpassword  --更新密码

  Rabbitmq实现了一套访问控制列表(acl)风格的权限系统。

  AMPQ命令        配置      写      读  

  exchange.declare    exchange  

  exchange.delete     exchange

  queue.declare      queue

  queue.delete        queue

  queue.bind               queue     exchange

    basic.publish                     queue

  basic.get                       queue

  basic.consume                    queue

  queue.purge                     queue

  每一条访问控制条目由4个部分组成:被授予访问权限的用户,权限控制应用的vhost,需要授予的读/写/配置权限的组合以及权限范围

  ./rabbitmqctl set_permissions -p vhostname username ".*" ".*" ".*"   --赋予某个用户vhost的权限

  ./rabbitmqctl list_permissions -p username   --列出用户的所有权限

  ./rabbitmqctl clear_permissions -p vhost username  --清空vhost上username的所有权限

 

  ./rabbitmqctl list_queues (-p vhostname) --列出所有声明的队列

  ./rabbitmqctl list_queues name message consumers memory  --列出队列的名称 消息数目 消费者数目和内存使用的情况

  ./rabbitmqctl list_queues name durable auto_delete --列出消息的名字,可持续性和是否自动删除

  

  ./rabbitmqctl list_exchanges  --返回交换器名称和类型

  ./rabbitmqctl list_exchanges name type durable auto_delete  

 

  ./rabbitmqctl list_bindings  --绑定的详细信息:交换器名称,队列名称,路由键和参数

 

RabbitMQ的日志系统

  在rabbitmq-server脚本显示:LOG_BASE=/var/log/rabbitmq。它会创建两个日志文件:RABBITMQ_NODENAME-sals.log和RABBITMQ_NODENAME.log。RABBITMQ_NODENAME指的是_rabbit@localhost_或就是rabbit,具体取决于配置系统。SASL(System Application Support Libraries,系统应用程序支持库)是库的集合。当RabbitMQ记录Erlang相关信息时,它会将日志写入rabbitsasl.log文件。

  tail -f rabbit.log

 

  rabbitmqctl会启动Erlang节点,并从那里使用Erlang分布式系统尝试连接RabbitMQ节点。要完成这项工作需要合适的Erlang cookie和合适的节点名称。Erlang节点通过交换作为秘密令牌的Erlang cookie以获得认证。连接到远程节点后,就可以执行命令,因此有必要确保该节点时可信的。Erlang将令牌存储在名为.erlang.cookie的文件。该文件通常位于用户的home目录下。

  cat ~/.erlang.cookie  --查看erlang.cookie

  为了能让rabbitmqctl连接RabbitMQ节点,需要共享相同的cookie。若运行RabbitMQ和执行Rabbitmqctl命令是同一个用户,则不会有问题。若有多个用户时,他们需要共享cookie。

  

  当启动Erlang节点时,可以给它两个互斥的节点名选项,name和sname(short name)。节点名可长可短。若用长名启动节点,则它会像rabbit@hostname.network.tld,若用短名,则像rabbit@hostname这样。

 

  RabbitMQ使用Mnesia存储对俄,交换器,绑定等信息。RabbitMQ启动时第一件事就是启动Mnesia数据库。若Mnesia启动失败,则RabbitMQ也会失败。导致Mnesia启动失败的原因主要有两个:一个是MNESIA_BASE目录的权限问题。运行RabbitMQ服务器的用户需要对该文件夹的写权限;另一个问题是Mnesia读取表格失败。若主机名更改了,或是服务器运行在集群模式下,无法在启动的时候连接到其他节点,这些都会导致失败。Mnesia会基于机器的主机名创建数据库schema。若果列出MNESIA_BASE文件夹的内容,就会看到其中一个文件夹是rabbit@hostname。若网络重新配置的原因,主机名修改了,Mnesia就无法载入久的schema。同时不要用RabbitMQ使用rabbit这个单词作为节点名。若使用了Erlang sname选项更改了它,Mnesia又会遇到同样的问题。

  erl -sname nodename --使用短名启动erlang节点

  net_adm:names()  --查看机器上还运行着哪些节点

  当启动一个分布式Erlang节点时,它会用epmd(Erlang Port Mapper Daemon)进程进行注册,提供OS内核分配的地址和端口。之后当另一个Erlang节点启动时,它也会做同样的事情。最后,若想要连接第一个节点的话,它会查询epmd以获得节点地址。

  net_adm:ping('rabbit@mrhyde') --尝试对rabbit@mrhyde节点的连接,若应答是pong,则表明连接是成功的,若应答是pang,则无法连接到该节点。

  rpc:call('rabbit@mrhyde', erlang, system_info, [process_count]).106 -使用rpc:call,同时提供节点,模块,函数和参数作为入参,可以在远程rabbit上执行其他函数以获得不同的信息。

  rpc:call('rabbit@mrhyde', mnesia, info,[]). --打印关于Mnesia的信息,如RabbitMQ创建的表哥,内存使用情况等

  q()  --执行q函数推出Erlang REPL

 

 

  消息通信适用的主要领域之一是发后即忘的处理模式。匹配该模式的两种一般类型的任务是:

    批处理(batch processing):针对大型数据集合的工作或者转换。这种类型的任务可以构建单一的任务请求或多个任务对数据集合的独立部分进行操作

    通知(notifications):对发生事件的描述。内容可以是消息的日志,也可以是真实的报告通知给程序或是管理员

  

  在每个AMQP消息头里有个字段叫作reply_to。消息的生产者可以通过该字段来确定队列名称,并监听队列等待应答。然后接受消息的RPV服务器检查reply_to字段,并创建包含应答内容的新的消息,并以队列名称作为路由键。所有的RPC客户端需要做的是声明临时的,排他的,匿名队列,并将该队列名称包含到RPC消息的reply_to头中,于是服务器端就知道应答消息该发往何处。