一、介绍AMQP协议
特性:
1:分布式事务支持。
2:消息的持久化支持。
3:高性能和高可靠的消息处理优势。
分发策略:
1: 轮询分发
2: 公平分发
AMQP消息路由必须的三部分:交换器、路由、绑定
消费者从队列中接收消息:
- 通过AMQP的basic.consume 命令将信道置为接收模式,直到取消队列订阅为止。能够持续接收消息
- 通过AMQP的basic.get命令实现向队列获取一条消息
注意:
- RabbitMq基于AMQP协议
对个消费者共用同一队列 ,消息的消费流程循环消费,cosumerA,cosumerB。
1、 messageA 到达队列先 给conusumerA ,在consumerA中确认了接收了messageA消息,RabbiMQ将messageA从队列中删除
2、message发送给consumerB ranhou....问题一:consumerA没有确认消息会怎么样?
messageA会发送给下一个消费者,从而保证消息被消费,如果consumerA没有确认消息,队列将不会发送消息给消费者A,可以利用这点来控制消费时长。
问题二:使用什么方式拒绝处理该条消息?
1、把消费者从rabbiMq断开(会增加对RabbitMQ的负荷) 2、RabbitMq2.0.0及以上版本可以使用AMQP的basic.reject命令。把reject命令的requeue 值设为true则将消息发送到下一个message,false则是移除该消息。
名词介绍:
- 生产者
- 有效载荷(实际传输数据),
- 标签(描述数据,指定谁可以复制消息)
- 队列
- 消费者
- 信道:当TCp连接建立会创建AMQP信道,AMQP的命令通过信道发送,每条信道被指定唯一id。
二、交换器和绑定
交换器通过路由键来分发消息到不同队列:一共有4中类型交换器 direct、famous、topic、headers(headers交换器允许你匹配Amqp消息的header而非路由键)
- direct交换器:如果路由键匹配的话,消息就被投递到对应的队列
服务器必须实现direct类型交换器,包含一个空白字符串的默认交换器。队列的名称就是路由键
- famous 交换器:会将消息匹配到所有附加在此交换器上的队列
3.topic交换器:通过通配符匹配消息,使得不同源头的消息到达同一队列
三、虚拟主机
每一个vhost本质上是一个mini版的RabbitMq服务器,拥有自己的队列、交换器和绑定。挡在Rabbitmq集群中创建了一个mq则整个集群中都会创建这个vhost。
4、消息持久化和策略
- 持久化的方式: 1、把它 的投递模式(delicery mode)选项设置为2 2、发不到持久化的交换器 3、到达持久化的队列。(服务器会将持久性的消息写入到持久性日志中)
5、使用Rabbitmq的大致流程
- 连接Rabbitmq
- 获取信道
- 声明交换器
- 声明队列
- 队列和交换器绑定
- 消费消息
- 关闭信道
- 关闭连接
RabbitMq是运行在Erlang上的
1、启动结点 ./sbin/rabbitmq -server
2、关闭结点 ./sbin/rabbitmqctl stop 只关闭rabbitmq ./rabbitmqctl stop_app
3、Rabbitmq日志:LOG_BASE = /var/log/rabbitmq
4、默认控制台地址:http://localhost:15672/#/
5、默认账号密码:guest guest
会创建两个日志文件RABBITMQ_NODENAME-sasl.log 和RABBITMQ_NODENAME.log
文章参考书籍:《Rabbimq实战 高效部署分布式消息队列》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。