sweetsunnyflower

RabbitMQ好文

安装RabbitMQ

Ubuntu

添加RabbitMQ源:

sudo echo "deb http://www.rabbitmq.com/debian testing main" >> /etc/apt/sources.list

将RabbitMQ公钥加入我们的信任密钥列表,避免一些关于unsigned packages的警告。

wget https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
sudo apt-key add rabbitmq-signing-key-public.asc

更新软件列表,安装rabbitmq-server

apt-get update
apt-get install rabbitmq-server

rabbitmq的相关目录:

$ find / -name .erlang.cookie
/var/lib/rabbitmq/.erlang.cookie

执行apt-get update之后报错:

W: GPG error: http://www.rabbitmq.com testing InRelease: The following signatures couldn\'t be verified because the public key is not available: NO_PUBKEY 6B73A36E6026DFCA

使用apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6B73A36E6026DFCA解决

启动MQ:

service rabbitmq-server start

发现通过ip:15672还是无法访问,那么,还需要进一步设置,启用RabbitMQWeb管理插件:

rabbitmq-plugins enable rabbitmq_management

然后就可以通过浏览器访问了,当使用guest/guest登陆时,报错,User can only log in via localhost

解决办法:

rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

添加用户参考:

CentOS

yum -y install epel-release
yum -y update
wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm
rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
rpm -Uvh rabbitmq-server-3.6.10-1.el7.noarch.rpm
systemctl start rabbitmq-server
systemctl enable rabbitmq-server
rabbitmq-plugins enable rabbitmq_management

where -U to update if package is already installed, -v for verbose output, -h to print hash output
坑1:

在执行systemctl start rabbitmq-server.service之后,报错:Failed to start RabbitMQ broker:

原因,在运行systemctl start rabbitmq-server.service之前,我先执行了rabbitmq-plugins enable rabbitmq_management,导致/etc/rabbitmq/下生成了enabled_plugins。解决启动错误,先删除该文件。

此外,启动出错时,还有可能因为防护墙的原因,可以参考此篇文章关闭。

防火墙关闭解决办法:

firewall-cmd --permanent --add-port=5672/tcp
firewall-cmd --reload
setsebool -P nis_enabled 1

或者粗暴点的办法(不推荐)

systemctl stop firewalld
systemctl disable firewalld 
setenforce 0 (记得/etc/selinux/config也改成 disable,否则重启就不生效了)

坑2:

rabbitmq服务总算start成功了,但是执行rabbitmq-plugins enable rabbitmq_management还是报错:

[root@SHA1000154085 rabbitmq]# rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
  amqp_client
  cowlib
  cowboy
  rabbitmq_web_dispatch
  rabbitmq_management_agent
  rabbitmq_management
Applying plugin configuration to rabbit@SHA1000154085... failed.
Error: {cannot_read_enabled_plugins_file,"/etc/rabbitmq/enabled_plugins",
           eacces}

网上看到一篇文章,抱着绝望的心情执行了:

umask 0022; rabbitmq-plugins enable rabbitmq_management

竟然OK了!!!

坑3:

报错:"Cookie file /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only"

解决办法-unable to start rabbitmq server on ubuntu 10.04

chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 600 /var/lib/rabbitmq/.erlang.cookie

看来.erlang.cookie的属组也很关键,修改好之后是这样的:

-rw------- 1 rabbitmq rabbitmq 20 Jun 14 14:31 .erlang.cookie

安装参考

RabbitMQ集群

修改hostname

临时修改hostname:hostname <new hostname>

推荐永久修改的方式:

CentOS系

$vi /etc/sysconfig/network
HOSTNAME=yourhostname

Debian发行版的hostname的配置文件是/etc/hostname

Ubuntu

vi /etc/hostname

还需要修改hosts:

$vi /etc/hosts
127.0.0.1   node2
127.0.0.1   localhost node2 localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

最后reboot重启,输入hostname查看是否生效。

参考:

文件路径

[root@SHA1000154085 rabbitmq]# find / -name rabbitmq-server

/usr/lib/ocf/resource.d/rabbitmq/rabbitmq-server
/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.10/sbin/rabbitmq-server
/usr/lib/rabbitmq/bin/rabbitmq-server
/usr/sbin/rabbitmq-server
/etc/logrotate.d/rabbitmq-server

重要方法

factory.setAutomaticRecoveryEnabled()

//默认rabbitmq client是打开了自动recover连接的能力的(5.0版本的rabbitmq 默认是打开的)
factory.setAutomaticRecoveryEnabled(true);

ExecutorService es = Executors.newFixedThreadPool(20);
return factory.newConnection(es);

channel.basicQos()

channel.basicQos(1); // accept only one unack-ed message at a time (see below)

参考-重要方法

MQ的消息持久化

https://www.rabbitmq.com/tuto...

When RabbitMQ quits or crashes it will forget the queues and messages unless you tell it not to. Two things are required to make sure that messages aren\'t lost: we need to mark both the queue and messages as durable.

First, we need to make sure that RabbitMQ will never lose our queue. In order to do so, we need to declare it as durable:
首先,我们先保证MQ从不会丢弃我们的队列。为了这样,需要声明它为持久化的:

boolean durable = true;
channel.queueDeclare("task_queue", durable, false, false, null);

This queueDeclare change needs to be applied to both the producer and consumer code.
这个声明需要应用在生产者和消费者两处。

At this point we\'re sure that the task_queue queue won\'t be lost even if RabbitMQ restarts. Now we need to mark our messages as persistent - by setting MessageProperties (which implements BasicProperties) to the value PERSISTENT_TEXT_PLAIN.
我们确保任务队列即使MQ重启也不回丢失。现在,我们需要标记我们的消息为持久化的——通过设置MessagePropertiesPERSISTENT_TEXT_PLAIN

import com.rabbitmq.client.MessageProperties;

channel.basicPublish("", "task_queue",
            MessageProperties.PERSISTENT_TEXT_PLAIN,
            message.getBytes());

Note:
上面的这个方法是正确的,当在我们的例子中也无法持久化!因为已经定义的队列,再次定义是无效的,这就是幂次原理。RabbitMQ不允许重新定义一个已有的队列信息,也就是说不允许修改已经存在的队列的参数。如果你非要这样做,只会返回异常。 
咋整? 
一个快速有效的方法就是重新声明另一个名称的队列,不过这需要修改生产者和消费者的代码,所以,在开发时,最好是将队列名称放到配置文件中。 
这时,即使RabbitMQ服务器重启,新队列中的消息也不会丢失。

 

原文地址:https://segmentfault.com/a/1190000015293217

分类:

技术点:

相关文章: