- 异步通信和同步通信的优缺点:
- 同步:优点:时效性强,可以立即得到结果 缺点: 耦合度度高,吞吐量小 执行效率低,以及有级联问题
异步:优点: 可以解耦,提高吞吐量,性能好,调用没有阻塞,流量削峰 可以故障隔离 缺点:不能及时得到结果 且结构复杂 不好管理,依赖于broker的可用性和性能
- 同步:优点:时效性强,可以立即得到结果 缺点: 耦合度度高,吞吐量小 执行效率低,以及有级联问题
MQ技术对比: | | RabbitMQ | ActiveMQ | RocketMQ | Kafka | | —- | —- | —- | —- | —- | | 公司/社区 | Rabbit | Apache | 阿里 | Apache | | 开发语言 | Erlang | Java | Java | Scala&Java | | 协议支持 | AMQP,XMPP,SMTP,STOMP | OpenWire,STOMP,REST,XMPP,AMQP | 自定义协议 | 自定义协议 | | 可用性 | 高 | 一般 | 高 | 高 | | 单机吞吐量 | 一般 | 差 | 高 | 非常高 | | 消息延迟 | 微秒级 | 毫秒级 | 毫秒级 | 毫秒以内 | | 消息可靠性 | 高 | 一般 | 高 | 一般 |
RabbitMQ性能好 , 开源 消息延迟微秒级 适合中小型公司使用,rocketMQ和kafka 适用于大数据的处理
追求可用性:Kafka、 RocketMQ 、RabbitMQ
追求可靠性:RabbitMQ、RocketMQ
追求吞吐能力:RocketMQ、Kafka
追求消息低延迟:RabbitMQ、KafkaRabbitMQ中的一些角色
- publisher 消息生产者
- consumer:消费者
- exchange:交换机
- queue:队列
- virtualHost:虚拟主机 隔离不同租户的exchange queue 和消息的隔离
RabbitMQ 消息模型:
- 基本消息队列(basicqueue),
- 工作消息队列(workqueue)
- 发布订阅(三种交换机类型):广播模式fonout ;l路由模式direct ,主题模式,topic
原生 API模式:(生产端)
- 创建连接工厂 ConnectionFanctory connect=new ConnectionFactory()
- 设置连接参数:connet.setHost()设置MQ 的IP地址
connect.setPort()设置MQ 的端口
connet.setVirtualHost(“/“)设置虚拟主机 一般使用默认的”/“
connet.setusername()用户
connet.setpassword()设置密码 - 创建连接 connnection connection=connet.newConnection()
- 获取信道 Chann channl =connection.createChannl()
- 声明队列 channel.queueDeclare(“队列名”,false,fasle,fasle,null);
- 发送消息:channel.basicpublish(“”,队列名,null,消息二进制)
- 释放资源 channel.close() connection.close()
原生 API模式:(消费端)
- 创建连接工厂new connectionFactory()
- 设置工厂连接参数…
- 通过工厂创建连接对象 newConnection()对象
- 获取信道 每一个connection 有许多个信道 connection .createChannel() 消息通过信道传输
- 声明队列 防止队列没有创建 channel.queueDeclare()
定阅消息:channel.basicConsum(queueName,Auotoask(true),new defaultConsumer(channel){
重写方法:handlerDelivery()
@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,<br /> AMQP.BasicProperties properties, byte[] body) throws IOException {<br /> // 5.处理消息<br /> String message = new String(body);<br /> System.out.println("接收到消息:【" + message + "】");})
springAMQP: AMQP是一套在应用程序之间传递消息的标准协议 和语言技术无关,更符合微服务中独立性的要求
- springAMQP是基于AMQP协议的一套API规范,spring-amqp是基础抽象,底层使用spring-rabbit来实现
springAMQP的三个功能:
自动声明队列 交换机及其绑定关系
基于注解的监听器模式,异步接收消息
封装了RabbitTemplate工具 用具发送消息- 消息发送 :在yml配置文件中配置MQ的连接地址:
spring:
- 消息发送 :在yml配置文件中配置MQ的连接地址:
rabbitmq:
host: 192.168.150.101 # 主机名
port: 5672 # 端口
virtual-host: / # 虚拟主机
username: itcast # 用户名
password: 123321 # 密码c. API: RabbitTemplate.convertAndSend(queueNanme,message);
d. 使用注解@RabbitListener()指定要监听的队列 在方法上使用 ;方法的参数就是接收到的消息 ,参数要和发送的消息类型保持一致一个队列可以被多个消费者监听消息 ,但是同一个消息只能被一个消费者消费 多个消费者消费同一个队列 ,默认是平均分配接收到的消息数量, 提前已经确定好的了数量 像发牌一样, 我们可以设置预取数量 可以实现性能好的消费者多接收消息(能则多劳)
@RabbitListener()详解: 参数:bingdngs=(@queueBinding(@queue=(queueName), exchange=@exchange(交换机名,交换机类型),key={})) key表示routingkey 路由key 指定交换机和queue之间的绑定关系 fanout类型交换机可以不指定路由key 但是 direct 和topic 必须指定路由key
消息转换器:Rabbit默认的转化器是JDK二进制的序列化数据 占用空间比较大 可读性差,需要替换为 Jackson2JsonMessageConverter() 在配置类中声明
@bean
public MessageConverter conveter(){
return new Jackson2JsonMessageConverter();
}
