美文网首页
80 rabbitmq

80 rabbitmq

作者: 滔滔逐浪 | 来源:发表于2021-01-24 15:31 被阅读0次

    Rabbitmq 基本介绍

    RabbitMQ是基本实现了赶集消息队列协议(AMQP)的开源消息代理软件(也称作面向消息的中间件),RabbitMQ服务器是用 Erlang语言编写的
    RabitMQ官方网站:

    https://www.rabbitmq.com/

    6种工作模式:
    1,点对点(简单)的队列;
    2,工作(公平性)队列;
    3,发布式订阅模式;
    4,路由模式Routing;
    5,通配符模式;Topics;
    6,RPC

    Rabitmq 管理平台中心
    Rabbitmq 管理平台地址为: http://127.0.0.1:15672
    默认账号: guest/guest 用户可以自己创建账号

    Virtual Hosts
    像mysql 有数据库的概念并且可以指定用户对库和表等操作的权限,Rabbitmq也有类似的权限管理。在RabbitMQ 中可以虚拟消息服务器VirtualHost,每个VirtualHost 相当一个独立的RabbitMQ服务器。每个VirtualHost之间是相互隔离的。exchange.queue.message 不能互通。
    默认的端口15672:rabbitmq管理平台端口号
    默认的端口5672: rabbitmq消息中间内部通讯的端口
    默认的端口号25672 rabbitmq集群的端口号

    Rabbitmq常见名词:
    /Virtual Hosts --分类:
    /队列 存放我们的消息
    Exchange 分派我们消息在那个队列存放起来 类似于nginx

    15672---rabbitmq控制台管理平台 http协议
    25672rabbitmq 集群通信端口号
    Amqp 5672 rabbitmq内部通信的一个端口号

    快速入门RabbitMQ 简单队列;
    首先需要在RabbitMQ平台创建Virtual Hosts 和队列
    --订单队列
    --支付度列:

    1, 在Rabbitmq 平台创建一个队列
    2, 在编写生产者代码
    3,在编写消费者代码

    MQ如何保证消息不丢失:
    1.生产者角色:
    确保生产者投递消息到MQ服务器成功。
    ACk消息确认机制: 同步或者异步的形式
    方式一: confirms
    方式二: 事务消息:

    2,消费者角色:
    在rabbitmq中:
    必须要将消息消费成功后才会将该消息从mq服务器中移除。
    在kafka中:
    不管是消费成功还是消费失败: 消息都不会立刻移除。
    3,MQ服务器端:在默认情况下,都会对队列中的消息实现持久化,持久化到硬盘。

    RabitMQ工作队列
    默认的传统队列是为均摊消费,存在不公平性;如果每个消费者速度不一样的情况下,均摊消费是不公平的,应该是能者多劳。

    采用工作队列
    在通道中只需要设置basicQos为1即可,表示MQ服务器每次只会给消费者推送1条消息必须手动ack确认之后才会继续发送。
    channel.basicQos(1);
    RabbitMQ交换机类型

    Direct exchange(直连交换机)
    Fanout exchange(扇型交换机)
    Topic exchange(主题交换机)
    Headers exchange(头交换机)
    /Virtual Hosts---区分不同的团队
    ----队列 存放消息
    ----交换机 路由消息存放在那个队列中 类似于nginx
    ---路由key 分发规则

    RabitMQ Fanout 发布订阅
    生产者发送一条消息,经过交换机转发到多个不同的队列,多个不同的队列就多个不同的消费者。

    MQ架构的设计原理:
    什么是消息中间件:
    消息中间件基于队列模型实现异步/同步传输数据‘

    作用: 可以实现支撑高并发,异步解耦,流量消峰,降低解耦度。
    传统的http请求存在哪些缺点:
    1,Http请求基于请求与响应的模型,在高并发的情况下,客户端发送大量的请求达到服务器端有可能会导致我们服务器端处理请求堆积

    2, Tomcat 服务器处理每个请求都有自己独立的线程,如果超过最大线程数会将请求缓存到队列中,如果请求堆积过多的情况下,有可能会导致tomcat服务器奔溃的问题。
    所以一般都会在nginx 入口实现限流,整合服务保护框架。


    image.png

    3,http请求处理业务逻辑如果以比较耗时的情况下,容易造成客户端一直等待,阻塞等待,过程中会导致客户端超时发生重试策略。有可能会引发幂等性问题。

    注意事项: 接口是为http协议的情况下,最好不要处理比价耗时的业务逻辑,耗时的业务逻辑应该单独交给多线程或者mq处理。
    mq应用场景有哪些?
    1,异步发送短信
    2,异步发送新人优惠券
    3,处理一些比较耗时的操作。

    为什么使用mq
    可以实现支撑高并发,异步解耦,流量消峰,降低耦合度。

    同步发送http请求。


    image.png

    客户端发送请求到达服务器端,服务器端实现会员注册业务逻辑,
    1.insertMember() --插入会员数据 1s
    2.sendSms()----发送登陆短信提醒 3s
    3.sendCoupons()----发送新人优惠券 3s
    总共响应需要6s时间,可能会导致客户端阻塞6s时间,对用户体验
    不是很好。

    多线程处理业务逻辑;


    image.png

    用户向数据库中插入一条数据之后,在单独开启一个线程异步发送短信和优惠操作。
    优点: 适合于小项目 ,实现异步。
    缺点: 有可能会消耗服务器cpu资源。
    mq处理业务逻辑

    image.png

    先向数据库中插入一条会员数据,然后再向MQ中投递一个消息。MQ服务器端在将消息推送给消费者异步解耦处理发送短信和优惠券
    MQ与多线程之间的区别:
    MQ可以实现异步/解耦/流量消峰问题
    多线程也可以实现异步,但是消耗到cpuziyaun ,没有实现解耦。

    MQ消息中间件名词:
    Producer 生产者: 投递消息到MQ服务器端
    Consumer: 消费者:从MQ服务器端获取消息处理业务逻辑。
    Broker MQ 服务器
    Topic 主题: 分类业务逻辑发送短信主题,发送优惠券主题:
    Queue 存放消息模型队列, 先进先出, 后进后出原则,数组/链表
    Message 生产者投递消息报文:json


    image.png

    Rabbitmq 如何保证消息不丢失:
    MQ如何保证消息不丢失:
    1,生产角色
    确保生产者投递消息到MQ服务器端成功;
    ACk消息确认机制
    同步或者异步的形式;
    2,消费者角色:
    3,MQ 服务器端 在默认情况下 都会对队列中的消息实现持久化到硬盘:

    相关文章

      网友评论

          本文标题:80 rabbitmq

          本文链接:https://www.haomeiwen.com/subject/qnsmzktx.html