概念

1. Exchange: 交换机,消息发送去往的地方

2. Queue: 队列,消费消息的地方,exchange会根据自身的类型和routing-key进行消息的分发

3. routing-key:路由地址,queue通过key和exchange进行绑定,当消息指定了routing-key然后发送到exchange时,exchange会根据key绑定的列表推送到queue里面

exchange类型:

生产者发送消息去往的地方,生产者只需要知道exchange名字和routingkey既可以发送消息,剩下的由exchange进行转发

  1. topic:只有匹配路由的模式的队列才会收到消息,可以一个路由匹配多个队列,一对多的关系,发送消息只需要指定routing-key即可
  2. direct:只有精确的队列才会收到消息,一对一的关系,发送消息时需要指定队列名
  3. fanout:广播,此时绑定了该exchange的队列都会收到消息,会忽略routing-key,发送消息只需要指定exchange

queue:

接收消息的地方,消费者读取消息的地方,消费者连接到这个队列进行消息的读取。

vhost:

虚拟主机,一个虚拟主机可以有多个exchange和queue,他们是隔离独立的

备份与恢复:

rabbitmq目录里包含两种类型的信息 1:元信息metadata,schema,topology,主要是保存exchange,queue,user,vhost等基本信息 2:消息数据信息:停留在队列里未被消费的消息 配置导入和导出,可以将A服务器的Exchange和Queue导入到B服务器 1:开启rabbitmq-management插件 2:获取rabbitmqadmin命令工具:通过wget http://localhost:15672/cli/rabbitmqadmin 3:安装python 4:python rabbitmqadmin export myrabbit.config -H localhost -P 15672 -u myuser -p mypass 5:配置导入:python rabbitmqadmin import myrabbit.config -H locahost -P 15672 -u myuser -p mypass 6:使用管理端口,不是使用5672端口

集群

每个集群中的节点都是通过传输层连接的。所有节点对之间定期交换tick消息来维护连接来检测连接断开。 集群搭建: 1:安装erlang:这个包安装后足够支持rabbitmq-server运行 编辑/etc/yum.repos.d/rabbitmq-erlang.repo [rabbitmq-erlang] name=rabbitmq-erlang baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/21/el/7 gpgcheck=1 gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc repo_gpgcheck=0 enabled=1 yum install -y erlang 2:安装rabbitmq-server: rpm --import https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.7/rabbitmq-server-3.7.7-1.el7.noarch.rpm yum install -y rabbitmq-server-3.7.7-1.el7.noarch.rpm 3:启动服务器: chkconfig rabbitmq-server on 或者systemctl enable rabbitmq-server systemctl start rabbitmq-server 查看状态:rabbitmqctl status 4:启动后会在/var/lib/rabbitmq下生成一个.erlang.cookie,需要ls -al查看 复制这个文件到其他节点上,需要修改文件的所有者,否则启动时读取权限出错 chown rabbitmq:rabbitmq .erlang.cookie 5:各个节点分别修改/etc/hosts和/etc/hostname 6:重启后关闭主节点外的各个节点:rabbitmqctl stop_app 7:其他节点加入集群:rabbitmqctl join_cluster rabbit@rabbitmq1 8:启动各个节点:rabbitmqctl start_app 9:查看集群信息:rabbitmqctl cluster_status 节点停止后可以直接重启,集群会自动加载

队列高可用

原理就是创建多一个镜像队列,默认,rabbitmq里的队列的内容位于队列声明所在的单个节点上。exchange和binding被认为在所有节点上的。当给队列做镜像后,相当于两个节点有一个队列的信息,默认是master节点起效果,当master崩溃,slave会自动提升为master,然后处理这个队列的消息。 队列镜像: 1:使用rabbitmqctl set_policy来设置,或者使用UI管理界面来设置 2:开启UI管理界面:rabbitmq-plugins enable rabbitmq_management 3:重启服务,然后访问ip:15672,用户名密码都是guest 4:在amind下面,右侧policy,添加一个policy,或者使用命令: rabbitmqctl set_policy mypolicy “myReg”

使用java操作rabbtimq

以direct为例 1:引入依赖

<dependency>
	<groupId>com.rabbitmq</groupId>
	<artifactId>amqp-client</artifactId>
	<version>5.6.0</version>
</dependency>

2:生产者:

ConnectionFactory factory = new ConnectionFactory();//创建连接工厂
factory.setHost("localhost");
try (Connection connection = factory.newConnection(); //打开连接
		 Channel channel = connection.createChannel()) {  
			 channel.queueDeclare(myQueueName, false, false, false, null);  //绑定一个队列
String message = "Hello World!";
channel.basicPublish("", myQueueName, null, message.getBytes()); 发送消息到队列里
}

3:消费者:

ConnectionFactory factory = new ConnectionFactory();
		factory.setHost("localhost");
		Connection connection = factory.newConnection();
		Channel channel = connection.createChannel();
		channel.queueDeclare(myQueueName, false, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
		String message = new String(delivery.getBody(), "UTF-8");
		System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });