消息队列 MQ的介绍
MQ全称为 Message Queue 消息队列是应用程序和应用程序之间通讯的方法
- 应用解耦
- 异步处理
- 流量消峰 (高峰堆积消息,峰后继续处理消息)
- 日志处理 (分布式日志,kafka)
MQ是消息的通信模型,实现MQ的大致有两种主流方式: AMQP,JMS
- AMQP是网络底层定义的协议
- JMS即java消息服务应用程序接口,是一个java平台中关于面向消息的Api
RabbitMQ
使用Erlang编写的一个开源的,基于AMQP协议实现的消息队列
角色说明
- 超级管理员 administratot 可登录管理控制台,可查看所有信息,并可以对用户,策略进行操作
- 监控着 monitoring 可登录管理控制台,同时查看rabbitmg节点的相关信息
- 策略制定者 policymaker 可登录管理控制台,无法看到节点信息,也无法对策略进行管理
- 普通管理者 management 无法看到节点信息,也无法对策略进行管理
- 其它 无法登录管理控制台,通常就是普通的生产者和消费者
//创建连接工厂对象 factory-new ConnectionFactory()
ConnectionFactory factory = new ConnectionFactory();
//设置RabbitMQ服务主机地址,默认localhost-factory.setHost("localhost")
factory.setHost("localhost");
//设置RabbitMq服务端口,默认 factory.setPort("5672)
factory.setPort(5672);
//设置虚拟主机名字,默认factory.setVirtualHost("szitheima")
factory.setVirtualHost("szitheima");
//设置用户连接的账号和密码
factory.setUsername("admin");
factory.setPassword("admin");
//创建连接 connection=factory.newConnection()
Connection connection = factory.newConnection();
//创建频道
Channel channel = connection.createChannel();
//声明队列 名称,是否持久化,是否独占本连接,是否自动删除,附加参数
channel.queueDeclare("simple_queue1", true, false, false, null);
//创建消息
String message = "hello 欢迎来到深圳";
//消息发送 路由key [简单模式可以传递队列名称] 消息其它的属性,消息内容
channel.basicPublish("", "simple_queue1", null, message.getBytes("utf-8"));
//关闭资源
channel.close();
connection.close();
//创建消费者
Consumer callback=new DefaultConsumer(channel){
public void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body) throws UnsupportedEncodingException {
//路由的key
String routingKey = envelope.getRoutingKey();
//获取交换机信息
String exchange = envelope.getExchange();
//获取消息ID
long deliveryTag = envelope.getDeliveryTag();
//获取消息信息
String message=new String(body,"utf-8");
System.out.println(
"rotingKey:"+routingKey+
"exchange:"+exchange+
"deliveryTag:"+deliveryTag+
"message"+message);
}
};
//消息消费 队列名称, 是否自动应答,消息收到后回调
channel.basicConsume("simple_queue",true,callback);
工作队列模式
生产者–消息队列–消费者1,消费者2
- 生产者: 也就是要发送消息的程序
- 消费者: 消息的接收者,会一直等消息的到来
- Queue: 消息队列 生产者和消费者中间有个缓冲区,生产者向其中投放信息,消费者从其中取出消息
发布订阅模式
生产者-- 交换机–被交换机绑定的消息队列-- 消费者1,消费者2
- 生产者 不再发送到队列中,而是发给交换机
- 消费者 消息的接收者,一直等待消息到来
- Queue 消息队列,接收消息,缓存消息
- Echange 交换机 一方面,接收生产者发送的消息,另一方面,知道如何处理消息,例如递交给某个特别队列,递交给所有队列,或是将消息丢弃,到底如何操作取决于Echange的类型
Echange常见的三种类型
- Fanout 广播 将消息交给所有绑定到交换机的队列
- Direct 定向 把消息交给符合指定routing key的队列
- Topic 通配符 把消息交给符合routing pattern(路由模式) 的队列
注意: Echange(交换机) 只负责转发消息, 不具备存储消息的能力.因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失,一定要将消息队列绑定到交换机上才能进行消费