RabbitMQ

1)MQ的诞生
    (1)以前的软件那都是点对点的.
    (2)有没有软件是:专门用于通信的呢?就像一个Bus,于是开发了TIB,用于金融领域。
        主要实现了生产和消费者,发布订阅模型。
    
2)JMS的规范。 缺点是与Java语言绑定的。

3)AMQP: 跨语言的。才真正促进了MQ的发展。 
     07年Rabbit公司,用ErLang开发了。
      淘宝在使用RocketMQ之前,也是RabbitMQ。
      是应用层的协议。

4)MQ的本质
    (1)是一个独立运行的服务。
    (2)队列。
    (3)发布订阅的模型。
           邮局和邮差。 存储和转发消息的。

5)  
    (1)跨进程    
    (2)持久化机制。 

6)为什么要用MQ?用在什么业务场景中的。
    (1)实现异步的通信。
        调用发出之后,直接返回,通过回调函数,等待通知。
            如:跨行转账,实时模式和非实时模式。设计到的机构非常的多。
            
        MQ很多有低延迟。
        
        提现,实际需要一段时间。
        
        支付宝提示: 现在支付高峰,需要等待60s。
        
    (2)解耦
          以“退货”为例子
              订单系统    库存系统   支付系统   通知系统
              
                 库存没有退还,不影响支付系统退还本金。 我们需要实现异步的话。
                 
                 引入MQ后: 
                    订单系统--》消息队列--》  各个子系统监听队列拿到消息。不关心消费者在网络上哪个位置。
                        好处: 
                            迁移了系统,我这边没有任何的改动。
                            不关心消费者是否消费成功,只关心自己发送了消息到队列中。实现解耦。
                            
                            
        减少应用之间解耦。
                            
    (3)实现了流量削峰。
            如果要堆硬件,造成浪费。
            如果是:限流,那么就会丢失订单。
            
            使用MQ,由于队列的特性。我们可以先把流量承接下来,转换成,MQ的消息,
                业务层根据自己的消费速率。就跟:排队买票一样,不会因为购票人多,就崩溃。
                
                 保护了应用和数据库。
                 
7)思考:如果把传统的RPC通信改为MQ的通信,是否会有问题?
    (1)因为需要独立运行一个服务。 那么如果系统波动,那么可用性降低了。
    (2)系统复杂性提高了。需要理解MQ的概念。
    (3)消息丢失、重复消费。 带来数据一致性的问题。
                
8)MQ的特性:
    (1)高可靠
        RabbitMQ消息确认,送达。
        
    (2)灵活的路由
        交换机的概念。
        
    (3)支持多客户端
    
    (4)集群与扩展性
            天生支持集群。 节点。
    
    (5)高可用队列
            镜像队列的集群。
    
    (6)权限管理
            虚拟机。 VHost。
    
    (7)插件系统
    
    (8)可靠性
        ManagerMent
    
    (9)与Spring集成
        AMQP   SpringAMQP
        
9)5672端口。
  Broker: 中介。 存储转发,或者叫代理。
  Connection: 信道和消息通道。Channel接口。 虚拟的信道。
  Queue:
    Mnesia的数据库。
    push:到达了队列,就直接推送。
    pull:主动获取时,才能拿到。  难道要while? 事件。
    RabbitMQ不会直接发送到Queue,而是到Exchange。 是一个绑定列表。查找匹配关系的。
        Routing key:路由键。可以路由到多个队列上。一个队列可以投递到多个消费者身上。多对多。
        
10)交换机类型
   (1)Direct:直连类型。
        binding key.     
        routing key。
        
        使用:
            channel.basicPublic("MY_DIRECT_EXCHANGE", "spring", "msg 1")
            
        人员入职。
        
   (2)Top: 主题类型。 
        #   0个或者多个单词。
        *   不多不少1个单词。
        
        junior.#   以junior开头。
        netty.*
        *.jvm      前面一个单词,且以jvm结尾
        
        
        使用:
            channel.basicPublic("MY_DIRECT_EXCHANGE", "junior.fid.jlkj", "msg 2")
            channel.basicPublic("MY_DIRECT_EXCHANGE", "junior.jvm", "msg 3")
            
        有消息过滤,只关注。
            
    (3)Fanout:广播类型的交换机。
        不需要路由键。所有队列都会拿到消息副本。
        
        使用:
            channel.basicPublic("MY_DIRECT_EXCHANGE", "", "msg 4")
        
        有10多个系统都要关注产品系统变动。
        
11)先安装ErLang 
        
12)VHost
    
13)TTL
     (1)队列中的:x-message-ttl 
     (2)单条消息

14)死信队列     
    (1)消息变为死信后,就跑到死信队列。
    
    (2)何时变为死信队列:
            消息被消费者拒绝。
            队列中的消息过期。
            到达了队列最大长度(最大的长度、最大长度)。
            
    (3)死信队列的作用:
            未付款的订单,在15min后关闭。
            
            数据库+定时任务扫描。
            
            3.5.7
            
            
            延迟插件比死信队列的好处:
                不同梯度消息投递的话,死信队列过多。而且准确性不是那么高。
                
            消息可以一直死下去。
            
15)Spring集成AMQP时,做了什么?
    Spring-rabbit的依赖。
    Amqp-client-3.3.4.jar
    x
    x
    
    简化了对象的管理。不然需要各种对象。
    Spring后,通过Bean标签来管理。
    发送和接收,需要调用各种APi实现收发。
    AmqpTemplate:
        RabbitTemplate实现。
    

16)Spring AMQP包括什么?

17)SpringBoot的starter: 有自动配置的功能。
                
18)可靠性投递: 重复了怎么办? 漏了丢失了怎么办?
        
19)交换机: 绑定列表。
   队列: 存储消息。        
        
20)ack应答机制。        
        
21)spring cloud stream: 对MQ的进一步封装。

===================================可靠性投递=================================
1)消息可靠性投递:
    发送了,但是没有消费,怎么办。
    
    交换机路由到队列。
    
    消息存储这个环节。
    
    一条条的投递到消费者,怎么知道消费者接收了消息并且删除呢?
    
  存储:
  
  转发:


   注意:可靠性和消息速率肯定是无法做到都最高的。

2)集群:
    目的:高可用,负载;
    
    如何支持集群? 普通集群,镜像队列。
        disc: 磁盘。 
        RAM:内存。
        
    集群节点类型。
    
    
3)生产速度过快,消费不动的时候~从客户端(几条不确认,服务器就不再发过来)
    和服务端做消息水位控制。
    
4)SpringBoot采用注解,摒弃SSM中XML配置的方式。    

5)
  方式1:事务
    channel.txSelect()
    channel.txCommit();
    channel.txRoolback();
  
  方式2:确认  
    channel.confirmSelect();
    channel.waitFirConfirms()
        
    还支持批量确认。
  
  方式3:异步确认的机制。
        confirm--》callback
        
6)路由保证    
    mandatory = true + ReturnListener。
    指定交换机的备份交换机。
        
7)设计一个MQ?
    存储
    转发
    协议AMQP,推拉?

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值