RabbitMq的并发支持比不上Kafka,但是可靠性很高,开源且活跃,在中小型项目中应用广泛。
一.centos安装
1.安装erlang环境
yum -y install gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel xmltowget -c http://erlang.org/download/otp_src_20.2.tar.gztar -zxvf otp_src_20.2.tar.gzcd otp_src_20.2/./configure --prefix=/usr/local/erlangmake && make install
2.配置环境变量
vi /etc/profile//末尾增加此行export PATH=$PATH:/usr/local/erlang/binsource /etc/profile//任意地方输入erl,进入命令行说明成功
3.下载解压RabbitMQ
wget -c http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-generic-unix-3.6.15.tar.xzxz -d rabbitmq-server-generic-unix-3.6.15.tar.xztar -xvf rabbitmq-server-generic-unix-3.6.15.tar
4.配置环境变量
// /etc/profile中增加此行export PATH=$PATH:/usr/local/rabbitmq_server-3.6.15/sbin
5.增加用户并分配权限
rabbitmqctl add_user admin 123456rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"rabbitmqctl set_user_tags admin administrator
6.开启页面管理插件
rabbitmq-plugins enable rabbitmq_management
7.开启和关闭服务
rabbitmq-server -detached //开始服务rabbitmqctl stop //关闭服务rabbitmqctl status //查看状态
8.其他命令
add_user <UserName> <Password>delete_user <UserName>change_password <UserName> <NewPassword>list_usersadd_vhost <VHostPath>delete_vhost <VHostPath>list_vhostsset_permissions [-p <VHostPath>] <UserName> <Regexp> <Regexp> <Regexp>clear_permissions [-p <VHostPath>] <UserName>list_permissions [-p <VHostPath>]list_user_permissions <UserName>list_queues [-p <VHostPath>] [<QueueInfoItem> ...]list_exchanges [-p <VHostPath>] [<ExchangeInfoItem> ...]list_bindings [-p <VHostPath>]list_connections [<ConnectionInfoItem> ...]
9.访问
http://ip:15672/
二.windows安装
1.erlang下载
http://erlang.org/download/otp_win64_21.0.1.exe
2.rabbitmq下载
http://erlang.org/download/otp_win64_21.0.1.exe
其余同centos
二、高级特性
1.如何保证投递可靠性?
需要从生产和消费两端考虑。在生产者一侧增加配置confirm(channel.confirmSelect();并增加ConfirmListener实现类到chanel),可以保证mq接收到了消息投递。在生产一侧增加return listener配置(mandatory设为true,写ReturnListener实现类),可以保证消息有exchange和routingkey可投递。
消费端需要设置手动ack,保证消息被正确消费。此外应配置死信队列,保证无法被正常消费的消息能被记录和处理。
持久化也是重要的一点,exchange,message,queue都要持久化
2.死信队列?
一个消息进入死信队列的条件:①消息被拒绝,且配置消息不重回队列。②ttl过期。③队列达到最大长度。
怎样使得一个队列作为死信队列:对正常的队列加一个x-dead-letter-exchange参数(最终会在header中),被参数指定的队列就是该队列的私信队列。
3.消费端限流怎么实现
配置prefetch属性。如有必要可以配消息的ttl。
4.ttl注意事项?
两种配置方式,可以对整个队列配置x-message-ttl属性,也可以对单个消息配置expiration。实现方式都是在消息消费时判断是否过期,在队列中的消息过期不会处理。如果都设置了,以时间短的为准。
5.两个方案和解释
方案1:
生产者发消息前对业务和消息两个数据库落库,生产者confirm监听到消息,改消息库的状态。另外有一个定时任务查消息状态,一直没更新成功重复有限的次数的重试。
缺点:最开始的时候要两个落库的事物操作,可能形成性能瓶颈。改进方法见下一个方案。
方案2:
生产者对业务落库,发消息,同时发一个延时检测消息,消费者服务只消费第一个消息,正确消费之后发送确认消息。回调服务接受确认消息和延时检测消息,保证消息被正确处理。发现只收到延时消息,没收到确认消息,说明消费者有问题。都收到说明没问题。判断情况并rpc通知生产者处理。
