RabbitMQ是一个开源的AMQP(高级消息队列协议)实现,服务器端用Erlang语言编写,支持多种客户端,如Java、Python等。
RabbitMQ是一个用于接收、存储、转发消息的代理(broker)。
默认guest用户只能本地访问,故需要添加新用户
rabbitmqctl add_user admin admin #添加用户admin,密码admin
rabbitmqctl set_user_tags admin administrator #设置用户角色
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" #设置用户权限
并编辑rabbitmq-env.conf,将NODE_IP_ADDRESS设置为本级ip
➜ etc cat ./rabbitmq/rabbitmq-env.conf
CONFIG_FILE=/usr/local/etc/rabbitmq/rabbitmq
NODE_IP_ADDRESS=192.168.1.37
NODENAME=rabbit@localhost
这样就可以远程访问了
生产者,生产消息,将消息发送到RabbitMQ
消费者,消费消息,等待并处理来自RabbitMQ的消息
消息队列,存储消息
消息路由,根据routingKey和Exchange类型将消息发送到不同的Queue
有4种内建类型(com.rabbitmq.client.BuiltinExchangeType
)
DIRECT("direct"), FANOUT("fanout"), TOPIC("topic"), HEADERS("headers");
TOPIC 将生产者routing key与消费者routing key进行模糊匹配:
*
仅匹配一个单词
#
匹配零个到多个单词
routing key是一个以.
分割的字符串。
生产者发送消息到Exchange时,需要一个routing key并配合Exchange类型来配置消息路由规则,即指定消息流向哪里。
routing key的长度最大为255bytes。
同生产者,消费者消费消息时,也需要一个routing key(或者叫binding key),来绑定Queue到Exchange。
当生产者routing key与消费者routing key根据Exchange Type能匹配到时,消息将会被路由到消费者所绑定的Queue中。
com.rabbitmq.client.ConnectionFactory
com.rabbitmq.client.Connection
com.rabbitmq.client.Channel
RabbitMQ怎样避免消息丢失?
据说性能不好,暂时无视
发布确认,broker会在接收到消息并正确处理后给客户端发送ack消息,不可与事务混合使用。 消息何时被确认?
对于无路由的消息,broker会在Exchange确认该消息不会被路由到任何Queue时发送basic.ack回客户端进行确认。
如果客户端发送消息使用了mandatory参数,则先发送basic.return再发送basic.ack回客户端进行确认。 可以在channel添加ReturnListener来接收broker返回的无路由的消息做相应的处理。
对于可路由的消息,当所有Queue已接收到消息后,broker发送basic.ack回客户端进行确认。 对于要发送到durable queue的消息,消息持久化到磁盘后broker发送确认。 对于mirrored queues,所有队列都接收该消息后broker发送确认。
对于消费者,设置autoAck为false,只有当消息处理成功才发送ack;若消费失败,则发送nack(注意requeue参数)