RabbitMq的并发支持比不上Kafka,但是可靠性很高,开源且活跃,在中小型项目中应用广泛。

    一.centos安装
    1.安装erlang环境

    1. yum -y install gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel xmlto
    2. wget -c http://erlang.org/download/otp_src_20.2.tar.gz
    3. tar -zxvf otp_src_20.2.tar.gz
    4. cd otp_src_20.2/
    5. ./configure --prefix=/usr/local/erlang
    6. make && make install

    2.配置环境变量

    1. vi /etc/profile
    2. //末尾增加此行
    3. export PATH=$PATH:/usr/local/erlang/bin
    4. source /etc/profile
    5. //任意地方输入erl,进入命令行说明成功

    3.下载解压RabbitMQ

    1. wget -c http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-generic-unix-3.6.15.tar.xz
    2. xz -d rabbitmq-server-generic-unix-3.6.15.tar.xz
    3. tar -xvf rabbitmq-server-generic-unix-3.6.15.tar

    4.配置环境变量

    1. // /etc/profile中增加此行
    2. export PATH=$PATH:/usr/local/rabbitmq_server-3.6.15/sbin

    5.增加用户并分配权限

    1. rabbitmqctl add_user admin 123456
    2. rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
    3. rabbitmqctl set_user_tags admin administrator

    6.开启页面管理插件

    1. rabbitmq-plugins enable rabbitmq_management

    7.开启和关闭服务

    1. rabbitmq-server -detached //开始服务
    2. rabbitmqctl stop //关闭服务
    3. rabbitmqctl status //查看状态

    8.其他命令

    1. add_user <UserName> <Password>
    2. delete_user <UserName>
    3. change_password <UserName> <NewPassword>
    4. list_users
    5. add_vhost <VHostPath>
    6. delete_vhost <VHostPath>
    7. list_vhostsset_permissions [-p <VHostPath>] <UserName> <Regexp> <Regexp> <Regexp>
    8. clear_permissions [-p <VHostPath>] <UserName>
    9. list_permissions [-p <VHostPath>]
    10. list_user_permissions <UserName>
    11. list_queues [-p <VHostPath>] [<QueueInfoItem> ...]
    12. list_exchanges [-p <VHostPath>] [<ExchangeInfoItem> ...]
    13. list_bindings [-p <VHostPath>]
    14. 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:
    RabbitMQ安装和高级特性 - 图1
    生产者发消息前对业务和消息两个数据库落库,生产者confirm监听到消息,改消息库的状态。另外有一个定时任务查消息状态,一直没更新成功重复有限的次数的重试。
    缺点:最开始的时候要两个落库的事物操作,可能形成性能瓶颈。改进方法见下一个方案。
    方案2:
    RabbitMQ安装和高级特性 - 图2
    生产者对业务落库,发消息,同时发一个延时检测消息,消费者服务只消费第一个消息,正确消费之后发送确认消息。回调服务接受确认消息和延时检测消息,保证消息被正确处理。发现只收到延时消息,没收到确认消息,说明消费者有问题。都收到说明没问题。判断情况并rpc通知生产者处理。