三 rabbitmq发布确认+集群+其他高级( 六 )


9.3.2. 两种模式
队列具备两种模式: 和 lazy 。默认的为 模式,在3.6.0 之前的版本无需做任何变更 。lazy模式即为惰性队列的模式,可以通过调用 . 方法的时候在参数中设置,也可以通过 的方式设置,如果一个队列同时使用这两种方式设置的话,那么的方式具备更高的优先级 。如果要通过声明的方式改变已有队列的模式的话,那么只能先删除队列,然后再重新声明一个新的 。在队列声明的时候可以通过“x-queue-mode”参数来设置队列的模式,取值为“”和“lazy” 。下面示例中演示了一个惰性队列的声明细节:
Map args = new HashMap();args.put("x-queue-mode", "lazy");channel.queueDeclare("myqueue", false, false, false,)
9.3.3. 内存开销对比
在发送 1 百万条消息,每条消息大概占 1KB 的情况下,普通队列占用内存是 1.2GB,而惰性队列仅仅占用 1.5MB
10.集群 10.1.10.1.1. 使用集群的原因
最开始我们介绍了如何安装及运行服务,不过这些是单机版的,无法满足目前真实应用的要求 。如果服务器遇到内存崩溃、机器掉电或者主板故障等情况,该怎么办?单台 服务器可以满足每秒 1000 条消息的吞吐量,那么如果应用需要服务满足每秒 10 万条消息的吞吐量呢?购买昂贵的服务器来增强单机务的性能显得捉襟见肘,搭建一个集群才是解决实际问题的关键.
10.1.2. 搭建步骤
vim /etc/hostname
vim /etc/hosts10.211.55.74 node110.211.55.75 node210.211.55.76 node3
在 node1 上执行远程操作命令
scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookiescp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/.erlang.cookie
rabbitmq-server -detached
rabbitmqctl stop_app(rabbitmqctl stop 会将Erlang 虚拟机关闭,rabbitmqctl stop_app 只关闭 RabbitMQ 服务)rabbitmqctl resetrabbitmqctl join_cluster rabbit@node1rabbitmqctl start_app(只启动应用服务)
rabbitmqctl stop_apprabbitmqctl resetrabbitmqctl join_cluster rabbit@node2rabbitmqctl start_app
rabbitmqctl cluster_status
创建账号rabbitmqctl add_user admin 123设置用户角色rabbitmqctl set\_user\_tags admin administrator设置用户权限rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
rabbitmqctl stop_apprabbitmqctl resetrabbitmqctl start_apprabbitmqctl cluster_statusrabbitmqctl forget_cluster_node rabbit@node2(node1 机器上执行)
10.2. 镜像队列 10.2.1. 使用镜像的原因
如果集群中只有一个节点,那么该节点的失效将导致整体服务的临时性不可用,并且也可能会导致消息的丢失 。可以将所有消息都设置为持久化,并且对应队列的属性也设置为true,但是这样仍然无法避免由于缓存导致的问题:因为消息在发送之后和被写入磁盘井执行刷盘动作之间存在一个短暂却会产生问题的时间窗 。通过机制能够确保客户端知道哪些消息己经存入磁盘,尽管如此,一般不希望遇到因单点故障导致的服务不可用 。引入镜像队列( Queue)的机制,可以将队列镜像到集群中的其他节点之上,如果集群中的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性 。