一、理论
1、演变
2、同类技术对比
3、为什么选择rabbitMQ
- 生态圈
2. 异步
3.流量削峰问题
RabbitMQ理论
消息队列
消息队列的好处
- 解耦
- 异步
- 削峰
- 广播
消息队列的坏处
- 成本问题
- 一致性问题
- 生产者不需要从消费者获取反馈
AMOP
Advanced Message Queuing Protocol 高级消息队列协议
作用在:应用层协议
功能: 消费和接收方遵守协议实现异步通信
协议内容:约定消息的格式和工作方式
RabbitMQ
结构:队列queue
实现:AMQP协议
语言:Erlang
模型结构
专业术语解释
Producer: 生产者,投递消息
Consumer:消费者,接受消息的一方,并不知道谁是生产者
Broker服务节点
Broker:rabbitmq服务器
VirtualHost虚拟消息服务器
VirtualHost: 每个VirtualHost相等于一个独立的Rabbitmq服务器,每个VirtualHost之间是相互隔离的
Exchange交换机(X)
由交换机将消息路由到一个或者多个队列中
Exchange类型
Binding
绑定: 通过绑定将交换机与队列关联起来---绑定键(BindingKey)
RoutingKey
路由键:生产者将消息发给交换器的时候,指定一个RoutingKey, 用来指定这个消息的路由规则,它决定了消息流向哪里
RoutingKey 和 Bingkey
当BindingKey和RoutingKey相匹配的时候,消息会被路由到对应的队列中
交换机:投递包裹的邮箱
RoutingKey:填写包裹的地址
BindingKey:包裹的目的地
填写包裹的地址必须与包裹的目的地一致才可以被送到目的地
Connection和Channel
当BindingKey和RoutingKey相匹配的时候,消息会被路由到对应的队列中
组合起来再看
RabbitMQ控制台
消费模式
Push && Pull
Push模式: broker 主动推送消息给消费者
Pull 模式: 即消费者主动从broker中拉取消息
Push:轮询->注册监听器MessageListener-得到消息后唤醒MessageListener的ConsumerMessage()来消费,延迟小
Push两种 继承DefaultConsumer 或者使用Spring AMQP的SimpleMessageListenerContainer
Pull : 延迟长
二、应用
1、连接RabbitMQ
2、声明交换器
Connection connection = getConnection();
channel = connection.createChannel();
channel.exchangeDeclare(exchangeName(), "topic", true);
2、1 声明交换器参数
exchange:交换器名称
Type:交换器类型
Durable:设置是否持久化true(持久化到磁盘)
autoDelete:是否自动删除交换机(满足队列与交换器无绑定)
Internal:内置(交换器A路由到交换器B)
Argument:其他结构化参数(后面会用到)
3、发送消息
channel.basicPublish(exchangeName(),routingKey,MessageProperties.PERSISTENT_BASIC, message.getBytes());
4、声明队列
channel.queueDeclare(queueName, true, false, false, null);
4、1 声明队列参数
queue:队列的名称
Durable:设置是否持久化true(持久化到磁盘)
autoDelete:是否自动删除交换机(满足队列与交换器无绑定)
Argument:其他结构化参数(后面会用到)
5、队列和交换机绑定
channel.queueBind(queueName, exchangeName(), routingKey);
5、1 参数
queue:队列的名称
exchange:交换器名称
routingKey:用来绑定队列和交换器的路由键
Argument:定义绑定的一些参数
6、Consumer消费
第一种方法
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
}
第二种方法
rabbitTemplate.convertAndSend(routing,auditJournalEntity);
MessageListener
三、实际应用
审计日志
四、改进
五、特性