当前位置:   article > 正文

RabbitMQ笔记二_rabbitmq clientid

rabbitmq clientid

【参考资料】
【1】《RabbitMQ实战指南》
【2】https://www.rabbitmq.com/access-control.html
【3】https://blog.csdn.net/u010013573/article/details/90991997
【4】https://blog.51cto.com/11134648/2155934
【5】https://www.cnblogs.com/yanwei-wang/p/4715429.html

1. MQTT插件
MqttClient mqttClient = new MqttClient("tcp://192.168.216.130:1883",
        "2",new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions();
options.setUserName("guest");
options.setPassword("guest".toCharArray());
mqttClient.connect(options);
mqttClient.subscribe("test", 0);
mqttClient.setCallback(new MqttCallback(){

    @Override
    public void connectionLost(Throwable throwable) {

    }

    @Override
    public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
        System.err.println(new String(mqttMessage.getPayload()));
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

    }
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  1. rabbitmq的插件支持MQTT 3.1.1 协议
  2. rabbitmq的插件会根据不同的MQTT clientID构建queue

在这里插入图片描述

  1. 实现过程中利用默认的amp.topic交换机,基于MQTT的topic规则进行绑定

在这里插入图片描述

  1. mqtt默认到租户vhost / 登录时的username和password,用的是vhost的密码
2. MQTT 下用户权限控制
2.1 获取用户权限

在这里插入图片描述

2.2 设置topic权限

在这里插入图片描述

3. RabbitMQ的分布式方案
3.1 集群
  1. RabbitMQ 集群不是主从,而是对等结果,目的在于扩展系统的吞吐量

  2. RabbitMQ 集群所有节点会备份全部的元数据,包括:

    1. 队列元数据:队列名称和属性
    2. 交换器元数据:交换器名称和属性
    3. 绑定关系元数据:交换器与队列之间的绑定关系
    4. vhost元数据:vhost内的队列、交换器以及安全属性等
  3. RabbitMQ 集群不会备份消息,因此某个节点宕机,该节点上的消息会丢失(这里属于高可用,要用【镜像队列】)

  4. RabbitMQ 集群的节点类型分为磁盘节点和内存节点,内存节点将所有的队列、交换器、绑定关系、用户、权限和vhost的元数据定义都存储在内存中,磁盘节点存储在磁盘里。

    1. 单节点系统只有磁盘节点,内存节点可以获得更好的性能
    2. 网上有三节点的方案,是一个磁盘节点,然后将另外两个内存节点加入,参考文献【4】,但也有方案是推荐
      均设置成磁盘节点,个人倾向前者
  5. RabbitMQ集群的每个节点都对外提供客户端连接,当队列存在与节点A,而客户端通过节点B访问时,此时存在节点A和节点B的消息转发

3.2 集群安装

环境:

服务器A:centos7.6 192.168.1.57 cdh1
服务器B:centos7.6 192.168.1.58 cdh2

  1. 两个节点安装RabbitMQ

rpm -Uvh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install erlang
yum -y install rabbitmq-server

  1. 拷贝erlang.cookie

RabbitMQ是依据erlang集群实现,Erlang作为一种面向并发的语言,内置了分布式机制。能在具有相同的magic cookie系统之间的直接对话。 RPM安装 .erlang.cookie在/var/lib/rabbitmq目录下,需要用 ll -a 查看

拷贝其至其他节点

scp /var/lib/rabbitmq/.erlang.cookie root@192.168.1.58:/var/lib/rabbitmq/.erlang.cookie

问题:

Error when reading /var/lib/rabbitmq/.erlang.cookie: eacces
修复:因为scp过去后权限不对
chown rabbitmq:rabbitmq .erlang.cookie
chmod 400 .erlang.cookie
  • 1
  • 2
  • 3
  • 4
  1. 安装管理插件并启动服务

systemctl stop firewalld.service //关闭防火墙

cd /usr/lib/rabbitmq/bin
./rabbitmq-plugins enable rabbitmq_management

service rabbitmq-server start

此时非集群状态
在这里插入图片描述

  1. 将节点2加入集群

rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@cdh1
rabbitmqctl start_app

在这里插入图片描述
在这里插入图片描述

  1. 验证

当连接到cdh1,并创建队列,此时cdh1和cdh2均有:
在这里插入图片描述

连接到cdh2消费仍然成功,注意上面的队列是有指定node的

3.3 镜像队列
  1. 镜像队列机制将队列镜像到其他节点之上,每一个镜像队列包含一个主节点和多个从节点
  2. 镜像队列的主节点和从节点会收到一样的消息,并且执行相同的操作,因此数据上保持一致
  3. 当镜像队列的主节点dump后,资历最老的从节点会被升级为主节点
  4. 除了发送消息(Basic.Publish)外的所有动作都只会向master发送,然后再由master将命令执行的结果广播给各个slave,比如获取消息,即使连接到的是从节点,也是通过转发的主节点处理后再操作
  5. 镜像队列支持事务和publisher confirm,即ACK是在全部队列都完成数据同步后切换状态

对于普通的队列两部分组成:amqqueue_process,负责协议相关的消息处理,即接收生产者发布的消息、向消费者投递消息、处理消息confirm、acknowledge等等;backing_queue,完成消息的存储以及可能的持久化工作等。

对于镜像队列实现:
在这里插入图片描述

镜像队列的backing_queue比较特殊,其实现并非是rabbit_variable_queue,它内部包裹了普通backing_queue进行本地消息消息持久化处理,在此基础上增加了将消息和ack复制到所有镜像的功能。其中GM是一种可靠的组播协议。

设置镜像队列通过增加policy

rabbitmqctl set_policy --priority 0 --apply-to queues mirror_queue “rabbitmq_direct01_queue” ‘{“ha-mode”:“exactly”,“ha-params”:2,“ha-sync-mode”:“automatic”}’

在这里插入图片描述

此时 rabbitmq_direct01_queue 在 cdh2上存在镜像,mirror_queue 后面的参数可以正则设置,多个同时匹配!

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号